适用范围
该文档适用于Android组件化分享SDK6.9.0及以上版本。
更新说明
如果您想进行SDK升级操作,请根据如下情况选择合适的升级方式
- 如果您使用的是6.3之前的版本,建议根据集成文档重新进行集成。
- 如果您使用的是6.3之后的版本,只需要根据限免的升级建议,将6.3以后的变动合并到您的代码中即可。例如您的当前版本是6.4.5,那么请参照6.4.5更新至最新版的更新说明进行更新。
6.4.5接口变动
新浪不再需要WBShareActivity,只需在AndroidManifest中配置:
<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:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"/>
6.8.0更新
新浪配置统一修改为:
<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:configChanges="orientation|keyboardHidden|screenSize"/>
微信兼顾8.0:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
注意onActivityResult
不可在fragment中实现,如果在fragment中调用登录或分享,需要在fragment依赖的Activity中实现
配置Android Manifest XML
sdk中需要的Activity
- 新浪:
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
- 支付宝:
<activity
android:name=".ddshare.DingCallBack"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
- qq(请注意将我们的qq appkey替换成您自己的qq appkey):
<activity
android:name="com.umeng.socialize.editorpage.ShareActivity"
android:theme="@android:style/Theme.NoTitleBar"
android:excludeFromRecents="true"
/>
其他平台的配置请参照附录其他平台配置。
权限添加
请在AndroidManifest中添加如下权限
<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权限适配
请查看你的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 onCreate() {
super.onCreate();
UMConfigure.init(this,"5a12384aa40fa3551f0001d1"
,"umeng",UMConfigure.DEVICE_TYPE_PHONE,"");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0
}
更多了解初始化接口可以参照文档接下来需要设置各个平台的appkey:
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}
然后在buildTypes中将这个signingConfigs配置进去,如下图所示:
签名文件如果不加,部分平台的授权会受到影响。
相关阅读
使用分包功能的注意事项
部分用户可能会由于方法数限制问题使用了multiDexEnabled true
对于这部分用户,需要正确配置application否则可能会出现NoClassDefFoundError
具体配置可以参照MultiDex教学
混淆设置
new ShareAction(MainActivity.this).withText("hello") .setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN)
.setCallback(umShareListener).open();
关于分享面板的更多功能可以参照分享面板自定义。
分享(不带面板)
分享可以通过如下代码实现:
private UMShareListener shareListener = new UMShareListener() {
/**
* @descrption 分享开始的回调
* @param platform 平台类型
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* @descrption 分享成功的回调
* @param platform 平台类型
*/
@Override
public void onResult(SHARE_MEDIA platform) {
Toast.makeText(ShareDetailActivity.this,"成功 了",Toast.LENGTH_LONG).show();
}
/**
* @descrption 分享失败的回调
* @param platform 平台类型
* @param t 错误原因
*/
@Override
public void onError(SHARE_MEDIA platform, Throwable t) {
Toast.makeText(ShareDetailActivity.this,"失 败"+t.getMessage(),Toast.LENGTH_LONG).show();
}
/**
* @descrption 分享取消的回调
* @param platform 平台类型
*/
@Override
public void onCancel(SHARE_MEDIA platform) {
Toast.makeText(ShareDetailActivity.this,"取消 了",Toast.LENGTH_LONG).show();
}
};
分享的消息类型
对于分享内容可以有如下设置
文本
纯文本分享如下:
new ShareAction(ShareActivity.this).withText("hello").withMedia(image).share();
图片
在使用ShareAction的时候,调用withMedia可以设置一个UMImage(图片分享),UMImage的构建有如下几种形式
UMImage thumb = new UMImage(this, R.drawable.thumb);
image.setThumb(thumb);
用户设置的图片大小最好不要超过250k,缩略图不要超过18k,如果超过太多(最好不要分享1M以上的图片,压缩效率会很低),图片会被压缩。用户可以设置压缩的方式:
new ShareAction(ShareDetailActivity.this).withMedias(imagelocal,imagelocal,imagelocall)
.setPlatform(share_media)
.withText("hello")
.setCallback(shareListener).share();
注意上传多图需要带文字描述(WithText)
链接
分享链接可以使用UMWeb进行分享:
new ShareAction(ShareActivity.this)
.withMedia(web)
.share();
视频
视频只能使用网络视频:
UMusic music = new UMusic(musicurl);//音乐的播放链接
music.setTitle("This is music title");//音乐的标题
music.setThumb("http://www.umeng.com/images/pic/social/chart_1.png");//音乐的缩略图
music.setDescription("my description");//音乐的描述
music.setmTargetUrl(Defaultcontent.url);//音乐的跳转链接
建立好之后可以进行分享:
new ShareAction(ShareActivity.this).withMedia(music).share();
特别说明:播放链接是指在微信qq分享音乐,是可以在当前聊天界面播放的,要求这个musicurl(播放链接)必须要以.mp3等音乐格式结尾,跳转链接是指点击linkcard之后进行跳转的链接。
GIF
目前只有微信好友分享支持Emoji表情,其他平台暂不支持
UMEmoji emoji = new UMEmoji(this,"http://img5.imgtn.bdimg.com/it/u=2749190246,3857616763&fm=21&gp=0.jpg");
emoji.setThumb(new UMImage(this, R.drawable.thumb));
new ShareAction(ShareActivity.this)
.withMedia(emoji).share();
微信小程序
目前只有微信好友支持小程序分享,朋友圈,收藏及其他平台暂不支持:
UMAuthListener authListener = new UMAuthListener() {
/**
* @desc 授权开始的回调
* @param platform 平台名称
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* @desc 授权成功的回调
* @param platform 平台名称
* @param action 行为序号,开发者用不上
* @param data 用户资料返回
*/
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
Toast.makeText(mContext, "成功了", Toast.LENGTH_LONG).show();
}
/**
* @desc 授权失败的回调
* @param platform 平台名称
* @param action 行为序号,开发者用不上
* @param t 错误原因
*/
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(mContext, "失败:" + t.getMessage(), Toast.LENGTH_LONG).show();
}
/**
* @desc 授权取消的回调
* @param platform 平台名称
* @param action 行为序号,开发者用不上
*/
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(mContext, "取消了", Toast.LENGTH_LONG).show();
}
};
登录成功后,第三方平台会将用户资料传回, 全部会在Map data中返回 ,由于各个平台对于用户资料的标识不同,因此为了便于开发者使用,我们将一些常用的字段做了统一封装,开发者可以直接获取,不再需要对不同平台的不同字段名做转换,这里列出我们封装的字段及含义。
相关阅读:授权失败相关问题
U-Share高级功能
删除授权
对于退出登录,想要删除授权的用户可以使用如下接口:
UMShareAPI.get(mContext).deleteOauth(Activity, Platform, authListener);
其中第一个参数为Context;第二个参数为平台,第三个参数为删除授权的回调
分享按钮自定义
为分享面板添加一个自定义按钮:
new ShareAction(ShareMenuActivity.this)
.setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.QZONE,SHARE_MEDIA.WEIXIN,SHARE_MEDIA.WEIXIN_CIRCLE)//分享平台
.addButton("umeng_sharebutton_custom","umeng_sharebutton_custom","info_icon_1","info_icon_1")// 自定义按钮
.setShareboardclickCallback(shareBoardlistener)//面板点击监听器
.open();
addButton
下面对addButton进行一下解释:
- 第一个参数(umeng_sharebutton_custom)和第二个参数(umeng_sharebutton_custom)第一个参数是显示的名字,第二个参数是平台名称,用法如下:在string文件中设置:
<string name="umeng_sharebutton_custom">自定义分享按钮</string>
然后将名字umeng_sharebutton_custom
当做参数传入。
- 第三个参数(info_icon_1)和第四个参数(info_icon_1):第三个参数是按钮图标的图片名字,第四个按钮是置灰情况下按钮图标的图片名字,例如,你在
drawable
文件夹下有个图片叫做info_icon_1.png
,想用该图片做按钮图标,可以将info_icon_1
作为参数传入
分享面板回调监听
该监听器的目的是监听分享面板的点击事件:
ShareBoardConfig config = new ShareBoardConfig();//新建ShareBoardConfig config.setShareboardPostion(ShareBoardConfig.SHAREBOARD_POSITION_CENTER);//设置位置
config.setMenuItemBackgroundShape(ShareBoardConfig.BG_SHAPE_CIRCULAR);
config.setCancelButtonVisibility(true);
shareAction.open(config);//传入分享面板中
具体配置方式如下:
设置分享面板title文本内容
public ShareBoardConfig setTitleText(String title)
设置分享面板title文本颜色
public ShareBoardConfig setTitleTextColor(int color)
color的int值(不是color的资源id)
设置title是否显示
visibility(true为显示,false为隐藏)
public ShareBoardConfig setTitleVisibility(boolean visibility)
设置item文字的字体颜色
color的int值(不是color的资源id)
ShareBoardConfig setMenuItemTextColor(int color)
设置item图标按下效果颜色
color的int值(不是color的资源id)
ShareBoardConfig setMenuItemIconPressedColor(int color)
设置item背景颜色
normalColor背景色color的int值(不是color的资源id)
public ShareBoardConfig setMenuItemBackgroundColor(int normalColor)
设置item背景颜色
normalColor背景色pressedColor按下时色值color的int值(不是color的资源id)
public ShareBoardConfig setMenuItemBackgroundColor(int normalColor, int pressedColor)
设置item背景形状
shape 背景形状的type,可选值:1 ShareBoardConfig.BG_SHAPE_NONE(无背景)2 ShareBoardConfig.BG_SHAPE_CIRCULAR(圆形)3 ShareBoardConfig.BG_SHAPE_ROUNDED_SQUARE(圆角方形)
public ShareBoardConfig setMenuItemBackgroundShape(int shape)
设置item背景形状
shape 背景形状的type,可选值:1 ShareBoardConfig.BG_SHAPE_NONE(无背景)2 ShareBoardConfig.BG_SHAPE_CIRCULAR(圆形)3 ShareBoardConfig.BG_SHAPE_ROUNDED_SQUARE(圆角方形)
angle 圆角角度
ShareBoardConfig setMenuItemBackgroundShape(int shape, int angle)
设置指示器的颜色
normalColor未选中的指示器颜色color的int值(不是color的资源id)
ShareBoardConfig setIndicatorColor(int normalColor)
设置指示器的颜色
normalColor未选中的指示器颜色selectedColor当前页面指示器的颜色color的int值(不是color的资源id)
ShareBoardConfig setIndicatorColor(int normalColor, int selectedColor)
设置指示器的显示状态
ShareBoardConfig setIndicatorVisibility(boolean visibility)
设置取消按钮的背景色
normalColor背景色color的int值(不是color的资源id)
ShareBoardConfig setCancelButtonBackground(int normalColor)
设置取消按钮的背景色
normalColor背景色pressedColor按下时色值color的int值(不是color的资源id)
ShareBoardConfig setCancelButtonBackground(int normalColor, int pressedColor)
设置取消按钮文本内容
ShareBoardConfig setCancelButtonText(String text)
设置取消按钮文本字体颜色
color字体颜色color的int值(不是color的资源id)
ShareBoardConfig setCancelButtonTextColor(int color)
设置取消按钮是否显示
visibility(true为显示,false为隐藏)
ShareBoardConfig setCancelButtonVisibility(boolean visibility)
设置分享面板的背景颜色
color背景颜色color的int值(不是color的资源id)
ShareBoardConfig setShareboardBackgroundColor(int color)
设置分享面板的位置
position 位置,可选值:
config.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
}
});
内存泄漏解决方案
在使用分享或者授权的Activity中,重写onDestory()方法:
UMShareConfig config = new UMShareConfig();
config.isNeedAuthOnGetUserInfo(true);
UMShareAPI.get(InfoDetailActivity.this).setShareConfig(config);
目前SDK默认设置为在Token有效期内登录不进行二次授权,如果有需要每次登录都弹出授权页面,便于切换账号的开发者可以添加上述代码
水印开启
在6.2之后的版本之后,开发者可以调用我们的方法添加水印。需要注意的是,控制添加水印图片的大小,防止OOM首先使用水印功能,需要额外的umeng_social_tool.jar,不使用水印功能,可以不用添加。然后调用方法,进行添加:
110201:未登陆
110405:登录请求被限制
110404:请求参数缺少appid
110401:请求的应用不存在
110407:应用已经下架
110406:应用没有通过审核
100044:未经过安全校验的包名和签名
110500:获取用户授权信息失败
110501:获取应用的授权信息失败
110502:设置用户授权失败
110503:获取token失败
110504:系统内部错误
微信平台错误码对照
<activity
android:name=".yxapi.YXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
facebook需要像前面快速集成文档中写的一样,配置appkey,同时在AndroidManifest中配置:
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
其中487692214752558是facebook的appid这里需要注意,appid一定要存在string文件中,并以facebook_app_id名字进行保存。
twitter需要像前面快速集成文档中写的一样,配置appkey,同时在AndroidManifest中配置:
<activity
android:name="com.umeng.socialize.handler.TwitterWebActivity"
android:configChanges=
"keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:label="@string/app_name" />
Kakao
KaKao平台除了需要设置appid以外,还需要在AndroidManifest中添加如下代码:
<activity android:name="com.kakao.auth.authorization.authcode.KakaoWebViewActivity"/>
用以保证kakao的正常授权分享