Android 微信分享/登录(友盟)

第三方登录分享估计是最常做的功能了现在
这里详细说下友盟的社会化分享功能(这里主要讲微信的登录和分享)

<1>获取友盟平台的Appkey
首先申请个友盟账号,登录后进入我的产品


image.png

进入之后找到应用列表,添加一个应用,获取到Appkey


image.png

<2>集成Android Studio
友盟SDK下载:(https://developer.umeng.com/sdk)

image.png

选择需要的下载,微信QQ假如只做分享和登录,那么精简版就可以了

下载好后有几个文件夹


image.png

我的话选了这几个添加到项目:


image.png

添加回调Activity, 微信:[图片上传中...(image.png-cbc6cf-1550908681362-0)]
在包名目录下创建wxapi文件夹,新建一个名为WXEntryActivity的activity继承WXCallbackActivity

image.png

配置Android Manifest XML,sdk中需要的Activity(这个的话最好把友盟官方文档上有的全部copy下来)

<!-- 友盟分享/登录 -->
        <!-- 新浪 不需要的可以不添加-->
        <activity
            android:name="com.umeng.socialize.media.WBShareCallBackActivity"
            android:configChanges="keyboardHidden|orientation"
            android:exported="false"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <activity
            android:name="com.sina.weibo.sdk.web.WeiboSdkWebActivity"
            android:configChanges="keyboardHidden|orientation"
            android:exported="false"
            android:windowSoftInputMode="adjustResize" />
        <activity
            android:name="com.sina.weibo.sdk.share.WbShareTransActivity"
            android:launchMode="singleTask"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">
            <intent-filter>
                <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />

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

        <!-- 微信 -->
        <activity
            android:name=".wxapi.WXEntryActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

        <!-- 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" />

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

权限添加,请在AndroidManifest中添加如下权限

 <!-- QQ -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
 <!-- 如果需要使用QQ纯图分享或避免其它平台纯图分享的时候图片不被压缩,可以增加以下权限: -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>   
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Android6.0权限适配(这个我之前写的文章有详细记录,可以参考:(//www.greatytc.com/p/3119376f134e))
请查看你的build.gradle文件,如果 targetSdkVersion小于或等于22,可以忽略这一步,如果大于或等于23,需要做权限的动态申请:

if(Build.VERSION.SDK_INT>=23){
                  String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CALL_PHONE,Manifest.permission.READ_LOGS,Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.SET_DEBUG_APP,Manifest.permission.SYSTEM_ALERT_WINDOW,Manifest.permission.GET_ACCOUNTS,Manifest.permission.WRITE_APN_SETTINGS};
                  ActivityCompat.requestPermissions(this,mPermissionList,123);
              }

//其中123是requestcode,可以根据这个code判断,用户是否同意了授权。如果没有同意,可以根据回调进行相应处理:
@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
}

<3>在微信开发者平台创建应用,获取到对应的AppID和AppSecret


image.png

在此之前,你需要为你的项目打包一个正式签名:
可参考:(//www.greatytc.com/p/4da94c5757f7)
用获取到的正式签名和项目包名去创建微信开放平台的应用才能保证唯一性

<4>最后就是使用了:
初始化设置,初始化需要在您的Application中调用我们的初始化接口:

@Override
    public void onCreate() {
        super.onCreate();
        UMConfigure.init(this,"5a12384aa40fa3551f0001d1"    //这个就是上面创建应用时拿到的Appkey
                ,"umeng",UMConfigure.DEVICE_TYPE_PHONE,"");

 }

//各个平台的配置,各个第三方平台都需要创建应用用于授权
{
    PlatformConfig.setWeixin("AppID", "AppSecret");   //把平台上对用获取到的AppID和AppSecret填入即可
    PlatformConfig.setQQZone("xxxx", "xxxx");            //这个是QQ空间的
    PlatformConfig.setSinaWeibo("xxxx", "xxxxx","http://sns.whalecloud.com");   //微博的
}

调用分享:
献上一个工具类

/**
     * 分享链接
     * WebUrl:分享链接
     * title:标题
     * description:描述
     * description:描述
     * imageUrl:网络缩略图(其实就是分享过去的一个app logo标识)
     * imageID:本地缩略图(其实就是分享过去的一个app logo标识)
     * platform:分享到哪里
     */
public class ShareUtils {

    private static Dialog mWeiboDialog;

    /**
     * 分享链接
     */
    public static void shareWeb(final Activity activity, String WebUrl, String title,
                                String description, String imageUrl, int imageID, SHARE_MEDIA platform) {
        UMWeb web = new UMWeb(WebUrl);      //连接地址
        web.setTitle(title);                                      //标题
        web.setDescription(description);               //描述
        if (TextUtils.isEmpty(imageUrl)) {
            web.setThumb(new UMImage(activity, imageID));   //本地缩略图
        } else {
            web.setThumb(new UMImage(activity, imageUrl));  //网络缩略图
        }
        new ShareAction(activity)
                .setPlatform(platform)
                .withMedia(web)
                .setCallback(new UMShareListener() {
                    @Override
                    public void onStart(SHARE_MEDIA share_media) {
                        mWeiboDialog = WeiboDialogUtils.createLoadingDialog(activity, "正在跳转...");
                    }

                    @Override
                    public void onResult(final SHARE_MEDIA share_media) {
                        activity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if (share_media.name().equals("WEIXIN_FAVORITE")) {
                                    Toast.makeText(activity, "收藏成功", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(activity, "分享成功", Toast.LENGTH_SHORT).show();
                                    EventBus.getDefault().postSticky(10000);
                                }
                            }
                        });
                        WeiboDialogUtils.closeDialog(mWeiboDialog);
                    }

                    @Override
                    public void onError(final SHARE_MEDIA share_media, final Throwable throwable) {
                        if (throwable != null) {
                            Log.d("throw", "throw:" + throwable.getMessage());
                        }
                        activity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(activity, "分享失败", Toast.LENGTH_SHORT).show();
                                EventBus.getDefault().postSticky(10001);
                            }
                        });
                        WeiboDialogUtils.closeDialog(mWeiboDialog);
                    }

                    @Override
                    public void onCancel(final SHARE_MEDIA share_media) { //share_media 平台
                        activity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(activity, "分享取消", Toast.LENGTH_SHORT).show();
                            }
                        });
                        WeiboDialogUtils.closeDialog(mWeiboDialog);
                    }
                })
                .share();

    }
}

如果是单张图片分享就纯粹一点:
这个也可以整合到工具类里面去,因为写的时间段不同,所以暂时没去整合

//shareUrl需要分享的图片链接,
final UMImage image = new UMImage(mContext, shareUrl);
        new ShareAction(this).setPlatform(SHARE_MEDIA.WEIXIN)  //分享到微信
                .withMedia(image)
                .setCallback(shareListener)
                .share();

/**
     * 分享回调函数 ================================================================================
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
    }

    private UMShareListener shareListener = new UMShareListener() {
        /**
         * @descrption 分享开始的回调 @param platform 平台类型
         */
        @Override
        public void onStart(SHARE_MEDIA platform) {
            //Toast.makeText(NationalQuizDetailsActivity.this, platform + "", Toast.LENGTH_SHORT).show();
        }

        /**
         * @descrption 分享成功的回调  @param platform 平台类型
         */
        @Override
        public void onResult(SHARE_MEDIA platform) {
            Toast.makeText(activity, "分享成功", Toast.LENGTH_SHORT).show();
        }

        /**
         * @descrption 分享失败的回调  @param platform 平台类型  @param t 错误原因
         */
        @Override
        public void onError(SHARE_MEDIA platform, Throwable t) {
            Toast.makeText(activity, "分享失败", Toast.LENGTH_SHORT).show();
        }

        /**
         * @descrption 分享取消的回调  @param platform 平台类型
         */
        @Override
        public void onCancel(SHARE_MEDIA platform) {
             Toast.makeText(activity, "分享取消", Toast.LENGTH_SHORT).show();
        }
    };

分享多张图片:
现在支持多图分享的平台有两个,一个是新浪微博一个是QQ空间,都是最多上传9张图片,新浪微博超过9张不会上传,QQ空间超过九张会上传QQ空间相册

   new ShareAction(ShareDetailActivity.this).withMedias(imagelocal,imagelocal,imagelocall)
                        .setPlatform(share_media)
                        .withText("hello")
                        .setCallback(shareListener).share();

<>然后这里补上登录

//授权登录
private void authorization(SHARE_MEDIA share_media) {
    UMShareAPI.get(this).getPlatformInfo(this, share_media, new UMAuthListener() {
        @Override
        public void onStart(SHARE_MEDIA share_media) {
            Log.d(TAG + "onStart >>>", "授权开始");
        }

        @Override
        public void onComplete(SHARE_MEDIA share_media, int i, Map<String, String> map) {
            Log.d(TAG + "onComplete >>>", "授权完成");

            /sdk是6.4.4的,但是获取值的时候用的是6.2以前的(access_token)才能获取到值,未知原因
            String uid = map.get("uid");
            String openid = map.get("openid");//微博没有
            String unionid = map.get("unionid");//微博没有
            String access_token = map.get("access_token");
            String refresh_token = map.get("refresh_token");//微信,qq,微博都没有获取到
            String expires_in = map.get("expires_in");
            String name = map.get("name");
            String gender = map.get("gender");
            String iconurl = map.get("iconurl");
             //然后拿到需要的参数请求做下一步操作,一般情况下后台会拿unionid作为账户唯一标识
             //头像和昵称,性别,是微信用户的信息
        }

        @Override
        public void onError(SHARE_MEDIA share_media, int i, Throwable throwable) {
            Toast.makeText(activity, "授权失败", Toast.LENGTH_SHORT).show();
            Log.d(TAG + "onError >>>", "授权失败");
        }

        @Override
        public void onCancel(SHARE_MEDIA share_media, int i) {
            Log.d(TAG + "onCancel >>>", "授权取消");
            Toast.makeText(activity, "授权取消", Toast.LENGTH_SHORT).show();
        }
    });
}

当然看官方文档也是没问题的,只是可能没那么详细:(https://developer.umeng.com/docs/66632/detail/66639)
最后谢谢参考!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容