美文网首页
2018-06-03

2018-06-03

作者: degrty | 来源:发表于2018-06-03 20:02 被阅读15次

    安卓利用ShareSdk实现第三方登陆与分享

    就当下而言,三方登陆这个功能对于一个app来说太常见了,所以今天就来介绍下如何实现的


    5.jpg 6.jpg

    我们这里主要介绍利用Mob平台实现QQ 、微博 、微信 的登陆与内容分享功能

    Mob的官网:http://mob.com/

    步骤一

    我们需要去QQ 微博 微信的开发者平台先注册自己的应用,下面是mob官网提供的各个平台注册流程的文档
    http://wiki.mob.com/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%B9%B3%E5%8F%B0%E6%B3%A8%E5%86%8C%E6%B5%81%E7%A8%8B/

    注意 QQ和微博都可以先使用测试号测试,微信审核需要7天

    步骤二

    注册完成后,我们将会在每一个平台获得自己应用的appId 和appSecret,这在后面配置的时候会用到
    接下来,打开androidstdio 开始接入ShareSdk,具体步骤如下(在集成前需要先在mob官网注册个人账号)
    http://wiki.mob.com/sdk-share-android-3-0-0/

    步骤三

    在build.gradle(app)初始化配置

    MobSDK {
        appKey "你的ShareSDK AppKey"
        appSecret "你的ShareSDK AppSecret"
        ShareSDK {
            ShareSDK {
                devInfo {
                    SinaWeibo {
                        appKey "你的新浪微博 AppKey"
                        appSecret "你的新浪微博 AppSecret"
                        callbackUri "http://www.sharesdk.cn"
                        shareByAppClient true
                        enable true
                    }
                    QQ {
                        appId "你的腾讯 AppKey"
                        appSecret "你的腾讯 AppSecret"
                        bypassApproval false
                        shareByAppClient true
                        enable true
                    }
                    QZone {
                        appId "QQ空间与QQ相同"
                        appSecret "如上"
                        bypassApproval true
                        shareByAppClient true
                        enable true
                    }
                    Wechat {
                        appId "你的微信 AppKey"
                        appSecret "你的微信 AppSecret"
                        bypassApproval false
                        shareByAppClient true
                        enable true
                    }
                    WechatMoments {
                        appId " 朋友圈与微信相同"
                        appSecret "如上"
                        bypassApproval false
                        shareByAppClient true
                        enable true
                    }
                }
            }
        }
    
    }
    

    配置AndroidManifest

    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <!-- 蓝牙分享所需的权限 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    

    添加ShareSDK必要的活动:

       <activity
                android:name="com.mob.tools.MobUIShell"
                android:theme="@android:style/Theme.Translucent.NoTitleBar"
                android:configChanges="keyboardHidden|orientation|screenSize"
                android:windowSoftInputMode="stateHidden|adjustResize">
                <intent-filter>
                    <!-- ※这里需要将1105785901改成你在腾讯申请后得到的AppId-->
                    <data android:scheme="tencent1105785901" />
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
    
                <!-- 调用新浪原生SDK,需要注册的回调activity -->
                <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:screenOrientation="portrait"
                android:theme="@android:style/Theme.Translucent.NoTitleBar" />
    
    微信那边需要注意一下:我们要在 包名.wxapi.WXEntryActivity 此路径下创建一个名为WXEntryActivity.java的文件,这个文件主要负责微信客户端回调activity。
    /*
     * 官网地站:http://www.mob.com
     * 技术支持QQ: 4006852216
     * 官方微信:ShareSDK   (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
     *
     * Copyright (c) 2013年 mob.com. All rights reserved.
     */
    
    package com.donkor.demo.mobsharesdk.wxapi;
    
    import android.content.Intent;
    import android.widget.Toast;
    import cn.sharesdk.wechat.utils.WXAppExtendObject;
    import cn.sharesdk.wechat.utils.WXMediaMessage;
    import cn.sharesdk.wechat.utils.WechatHandlerActivity;
    
    /** 微信客户端回调activity示例 */
    public class WXEntryActivity extends WechatHandlerActivity {
    
        /**
         * 处理微信发出的向第三方应用请求app message
         * <p>
         * 在微信客户端中的聊天页面有“添加工具”,可以将本应用的图标添加到其中
         * 此后点击图标,下面的代码会被执行。Demo仅仅只是打开自己而已,但你可
         * 做点其他的事情,包括根本不打开任何页面
         */
        public void onGetMessageFromWXReq(WXMediaMessage msg) {
            if (msg != null) {
                Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName());
                startActivity(iLaunchMyself);
            }
        }
    
        /**
         * 处理微信向第三方应用发起的消息
         * <p>
         * 此处用来接收从微信发送过来的消息,比方说本demo在wechatpage里面分享
         * 应用时可以不分享应用文件,而分享一段应用的自定义信息。接受方的微信
         * 客户端会通过这个方法,将这个信息发送回接收方手机上的本demo中,当作
         * 回调。
         * <p>
         * 本Demo只是将信息展示出来,但你可做点其他的事情,而不仅仅只是Toast
         */
        public void onShowMessageFromWXReq(WXMediaMessage msg) {
            if (msg != null && msg.mediaObject != null
                    && (msg.mediaObject instanceof WXAppExtendObject)) {
                WXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject;
                Toast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    步骤四

    配置完成后,我们就会进行调用
    (1)登陆调用

         case R.id.login_im_qq:
                 // qq登录
                 Platform qq = ShareSDK.getPlatform(QQ.NAME);
                 authorize(qq);
                 break;
             case R.id.login_im_sina:
                 // 微博登录
                 Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME);
                 authorize(weibo);
                 break;
             case R.id.login_im_weixin:
                 // 微信登录
                 Platform wechat = ShareSDK.getPlatform(Wechat.NAME);
                 authorize(wechat);
                 break;
    
      private void authorize(Platform plat) {
         if (plat == null) {
             return;
         }
         if (plat.isAuthValid()) {
             plat.removeAccount(true);
         }
         //设置监听事件
         plat.setPlatformActionListener(LoginActivity.this);
         //true不使用SSO授权,false使用SSO授权
         plat.SSOSetting(false);
         //要功能,不要数据
    //     plat.authorize();
         //要数据,不要功能
        plat.showUser(null);
     }
    

    注意 plat.authorize()和 plat.showUser(null)要理解含义,mob官网文档是有解释的

    http://wiki.mob.com/%E7%AC%AC%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95/

    activity继承接口PlatformActionListener,并重写onError onComplete onCancel 三种方法

     @Override
        public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
            
            //授权成功并打印不同平台返回的用户信息
            Iterator ite =hashMap.entrySet().iterator();
            while (ite.hasNext()) {
                Map.Entry entry = (Map.Entry)ite.next();
                Object key = entry.getKey();
                Object value = entry.getValue();
                System.out.println(key+": "+value);
            }
    
        }
    
        @Override
        public void onError(Platform platform, int i, Throwable throwable) {
            //授权失败
            platform.removeAccount(true);
        }
    
        @Override
        public void onCancel(Platform platform, int action) {
          //取消授权
        }
    

    注意 每个平台返回的个人数据都是不同的,QQ平台返回的数据中不包括qq号

    (2)分享调用
    分享调用,我使用的是Mob的oneshare
    工具类ShareSDKUtil:

    public class ShareSDKUtil {
      private static String type="";
    
      public static void  showShare(Context context,String title,String content,String ImageUrl,String TitleUrl,String type) {
          OnekeyShare oks = new OnekeyShare();
          //网络图片的url
          oks.setImageUrl(ImageUrl);
          //标题链接
          oks.setTitleUrl(TitleUrl);
          //内容
          oks.setText(content);
          //标题
          oks.setTitle(title);
          oks.setPlatform(type);
          oks.setCallback(mPlatformActionListener);
          oks.show(context);
      }
    
    
    
      public static PlatformActionListener mPlatformActionListener = new PlatformActionListener() {
          @Override
          public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
              if(type.equals("login")){
                  Log.e("onComplete","登录成功");
                  Log.e("openid",platform.getDb().getUserId());//拿到登录后的openid
                  Log.e("username",platform.getDb().getUserName());//拿到登录用户的昵称
              }else{
                  Log.e("onComplete","分享成功");
              }
          }
          @Override
          public void onError(Platform platform, int i, Throwable throwable) {
              Log.e("onError",throwable.toString()+"");
              if(type.equals("login")){
                  Log.e("onError","登录失败"+throwable.toString());
              }else{
                  Log.e("onError","分享失败"+throwable.toString());
              }
          }
          @Override
          public void onCancel(Platform platform, int i) {
              if(type.equals("login")){
                  Log.e("onCancel","登录取消");
              }else{
                  Log.e("onCancel","分享取消");
              }
          }
      };
    }
    

    具体的调用

     public void onClick(View v) {
          switch (v.getId()){
              case  R.id.my_snackbar_qqshare:
                  ShareSDKUtil.showShare(getContext(),"标题","内容",imageUrl,"ttp://www.baidu.com", QQ.NAME);
                  break;
              case  R.id.my_snackbar_zoneshare:
                  ShareSDKUtil.showShare(getContext(),"标题","内容",imageUrl,"ttp://www.baidu.com", QZone.NAME);
                  break;
              case  R.id.my_snackbar_wechatshare:
                  //Wechat.NAME分享给好友
                  ShareSDKUtil.showShare(getContext(),"标题","内容",imageUrl,"ttp://www.baidu.com", WechatMoments.NAME);
    
                  break;
              case  R.id.my_snackbar_sinashare:
                  ShareSDKUtil.showShare(getContext(),"标题","内容",imageUrl,"ttp://www.baidu.com", SinaWeibo.NAME);
                  break;
          }
      }
    

    以上就是如何三方调用的所有代码了,如有帮助请点个赞吧!!!
    如有问题,欢迎留言讨论!!!

    以上代码参考了

    https://www.jianshu.com/p/d0183619e525
    https://blog.csdn.net/donkor_/article/details/53422025

    相关文章

      网友评论

          本文标题:2018-06-03

          本文链接:https://www.haomeiwen.com/subject/rwqssftx.html