Android学习之友盟开发这些坑

来源:互联网 发布:软件前端是什么 编辑:程序博客网 时间:2024/06/05 15:44

本文转自:http://blog.csdn.net/qq_16131393/article/details/50951349

相信大家很多人都用过友盟,为啥用友盟呢?是因为友盟功能齐全,而且免费,但是,友盟的坑也是不少的,今天借着工作经验给大家解析友盟开发中遇见的那些坑,希望能够让大家少走些坑,哈哈!

下载最新版本的SDK,解压,资源文件的导入,添加依赖这些我就不细说啊,这些都是最基本的,可以直接下载德莫,将demo中的资源文件等拷进去,避免错误!

第一:添加权限跟对应平台,一般为微信,朋友圈,QQ,微博

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.umeng.example"    android:versionCode="1"    android:versionName="1.0" >    <application        android:debuggable="true"        android:icon="@drawable/icon"        android:label="@string/app_name"        android:theme="@android:style/Theme.Black.NoTitleBar" >        <!-- ###################注册SDK使用的Activity###################### -->        <!--分享编辑页-->        <activity            android:name="com.umeng.socialize.view.ShareActivity"            android:configChanges="orientation|keyboard"            android:launchMode="singleTask"            android:noHistory="true"            android:theme="@style/Theme.UMDialog"            android:windowSoftInputMode="stateVisible|adjustResize" >        </activity>        <!-- ############ QQ空间和QQ SSO授权的Activity注册 ############ -->        <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" />                <!-- 100424468,如果你使用的公用账号,则不需要修改;否则修改成你在QQ开放平台申请的 APP ID-->                <data android:scheme="tencent100424468" />             </intent-filter>        </activity>        <activity android:name="com.tencent.connect.common.AssistActivity"            android:theme="@android:style/Theme.Translucent.NoTitleBar"            android:screenOrientation="portrait">        </activity>    <!-- ###################添加UmengAppkey###################### -->        <meta-data            android:name="UMENG_APPKEY"            android:value="xxxxxxxxxxxxxxxxxxxxxx" >        </meta-data>    </application>    <uses-sdk android:minSdkVersion="8" />    <!-- ###################声明SDK使用的相关权限###################### -->    <!-- 检测网络状态 -->    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />      <!-- 获取mac地址作为用户的备用唯一标识 -->    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />         <!-- 获取用户手机的IMEI,用来唯一的标识用户 -->    <uses-permission android:name="android.permission.READ_PHONE_STATE" />          <!-- 缓存资源优先存入SDcard -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <!-- 允许应用程序联网,以便向我们的服务器端发送数据 -->    <uses-permission android:name="android.permission.INTERNET" />    <!-- QQ、QQ空间所需权限 --><uses-permission android:name="android.permission.GET_TASKS" /></manifest>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

第三方登陆

private UMSocialService mController = UMServiceFactory.getUMSocialService("com.umeng.login");
  • 1
  • 1

初始化,添加各平台到SDK

    private void initUmeng() {        com.umeng.socialize.utils.Log.LOG = LogUtil.debug;        //设置新浪SSO handler        mController.getConfig().setSsoHandler(new SinaSsoHandler());        SinaSsoHandler sinaSsoHandler = new SinaSsoHandler(this);        sinaSsoHandler.addToSocialSDK();        //QQ,QQ空间        QZoneSsoHandler qZoneSsoHandler = new QZoneSsoHandler(this, "11051027719", "R7SksA1ovdujyxSH");        qZoneSsoHandler.addToSocialSDK();        UMQQSsoHandler qqSsoHandler = new UMQQSsoHandler(this, "11050271719", "R7SksA1ovdujyxSH");        qqSsoHandler.addToSocialSDK();        String appId = "wx5531fa2077341504";        String appSecret = "77023c911452c2c1c41fa9ab2fd9025fe";        // 添加微信平台        UMWXHandler wxHandler = new UMWXHandler(this, appId, appSecret);        wxHandler.addToSocialSDK();        // 添加微信朋友圈        UMWXHandler wxCircleHandler = new UMWXHandler(this, appId, appSecret);        wxCircleHandler.setToCircle(true);        wxCircleHandler.addToSocialSDK();    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

第三方登录的实现

 private void authorize(SHARE_MEDIA platform, final String platforms) {        mController.doOauthVerify(this, platform, new SocializeListeners.UMAuthListener() {            @Override            public void onError(SocializeException e, SHARE_MEDIA platform) {                Log.e("error", "授权失败" + e.toString());            }            @Override            public void onComplete(final Bundle value, final SHARE_MEDIA platform) {                if (value != null && !TextUtils.isEmpty(value.getString("uid"))) {                    mController.getPlatformInfo(LoginActivity.this, platform, new SocializeListeners.UMDataListener() {                        @Override                        public void onStart() {                            showLoading("获取用户信息...");                        }                        @Override                        public void onComplete(int status, Map<String, Object> info) {                            Log.e("info", info + "");                            cancelLoading();                            if (status == 200 && info != null) {                                ma = DevicePropertyUtil.getUUID(LoginActivity.this);                                mi = android.os.Build.MODEL;                                plat = platforms;                                if (platforms.equals("sina")) {                                    access_token = info.get("access_token").toString();                                    refresh_token = "";                                    expires_in = value.getString("expires_in");                                    zhanghao = "";                                    uids = value.getString("uid");                                    nickname = info.get("screen_name").toString();                                    userface = info.get("profile_image_url").toString();                                    gender = info.get("gender").toString();                                    if (gender.equals("1")) {                                        gender = "男";                                    } else {                                        gender = "女";                                    }                                } else if (platforms.equals("qq")) {                                    uids = value.getString("openid");                                    access_token = value.getString("access_token");                                    refresh_token = "";                                    expires_in = value.getString("expires_in");                                    zhanghao = "";                                    nickname = info.get("screen_name").toString();                                    userface = info.get("profile_image_url").toString();                                    gender = info.get("gender").toString();                                } else if (platforms.equals("weixin")) {                                    uids = value.getString("uid");                                    access_token = value.getString("access_token");                                    refresh_token = value.getString("refresh_token");                                    expires_in = value.getString("expires_in");                                    zhanghao = "";                                    nickname = info.get("nickname").toString();                                    userface = info.get("headimgurl").toString();                                    gender = info.get("sex").toString();                                    if (gender.equals("1")) {                                        gender = "男";                                    } else if (gender.equals("0")) {                                        gender = "女";                                    }                                }                            } else {                                log.d("发生错误:" + status);                            }                            ThridLoginEngine engine = new ThridLoginEngine(getRequestTag());                            engine.setParams(ma, mi, plat, uids, access_token, refresh_token, expires_in, zhanghao, nickname, userface, gender);                            engine.sendRequest();                            showLoading("正在登录...");                        }                    });                } else {                    log.i("授权失败");                }            }            @Override            public void onCancel(SHARE_MEDIA platform) {                log.i("授权取消");            }            @Override            public void onStart(SHARE_MEDIA platform) {                log.i("授权开始");            }        });    }    private void loginWeChat() {        if (mController != null) {            authorize(SHARE_MEDIA.WEIXIN, "weixin");        }    }    private void loginQQ() {        if (mController != null) {            //参数1为当前Activity, 参数2为开发者在QQ互联申请的APP ID,参数3为开发者在QQ互联申请的APP kEY.            authorize(SHARE_MEDIA.QQ, "qq");        }    }    private void loginSina() {        if (mController != null) {            //设置新浪SSO handler            mController.getConfig().setSsoHandler(new SinaSsoHandler());            authorize(SHARE_MEDIA.SINA, "sina");        }    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

这个过程主要是:获取授权doOauthVerify,授权成功后获取用户信息getPlatformInfo,获取成功后调用登陆接口即可。

当然还有一步,添加onActivityResult()相关回调

    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        /**使用SSO授权必须添加如下代码 */        UMSsoHandler ssoHandler = mController.getConfig().getSsoHandler(requestCode);        if (ssoHandler != null) {            ssoHandler.authorizeCallBack(requestCode, resultCode, data);        }        super.onActivityResult(requestCode, resultCode, data);    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这样就行了,微信主要注意包名,签名问题,QQ主要就是appId,appSecret的问题,微博主要分两种情况,项目在微博开发者平台注册成功,则主要注意

友盟官方文档是这么写的

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    /**使用SSO授权必须添加如下代码 */      UMSsoHandler ssoHandler = mController.getConfig().getSsoHandler(requestCode);    if(ssoHandler != null){       ssoHandler.authorizeCallBack(requestCode, resultCode, data);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

但是实际开发中代码应该这样写

   @JavascriptInterface    public void goToShare(String content) {        //设置新浪SSO handler//        mController.getConfig().setSsoHandler(new SinaSsoHandler());        String item = "";        try {            item = URLDecoder.decode(content, "utf-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        mController.getConfig().setPlatforms(SHARE_MEDIA.WEIXIN, SHARE_MEDIA.SINA, SHARE_MEDIA.QQ, SHARE_MEDIA.WEIXIN_CIRCLE);        SinaShareContent sinaShareContent = new SinaShareContent();//        if (item.contains(";")) {//            sinaShareContent.setTitle(item.split(";")[0]);//            sinaShareContent.setShareContent(item.split(";")[1]);//        } else {//        }        sinaShareContent.setShareContent(item);        sinaShareContent.setShareImage(new UMImage(this, R.mipmap.icon));        mController.setShareMedia(sinaShareContent);        QQShareContent qqShareContent = new QQShareContent();        if (item.contains(";")) {            String[] text = item.split(";");            if (text.length > 0) {                qqShareContent.setShareContent(text[0]);            }            if (text.length > 1) {                qqShareContent.setTargetUrl(text[1]);            }        } else {            qqShareContent.setShareContent(item);        }        qqShareContent.setTitle(getString(R.string.app_name));        qqShareContent.setShareImage(new UMImage(this, R.mipmap.icon));        mController.setShareMedia(qqShareContent);        WeiXinShareContent weiXinShareContent = new WeiXinShareContent();        if (item.contains(";")) {            String[] text = item.split(";");            if (text.length > 0) {                weiXinShareContent.setShareContent(text[0]);            }            if (text.length > 1) {                weiXinShareContent.setTargetUrl(text[1]);            }        } else {            weiXinShareContent.setShareContent(item);        }        weiXinShareContent.setTitle(getString(R.string.app_name));        weiXinShareContent.setShareImage(new UMImage(this, R.mipmap.icon));        mController.setShareMedia(weiXinShareContent);        CircleShareContent circleMedia = new CircleShareContent();        if (item.contains(";")) {            String[] text = item.split(";");            if (text.length > 0) {                circleMedia.setShareContent(text[0]);            }            if (text.length > 1) {                circleMedia.setTargetUrl(text[1]);            }        } else {            circleMedia.setShareContent(item);        }        circleMedia.setShareImage(new UMImage(this, R.mipmap.icon));        mController.setShareMedia(circleMedia);        mController.openShare(this, false);        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

这是我在项目中js调用安卓分享代码,大家可以借鉴一下,包括微信,微信朋友圈,QQ等

打开分享面板

 // 是否只有已登录用户才能打开分享选择页        mController.openShare(getActivity(), false);
  • 1
  • 2
  • 1
  • 2

用友盟的分享面板会有一个问题,就是当语言国际化为英文时,微信两个字没有翻译,这是比较坑的,大坑,所以我们需要自定义面板,面板怎么做大家考虑一下,下面分享一下自定义面板调用的友盟封装的分享方法

 /**     * 分享     */    private void showShare(final SHARE_MEDIA share_media) {        runOnUiThread(new Runnable() {                          @Override                          public void run() {                              mController.doOauthVerify(WebviewActivity.this, share_media, new SocializeListeners.UMAuthListener() {                                  @Override                                  public void onStart(SHARE_MEDIA share_media) {                                  }                                  @Override                                  public void onComplete(Bundle value, final SHARE_MEDIA share_media) {                                      if (value != null && !TextUtils.isEmpty(value.getString("uid"))) {                                          mController.postShare(WebviewActivity.this, share_media,                                                  new SocializeListeners.SnsPostListener() {                                                      @Override                                                      public void onStart() {                                                      }                                                      @Override                                                      public void onComplete(SHARE_MEDIA platform, int eCode, SocializeEntity entity) {                                                          if (eCode == 200) {                                                          } else {                                                              String eMsg = "";                                                              if (eCode == -101) {                                                                  eMsg = "没有授权";                                                              }                                                          }                                                      }                                                  });                                      }                                  }                                  @Override                                  public void onError(SocializeException e, SHARE_MEDIA share_media) {                                  }                                  @Override                                  public void onCancel(SHARE_MEDIA share_media) {                                  }                              });                          }                      }        );    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

嗯以上基本解决在工作中遇见的友盟第三方登录及分享的问题,主要要注意就是我们在获取到友盟的appkey时,还要到各个平台去注册获取项目的appId,appSecret,尤其是微博,大家可以借鉴一下啊,好啦,已经晚上11.37了,就不写了,准备下班走人!

0 0
原创粉丝点击