友盟第三方登录和分享的使用
获取友盟Appkey
如果你之前已经在友盟注册了应用,并获取到了Appkey,可以继续使用它.
如果你尚未在友盟注册开发者账号,需要先注册,注册之后登录你的账号,点击添加新应用,填写完应用基本信息后,将进入"下载SDK并添加代码"页面,此页面即可得到Appkey。
下载并安装SDK
* 下载[SDK最新版](http://dev.umeng.com/social/android/sdk-download)
* 添加代码和资源引用,我们提供了两种方式,可以根据需求选择
A.解压SDK压缩包,将文件夹中的social_sdk_library_project文件夹导入Eclipse,并在您的工程中添加对此项目的引用即可。
B.解压SDK压缩包,将文件夹中的'main/libs'和'main/res'文件夹复制到你的项目工程根目录下(如使用'ADT 17'以下用户需要手动添加'libs'下的jar文件到工程Path中),同时将需要添加的对应平台(platform文件夹下)的jar包和res文件放到你的工程目录下
* AndroidManifest配置
//增加一个activity
<activity android:name="com.umeng.socialize.editorpage.ShareActivity"
android:theme="@style/Theme.UMDefault"
android:excludeFromRecents="true"/>
// 设置友盟appid <meta-data android:name="UMENG_APPKEY" android:value="4eaee02c527015373b000003" > </meta-data>
1 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 2 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 3 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 4 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 5 <uses-permission android:name="android.permission.INTERNET" /> 6 <uses-permission android:name="android.permission.READ_LOGS" /> 7 <uses-permission android:name="android.permission.CALL_PHONE" /> 8 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 9 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 10 <uses-permission android:name="android.permission.GET_TASKS" /> 11 <uses-permission android:name="android.permission.SET_DEBUG_APP" /> 12 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 13 <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 14 <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 15 <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
针对不平台所需要添加的数据
1 微信平台 2 3 <activity 4 android:name="com.umeng.example.wxapi.WXEntryActivity" 5 android:configChanges="keyboardHidden|orientation|screenSize" 6 android:exported="true" 7 android:screenOrientation="portrait" 8 android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 9 10 人人网 11 12 <activity 13 android:name="com.renn.rennsdk.oauth.OAuthActivity" 14 android:configChanges="orientation|navigation|keyboardHidden" />15 16 腾讯 17 18<activity 19 android:name="com.tencent.tauth.AuthActivity" 20 android:launchMode="singleTask" 21 android:noHistory="true" > 22 <intent-filter> 23 <action android:name="android.intent.action.VIEW" /> 24 <category android:name="android.intent.category.DEFAULT" /> 25 <category android:name="android.intent.category.BROWSABLE" /> 26 <data android:scheme="tencent100424468" /> 27 </intent-filter> 28 </activity> 29 <activity android:name="com.tencent.connect.common.AssistActivity" 30 android:screenOrientation="portrait" 31 android:theme="@android:style/Theme.Translucent.NoTitleBar" />32 33 谷歌地图 34 35 <uses-library 36 android:name="com.google.android.maps" 37 android:required="false" /> 38 <uses-library android:name="android.test.runner" />39 facebook 40 <activity 41 android:name="com.facebook.FacebookActivity" 42 android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" 43 android:label="@string/app_name" 44 android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 45 <provider android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider+appid" 46 android:exported="true" /> 47 <meta-data 48 android:name="com.facebook.sdk.ApplicationId" 49 android:value="@string/facebook_app_id" />50 51 新浪微博 52 53 <activity 54 android:name=".WBShareActivity" 55 android:configChanges="keyboardHidden|orientation" 56 android:screenOrientation="portrait" > 57 <intent-filter> 58 <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" /> 59 <category android:name="android.intent.category.DEFAULT" /> 60 </intent-filter> 61 </activity> 62 <activity 63 android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser" 64 android:configChanges="keyboardHidden|orientation" 65 android:windowSoftInputMode="adjustResize" 66 android:exported="false" > 67 </activity>68 69 <service android:name="com.sina.weibo.sdk.net.DownloadService" 70 android:exported="false"></service>71 72 支付宝 73 74<activity 75 android:name=".apshare.ShareEntryActivity" 76 android:configChanges="keyboardHidden|orientation|screenSize" 77 android:exported="true" 78 android:screenOrientation="portrait" 79 android:theme="@android:style/Theme.Translucent.NoTitleBar" />
4. 打开平台选择面板
4.1 各个平台的配置,建议放在全局Application或者程序入口
1 PlatformConfig.setWeixin("wx967daebe835fbeac", "5bb696d9ccd75a38c8a0bfe0675559b3"); //微信 appid appsecret 2 PlatformConfig.setSinaWeibo("3921700954","04b48b094faeb16683c32669824ebdad");//新浪微博 appkey appsecret 3 4 PlatformConfig.setYixin("yxc0614e80c9304c11b0391514d09f13bf");//易信 appkey 5 6 PlatformConfig.setRenren("201874","28401c0964f04a72a14c812d6132fcef","3bf66e42db1e4fa9829b955cc300b737");//人人 appid appkey appsecret 7 PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba"); // qq qzone appid appkey 8 PlatformConfig.setAlipay("2015111700822536");//alipay appid
说明:需要使用第三方公司api的平台,新浪,腾讯等,是需要去申请appkey的。人人豆瓣只能在服务器端设置。其它需要配置appid的平台,如qq,微信,易信,twitter等都需要在本地设置。还有一部分平台需要在mainfest中配置,前面已经提到过。
授权
目前友盟社会化组件支持的第三方登录平台为:新浪微博、QQ、微信、人人网、豆瓣。(特别说明:QQ空间,qq微博使用qq授权)
首先获取UMShareAPI
1 private UMShareAPI mShareAPI; 2 mShareAPI = UMShareAPI.get( this );
选取需要授权的平台,并进行授权,其中umAuthLisrener是回调监听器,需要开发者根据需求重新定义
1 SHARE_MEDIA platform = SHARE_MEDIA.SINA; 2 mShareAPI.doOauthVerify(this, platform, umAuthListener) 3 private UMAuthListener umAuthListener = new UMAuthListener() { 4 @Override 5 public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { 6 Toast.makeText( getApplicationContext(), "Authorize succeed", Toast.LENGTH_SHORT).show(); 7 } 8 9 @Override 10 public void onError(SHARE_MEDIA platform, int action, Throwable t) { 11 Toast.makeText( getApplicationContext(), "Authorize fail", Toast.LENGTH_SHORT).show(); 12 } 13 14 @Override 15 public void onCancel(SHARE_MEDIA platform, int action) { 16 Toast.makeText( getApplicationContext(), "Authorize cancel", Toast.LENGTH_SHORT).show(); 17 } 18 };
对于删除授权使用的接口是
mShareAPI.deleteOauth(AuthActivity.this, platform, umdelAuthListener);
注意要重写
1 onActivityResult() 2 3 @Override 4 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 5 super.onActivityResult(requestCode, resultCode, data); 6 mShareAPI.onActivityResult(requestCode, resultCode, data); 7 }
平台授权,是需要安装对应的客户端的。新浪微博,豆瓣网,人人网除外,这三个平台如果本地安装了对应平台是走本地授权,如果没有安装,需要走网络授权
分享
自定义shareboard:
1 final SHARE_MEDIA[] displaylist = new SHARE_MEDIA[] 2 { 3 SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE,SHARE_MEDIA.SINA, 4 SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE,SHARE_MEDIA.DOUBAN 5 }; 6 new ShareAction(this).setDisplayList( displaylist ) 7 .withText( "呵呵" ) 8 .withMedia( image ) 9 .setShareboardclickCallback(shareBoardlistener) 10 .open(); 11 自定义shareboard需要,指明需要显示的平台,放入shareaction中,并执行open方法即可。 12 shareboard点击响应回调方法如下: 13 14 private ShareBoardlistener shareBoardlistener = new ShareBoardlistener() { 15 16 @Override 17 public void onclick(SHARE_MEDIA share_media) { 18 19 } 20 };
单平台直接分享:
1 new ShareAction(this) 2 .setPlatform(SHARE_MEDIA.DOUBAN) 3 .setCallback(umShareListener) 4 .withText("Hello 豆瓣") 5 .withMedia(image) 6 .share(); 7 选取分享的平台,设定分享回调接口和内容,并执行share方法。
回调接口如下:
1 new UMShareListener() { 2 @Override 3 public void onResult(SHARE_MEDIA platform) { 4 Toast.makeText(ShareActivity.this,platform + " 分享成功啦", Toast.LENGTH_SHORT).show(); 5 } 6 7 @Override 8 public void onError(SHARE_MEDIA platform, Throwable t) { 9 Toast.makeText(ShareActivity.this,platform + " 分享失败啦", Toast.LENGTH_SHORT).show(); 10 } 11 12 @Override 13 public void onCancel(SHARE_MEDIA platform) { 14 Toast.makeText(ShareActivity.this,platform + " 分享取消了", Toast.LENGTH_SHORT).show(); 15 } 16 };
值得注意的是,分享也应该重写onActivityResult()
1 @Override 2 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 3 super.onActivityResult(requestCode, resultCode, data); 4 UMShareAPI.get( this ).onActivityResult( requestCode, resultCode, data); 5 }
获取用户信息和好友列表
已授权的平台,可以获取用户信息(新浪微博可以获取用户好友列表)
实现的方法与授权和解除授权类似:
1 mShareAPI = UMShareAPI.get(this); 2 3 初始化UMShareAPI,然后进行用户信息获取: 4 5 mShareAPI.getPlatformInfo(UserinfoActivity.this, platform, umAuthListener); 6 7 对于新浪微博好友列表的获取使用的接口是: 8 9 mShareAPI.getFriend(UserinfoActivity.this, SHARE_MEDIA.SINA, umGetfriendListener);
高级功能介绍:
对于以上介绍的基本功能已经可以实现一般用户的需求,对于特殊要求,我们进行了特别处理:
针对分享面板,我们进行了如下的处理:
针对不同平台使用不同监听器,以及分享不同内容
根据前面的介绍可以知道,使用ShareAction(this).setDisplayList( displaylist)可以进行分享面板的平台设置。同时使用setContentList(),可以进行不同分享内容的处理,使用setListenerList()进行不同回调的处理。
1 new ShareAction(this) 6 .setDisplayList( SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE, ) 7 .setContentList(shareContent1,shareContent2) 8 .setCallback(umShareListener) 9 .withText( "umeng" ) 10 .withMedia( image ) 11 .setListenerList(listener1,listener2) 12 .open();
分享面板点击回调
使用setShareboardclickCallback()可以进行分享面板不同按钮的点击
回调,方便开发者进行特殊处理。
1 new ShareAction(this) 2 .setDisplayList( SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE, ) 3 .withText( "umeng" ) 4 .withMedia( image ) 5 setShareboardclickCallback(shareBoardlistener) 6 .open();
分享面板增加自定义按钮
如果需要对分享面板增加自定义的按钮,可以通过`ShareAction(this).addButton(String showword,String Keyword,String icon,String Grayicon)`
进行设置其中第一个参数是显示的名字,第二个参数是平台名称,第三个参数是按钮图标的图片名字,第四个按钮是置灰情况下按钮图标的图片名字。
对于自定义平台的监听需要使用上面提到的分享面板点击回调,如下
1 private ShareBoardlistener shareBoardlistener = new ShareBoardlistener() { 2 3 @Override 4 public void onclick(SnsPlatform snsPlatform,SHARE_MEDIA share_media) { 5 if (share_media==null){ 6 if (snsPlatform.mKeyword.equals("11")){ 7 Toast.makeText(ShareActivity.this,"add button success",Toast.LENGTH_LONG).show(); 8 } 9 10 } 11 else { 12 new ShareAction(ShareActivity.this).setPlatform(share_media).setCallback(umShareListener) 13 .withText("多平台分享") 14 .share(); 15 } 16 } 17 }; 18 是新增按钮的回调监听是通过判断当获取平台为空时,keyword的值来进行确定的,并在对应的条件中进行处理即可。
获取客户端安装信息
1 获取客户端安装信息 2 //使用如下接口 3 4 mShareAPI.isInstall(this, SHARE_MEDIA.WEIXIN) 5 6 //关闭log和toast方法: 7 Log.LOG = false 8 9 Config.IsToastTip = false10 //开启回流统计的方法: 11 12 Config.isloadUrl = true
混淆
为了保证引用友盟Social SDK jar文件以及腾讯jar文件被混淆,请在proguard.cfg文件中添加以下代码避免被混淆.
1 -dontshrink 2 -dontoptimize 3 -dontwarn com.google.android.maps.** 4 -dontwarn android.webkit.WebView 5 -dontwarn com.umeng.** 6 -dontwarn com.tencent.weibo.sdk.** 7 -dontwarn com.facebook.** 8 -keep public class javax.** 9 -keep public class android.webkit.** 10 -dontwarn android.support.v4.** 11 -keep enum com.facebook.** 12 -keepattributes Exceptions,InnerClasses,Signature 13 -keepattributes *Annotation* 14 -keepattributes SourceFile,LineNumberTable 15 16 -keep public interface com.facebook.** 17 -keep public interface com.tencent.** 18 -keep public interface com.umeng.socialize.** 19 -keep public interface com.umeng.socialize.sensor.** 20 -keep public interface com.umeng.scrshot.** 21 22 -keep public class com.umeng.socialize.* {*;} 23 24 25 -keep class com.facebook.** 26 -keep class com.facebook.** { *; } 27 -keep class com.umeng.scrshot.** 28 -keep public class com.tencent.** {*;} 29 -keep class com.umeng.socialize.sensor.** 30 -keep class com.umeng.socialize.handler.** 31 -keep class com.umeng.socialize.handler.* 32 -keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;} 33 -keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;} 34 35 -keep class im.yixin.sdk.api.YXMessage {*;} 36 -keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;} 37 38 -dontwarn twitter4j.** 39 -keep class twitter4j.** { *; } 40 41 -keep class com.tencent.** {*;} 42 -dontwarn com.tencent.** 43 -keep public class com.umeng.soexample.R$*{ 44 public static final int *; 45 } 46 -keep public class com.umeng.soexample.R$*{ 47 public static final int *; 48 } 49 -keep class com.tencent.open.TDialog$* 50 -keep class com.tencent.open.TDialog$* {*;} 51 -keep class com.tencent.open.PKDialog 52 -keep class com.tencent.open.PKDialog {*;} 53 -keep class com.tencent.open.PKDialog$* 54 -keep class com.tencent.open.PKDialog$* {*;} 55 56 -keep class com.sina.** {*;} 57 -dontwarn com.sina.** 58 -keep class com.alipay.share.sdk.** { 59 *; 60 } 61 -keepnames class * implements android.os.Parcelable { 62 public static final ** CREATOR; 63 } 64 65 -keep class com.linkedin.** { *; } 66 -keepattributes Signature
具体实现:
登录:
1 private UMShareAPI umShareAPI; 2 //监听事件 3 private UMAuthListener umAuthListener = new UMAuthListener() { 4 //登录成功 5 @Override 6 public void onComplete(SHARE_MEDIA platform, int action,Map<String, String> data) { 7 Toast.makeText(MainActivity.this, "Authorize succeed", Toast.LENGTH_SHORT).show(); 8 //获取用户信息 9 umShareAPI.getPlatformInfo(MainActivity.this, platform,new UMAuthListener() { 10 @Override 11 public void onError(SHARE_MEDIA arg0, int arg1,Throwable arg2) { 12 13 } 14 //成功 15 @Override 16 public void onComplete(SHARE_MEDIA arg0, int arg1,Map<String, String> data) { 17 Set<String> set = data.keySet(); 18 for (String string : set) { 19 Log.i("msg", 20 "============================Map========================="); 21 Log.i("msg", string + "::::" + data.get(string)); 22 String str = data.get(string); 23 // 设置头像 24 if(str!=null){ 25 signMode.setVisibility(View.GONE); 26 header.setVisibility(View.VISIBLE); 27 if (string.equals("profile_image_url")) { 28 DisplayImageOptions options = null; 29 ImageLoader.getInstance().displayImage(str,mineHeader, options); 30 ImageLoader.getInstance().displayImage(str,mine, options); 31 } 32 // 设置昵称 33 if (string.equals("screen_name")) { 34 mineName.setText(str); 35 } 36 } 37 38 39 } 40 41 } 42 43 @Override 44 public void onCancel(SHARE_MEDIA arg0, int arg1) { 45 46 } 47 }); 48 } 49 50 @Override 51 public void onError(SHARE_MEDIA platform, int action, Throwable t) { 52 Toast.makeText(MainActivity.this, "Authorize fail", Toast.LENGTH_SHORT).show(); 53 } 54 55 @Override 56 public void onCancel(SHARE_MEDIA platform, int action) { 57 Toast.makeText(MainActivity.this, "Authorize cancel", Toast.LENGTH_SHORT).show(); 58 } 59 }; 60 @Override 61 protected void onCreate(Bundle savedInstanceState) { 62 super.onCreate(savedInstanceState); 63 setContentView(R.layout.activity_main); 64 PlatformConfig.setQQZone("100424468","c7394704798a158208a74ab60104f0ba"); 65 umShareAPI = UMShareAPI.get(this); 66 } 67 重写onActivityResult() 68 public void onActivityResult(int requestCode, int resultCode, Intent data) { 69 super.onActivityResult(requestCode, resultCode, data); 70 umShareAPI.onActivityResult(requestCode, resultCode, data); 71 Log.e("data", resultCode + ""); 72 73 } 74 public void onClick(View v) { 75 switch (v.getId()) { 76 case R.id.qq_sign_button: 77 SHARE_MEDIA platform = SHARE_MEDIA.QQ;//此处是QQ授权 78 umShareAPI.doOauthVerify(this, platform, umAuthListener); 79 break; 80 } 81 }
清单文件配置:
1 <uses-permission android:name="android.permission.INTERNET" /> 2 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 3 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 4 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 5 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 6 <uses-permission android:name="android.permission.INTERNET" /> 7 <uses-permission android:name="android.permission.READ_LOGS" /> 8 <uses-permission android:name="android.permission.CALL_PHONE" /> 9 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 10 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 11 <uses-permission android:name="android.permission.GET_TASKS" /> 12 <uses-permission android:name="android.permission.SET_DEBUG_APP" /> 13 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 14 <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 15 <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 16 <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> 17 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 18 <activity 19 android:name="com.tencent.tauth.AuthActivity" 20 android:launchMode="singleTask" 21 android:noHistory="true"> 22 <intent-filter> 23 <action android:name="android.intent.action.VIEW" /> 24 25 <category android:name="android.intent.category.DEFAULT" /> 26 <category android:name="android.intent.category.BROWSABLE" /> 27 28 <data android:scheme="tencent100424468" /> 29 </intent-filter> 30 </activity> 31 <activity 32 android:name="com.tencent.connect.common.AssistActivity" 33 android:screenOrientation="portrait" 34 android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 35 36 <meta-data 37 android:name="UMENG_APPKEY" 38 android:value="4eaee02c527015373b000003" />
分享:
还是以QQ为例,清单文件配置同上:
1 平台信息 2 final SHARE_MEDIA[] displaylist = new SHARE_MEDIA[] 3 { 4 SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.SINA, 5 SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE, SHARE_MEDIA.DOUBAN 6 }; 7 button.setOnClickListener(new View.OnClickListener() { 8 @Override 9 public void onClick(View v) { 10 11 12 //多平台分享,这次实现的是shareBoardlistener监听 13 new ShareAction(MainActivity.this).setDisplayList(displaylist) 14 .withText("呵呵")//可以没有 15 .setShareboardclickCallback(shareBoardlistener) 16 .open(); 17 } 18 }); 19 private ShareBoardlistener shareBoardlistener = new ShareBoardlistener() { 20 @Override 21 public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) { 22 Log.e("snsPlatform", snsPlatform + "" + "SHARE_MEDIA" + share_media + ""); 23 //调用单平台分享 24 new ShareAction(MainActivity.this) 25 //参数改成share_media 26 .setPlatform(share_media) 27 .setCallback(new UMShareListener() { 28 @Override 29 public void onResult(SHARE_MEDIA platform) { 30 Toast.makeText(MainActivity.this, platform + " 分享成功啦", Toast.LENGTH_SHORT).show(); 31 } 32 33 @Override 34 public void onError(SHARE_MEDIA platform, Throwable t) { 35 Toast.makeText(MainActivity.this, platform + " 分享失败啦", Toast.LENGTH_SHORT).show(); 36 } 37 38 @Override 39 public void onCancel(SHARE_MEDIA platform) { 40 Toast.makeText(MainActivity.this, platform + " 分享取消了", Toast.LENGTH_SHORT).show(); 41 } 42 }) 43 .withText("Hello 豆瓣") 44 .share(); 45 } 46 };