本文转自: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" > <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> <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:theme="@android:style/Theme.Translucent.NoTitleBar" android:screenOrientation="portrait"> </activity> <meta-data android:name="UMENG_APPKEY" android:value="xxxxxxxxxxxxxxxxxxxxxx" > </meta-data> </application> <uses-sdk android:minSdkVersion="8" /> <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.INTERNET" /> <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");
初始化,添加各平台到SDK
private void initUmeng() { com.umeng.socialize.utils.Log.LOG = LogUtil.debug; mController.getConfig().setSsoHandler(new SinaSsoHandler()); SinaSsoHandler sinaSsoHandler = new SinaSsoHandler(this); sinaSsoHandler.addToSocialSDK(); 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) { authorize(SHARE_MEDIA.QQ, "qq"); } } private void loginSina() { if (mController != null) { 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); }
这样就行了,微信主要注意包名,签名问题,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); }}
但是实际开发中代码应该这样写
@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);
用友盟的分享面板会有一个问题,就是当语言国际化为英文时,微信两个字没有翻译,这是比较坑的,大坑,所以我们需要自定义面板,面板怎么做大家考虑一下,下面分享一下自定义面板调用的友盟封装的分享方法
/** * 分享 */ 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