Android源码分析之分享公共库框架

分享公共库使用说明文档(友盟6.4.5)

1 引入公共库

(1)在build.gradle添加仓库地址

(2)在build.gradle中引入’com.guan.codelibs:share:1.0.0’

(3)例子如下:

dependencies {
    compile 'com.guan.codelibs:share:1.0.0'
}

2 配置Android Manifest XML

(1)添加权限

(2)添加友盟appkey

(3)配置sdk中需要的Activity

(4)例子如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.fungo.share_example">

    <!-- (1)添加权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- (2)友盟APPKEY -->
        <meta-data
            android:name="UMENG_APPKEY"
            android:value="1234567890" />

        <!-- (3)QQ授权 -->
        <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <!-- scheme = "tencent" + QQ_id -->
                <data android:scheme="tencent123456" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

        <!-- (4)微信授权回调 -->
        <activity
            android:name=".wxapi.WXEntryActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

    </application>

</manifest>

3 配置友盟key及三方key

建立一个application文件,注意要在AndroidManifest文件中配置
在application文件中配置三方平台的appkey:
(例子只配置了微信、QQ/Qzone、新浪的三方appkey)

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        initUmengShare();
    }

    public void initUmengShare() {
        ShareConfig.isDebug(BuildConfig.DEBUG);// true 或者 false

        ShareConfig.setWeixin("APP_ID", "SECRET");
        ShareConfig.setSinaWeibo("APP_ID", "SECRET","http://sns.whalecloud.com");
        ShareConfig.setQQZone("APP_ID", "SECRET");
    }
}

4 签名配置

签名文件如果不加,部分平台的授权会受到影响。

(1)将文件夹中的签名文件放入到工程中

(2)在build.gradle增加签名文件的密码:

signingConfigs {
    config {
        keyAlias 'xxxxxx'
        keyPassword '123456'
        storeFile file('xxxxxx.keystore')
        storePassword '123456'
    }
 }

(3)然后在buildTypes中将这个signingConfigs配置进去

buildTypes {
    debug {
        signingConfig signingConfigs.config
    }
    release {

    }
}

5 微信回调Activity配置

在包名(org.fungo.share_example)目录下创建wxapi文件夹,新建一个名为WXEntryActivity的activity继承WXCallbackActivity

package org.fungo.share_example.wxapi;

import com.umeng.socialize.weixin.view.WXCallbackActivity;

public class WXEntryActivity extends WXCallbackActivity {

}

6 常用接口调用

(1)在使用QQ分享或者授权的Activity中需要添加:(必填)

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    ShareAPI.get().onActivityResult(this,requestCode, resultCode, data);
}

(2)内存泄露处理方法
在使用分享或者授权的Activity中,重写onDestory()方法(必填)

@Override
protected void onDestroy() {
    super.onDestroy();
    ShareAPI.get().release(this);
}

(3)判断客户端是否安装

ShareAPI.get().isInstall((Activity) context, SHARE_PLATFROM.WEIXIN)

(4)Debug模式开启方式,开启后打印错误信息
在初始化sdk的地方:Application中

ShareConfig.isDebug(BuildConfig.DEBUG);// true 或者 false

7 分享集成

a.定义分享控制器:

ShareController controller = new ShareController(this,SHARE_PLATFROM.QQ);

b.定义分享回调:

ShareHandlerCallback callback = new ShareHandlerCallback() {//回调监听器
            /**
             * 分享开始的回调
             * @param var1 平台类型
             */
            @Override
            public void startCall(String var1) {

            }

            /**
             * 分享成功的回调
             * @param var1 平台类型
             */
            @Override
            public void successCall(String var1) {
                Toast.makeText(MainActivity.this, "分享成功" + var1, Toast.LENGTH_SHORT).show();
            }

            /**
             * 分享失败的回调
             * @param var1 平台类型
             * @param var2 错误原因
             */
            @Override
            public void errorCall(String var1, String var2) {
                Toast.makeText(MainActivity.this, "分享失败" + var1 + var2, Toast.LENGTH_SHORT).show();
            }

            /**
             * 分享取消的回调
             * @param var1 平台类型
             */
            @Override
            public void cancelCall(String var1) {
                Toast.makeText(MainActivity.this, "取消分享" + var1, Toast.LENGTH_SHORT).show();
            }
        };

c.设置分享内容和调用share()分享:

(1)基本分享例子

public void share() {
    controller.withText("hello");//分享内容
    controller.setCallback(callback);//分享回调
    controller.share();// 分享
}

(2)分享文本

public void share() {
    controller.withText("hello");//分享内容
}

(3)分享图片

public void share() {
    //调用withMedia可以设置一个ShareImage,ShareImage的构建有如下几种形式
    ShareImage image = new ShareImage(this, "imageurl");//网络图片
    ShareImage image = new ShareImage(this, file);//本地文件
    ShareImage image = new ShareImage(this, R.drawable.xxx);//资源文件
    ShareImage image = new ShareImage(this, bitmap);//bitmap文件
    ShareImage image = new ShareImage(this, byte[]);//字节流

    //推荐使用网络图片和资源文件的方式,平台兼容性更高。对于部分平台,分享的图片需要设置缩略图,缩略图的设置规则为:
    ShareImage thumb =  new ShareImage(this, R.drawable.thumb);
    image.setThumb(thumb);

    //用户设置的图片大小最好不要超过250k,缩略图不要超过18k,如果超过1M会报出error,用户可以设置压缩的方式:
    image.setCompressStyle(ShareImage.CompressStyle.SCALE);//大小压缩,默认为大小压缩,适合普通很大的图
    image.setCompressStyle(ShareImage.CompressStyle.QUALITY);//质量压缩,适合长图的分享

    ShareController controller = new ShareController(this,SHARE_PLATFROM.QQ);
    controller.withText("hello");//分享内容
    controller.withMedia(image);//图片
}

(4)分享链接

public void share() {
    ShareWeb web = new ShareWeb(Defaultcontent.url);//跳转链接
    web.setTitle("This is music title");//标题
    web.setThumb(thumb);//缩略图
    web.setDescription("my description");//描述
    controller.withMedia(web);
}

(5)分享视频

public void share() {
    ShareVideo video = new ShareVideo("videourl");
    video.setTitle("This is music title");//标题
    video.setThumb(thumb);//缩略图
    video.setDescription("my description");//描述
    controller.withMedia(video);
}

(6)分享音乐

public void share() {
    ShareMusic music = new ShareMusic("musicurl");
    music.setTitle("This is music title");//标题
    music.setThumb(thumb);//缩略图
    music.setDescription("my description");//描述
    music.setmTargetUrl(Defaultcontent.url);//音乐的跳转链接
    controller.withMedia(music);
}

特别说明:播放链接是指在微信qq分享音乐,是可以在当前聊天界面播放的,要求这个musicurl(播放链接)必须要以.mp3等音乐格式结尾,
跳转链接是指点击linkcard之后进行跳转的链接。

(7)分享GIF
目前只有微信好友分享支持Emoji表情,其他平台暂不支持

public void share() {
    ShareEmoji emoji = new ShareEmoji(this, getSaveFile("/storage/emulated/0/loveshow/camera/crop/1503889044413.gif"));
    ShareImage thumb = new ShareImage(this, R.drawable.thumb);
    emoji.setThumb(thumb);
    shareController.withMedia(emoji);
}

public static File getSaveFile(String path) {
        File file = new File(path);
        return file;
}

(8)分享微信小程序
目前只有微信好友支持小程序分享,朋友圈,收藏及其他平台暂不支持:

public void share() {
    ShareMin min = new ShareMin(Defaultcontent.url);
    min.setTitle("This is music title");//标题
    min.setThumb(thumb);//缩略图
    min.setDescription("my description");//描述
    min.setPath("pages/page10007/xxxxxx");
    min.setUserName("xx_xxx");
    controller.withMedia(min);
}

8 获取用户资料授权

(1) 获取用户资料授权

AuthController controller = new AuthController(this, platform,
        new AuthHandlerCallback() {
            /**
             * 授权开始的回调
             * @param var1 平台类型
             */
            @Override
            public void startCall(SHARE_PLATFROM var1) {

            }

            /**
             * 授权成功的回调
             * @param var1 平台类型
             * @param var2 行为序号,开发者用不上
             * @param var3 错误原因
             */
            @Override
            public void successCall(SHARE_PLATFROM var1, int var2, Map var3) {
                Toast.makeText(MainActivity.this, "授权成功,获取用户信息...", Toast.LENGTH_SHORT).show();                      
            }

            /**
             * 授权失败的回调
             * @param var1 平台类型
             * @param var2 错误原因
             */
            @Override
            public void errorCall(SHARE_PLATFROM var1, int var2, Throwable var3) {

            }

            /**
             * 取消授权的回调
             * @param var1 平台类型
             * @param var2 行为序号,开发者用不上
             */
            @Override
            public void cancelCall(SHARE_PLATFROM var1, int var2) {

            }
    });

controller.getPlatformInfo();

登录成功后,第三方平台会将用户资料传回, 全部会在Map data中返回 ,由于各个平台对于用户资料的标识不同,
因此为了便于开发者使用,我们将一些常用的字段做了统一封装,开发者可以直接获取,不再需要对不同平台的不同字段名做转换。

(2) 第三方授权

AuthController controller = new AuthController(this, platform,
        new AuthHandlerCallback() {
        .........
}

controller.doOauthVerify();

猜你喜欢

转载自blog.csdn.net/chenliguan/article/details/79433014