第三方登录分享估计是最常做的功能了现在
这里详细说下友盟的社会化分享功能(这里主要讲微信的登录和分享)
<1>获取友盟平台的Appkey
首先申请个友盟账号,登录后进入我的产品
进入之后找到应用列表,添加一个应用,获取到Appkey
<2>集成Android Studio
友盟SDK下载:(https://developer.umeng.com/sdk)
选择需要的下载,微信QQ假如只做分享和登录,那么精简版就可以了
下载好后有几个文件夹
我的话选了这几个添加到项目:
添加回调Activity, 微信:[图片上传中...(image.png-cbc6cf-1550908681362-0)]
在包名目录下创建wxapi文件夹,新建一个名为WXEntryActivity
的activity继承WXCallbackActivity
。
配置Android Manifest XML,sdk中需要的Activity(这个的话最好把友盟官方文档上有的全部copy下来)
<!-- 友盟分享/登录 -->
<!-- 新浪 不需要的可以不添加-->
<activity
android:name="com.umeng.socialize.media.WBShareCallBackActivity"
android:configChanges="keyboardHidden|orientation"
android:exported="false"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android:name="com.sina.weibo.sdk.web.WeiboSdkWebActivity"
android:configChanges="keyboardHidden|orientation"
android:exported="false"
android:windowSoftInputMode="adjustResize" />
<activity
android:name="com.sina.weibo.sdk.share.WbShareTransActivity"
android:launchMode="singleTask"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">
<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:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- QQ -->
<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:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
权限添加,请在AndroidManifest中添加如下权限
<!-- QQ -->
<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权限适配(这个我之前写的文章有详细记录,可以参考:(https://www.jianshu.com/p/3119376f134e))
请查看你的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 onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
}
<3>在微信开发者平台创建应用,获取到对应的AppID和AppSecret
在此之前,你需要为你的项目打包一个正式签名:
可参考:(https://www.jianshu.com/p/4da94c5757f7)
用获取到的正式签名和项目包名去创建微信开放平台的应用才能保证唯一性
<4>最后就是使用了:
初始化设置,初始化需要在您的Application中调用我们的初始化接口:
@Override
public void onCreate() {
super.onCreate();
UMConfigure.init(this,"5a12384aa40fa3551f0001d1" //这个就是上面创建应用时拿到的Appkey
,"umeng",UMConfigure.DEVICE_TYPE_PHONE,"");
}
//各个平台的配置,各个第三方平台都需要创建应用用于授权
{
PlatformConfig.setWeixin("AppID", "AppSecret"); //把平台上对用获取到的AppID和AppSecret填入即可
PlatformConfig.setQQZone("xxxx", "xxxx"); //这个是QQ空间的
PlatformConfig.setSinaWeibo("xxxx", "xxxxx","http://sns.whalecloud.com"); //微博的
}
调用分享:
献上一个工具类
/**
* 分享链接
* WebUrl:分享链接
* title:标题
* description:描述
* description:描述
* imageUrl:网络缩略图(其实就是分享过去的一个app logo标识)
* imageID:本地缩略图(其实就是分享过去的一个app logo标识)
* platform:分享到哪里
*/
public class ShareUtils {
private static Dialog mWeiboDialog;
/**
* 分享链接
*/
public static void shareWeb(final Activity activity, String WebUrl, String title,
String description, String imageUrl, int imageID, SHARE_MEDIA platform) {
UMWeb web = new UMWeb(WebUrl); //连接地址
web.setTitle(title); //标题
web.setDescription(description); //描述
if (TextUtils.isEmpty(imageUrl)) {
web.setThumb(new UMImage(activity, imageID)); //本地缩略图
} else {
web.setThumb(new UMImage(activity, imageUrl)); //网络缩略图
}
new ShareAction(activity)
.setPlatform(platform)
.withMedia(web)
.setCallback(new UMShareListener() {
@Override
public void onStart(SHARE_MEDIA share_media) {
mWeiboDialog = WeiboDialogUtils.createLoadingDialog(activity, "正在跳转...");
}
@Override
public void onResult(final SHARE_MEDIA share_media) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (share_media.name().equals("WEIXIN_FAVORITE")) {
Toast.makeText(activity, "收藏成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(activity, "分享成功", Toast.LENGTH_SHORT).show();
EventBus.getDefault().postSticky(10000);
}
}
});
WeiboDialogUtils.closeDialog(mWeiboDialog);
}
@Override
public void onError(final SHARE_MEDIA share_media, final Throwable throwable) {
if (throwable != null) {
Log.d("throw", "throw:" + throwable.getMessage());
}
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(activity, "分享失败", Toast.LENGTH_SHORT).show();
EventBus.getDefault().postSticky(10001);
}
});
WeiboDialogUtils.closeDialog(mWeiboDialog);
}
@Override
public void onCancel(final SHARE_MEDIA share_media) { //share_media 平台
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(activity, "分享取消", Toast.LENGTH_SHORT).show();
}
});
WeiboDialogUtils.closeDialog(mWeiboDialog);
}
})
.share();
}
}
如果是单张图片分享就纯粹一点:
这个也可以整合到工具类里面去,因为写的时间段不同,所以暂时没去整合
//shareUrl需要分享的图片链接,
final UMImage image = new UMImage(mContext, shareUrl);
new ShareAction(this).setPlatform(SHARE_MEDIA.WEIXIN) //分享到微信
.withMedia(image)
.setCallback(shareListener)
.share();
/**
* 分享回调函数 ================================================================================
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
private UMShareListener shareListener = new UMShareListener() {
/**
* @descrption 分享开始的回调 @param platform 平台类型
*/
@Override
public void onStart(SHARE_MEDIA platform) {
//Toast.makeText(NationalQuizDetailsActivity.this, platform + "", Toast.LENGTH_SHORT).show();
}
/**
* @descrption 分享成功的回调 @param platform 平台类型
*/
@Override
public void onResult(SHARE_MEDIA platform) {
Toast.makeText(activity, "分享成功", Toast.LENGTH_SHORT).show();
}
/**
* @descrption 分享失败的回调 @param platform 平台类型 @param t 错误原因
*/
@Override
public void onError(SHARE_MEDIA platform, Throwable t) {
Toast.makeText(activity, "分享失败", Toast.LENGTH_SHORT).show();
}
/**
* @descrption 分享取消的回调 @param platform 平台类型
*/
@Override
public void onCancel(SHARE_MEDIA platform) {
Toast.makeText(activity, "分享取消", Toast.LENGTH_SHORT).show();
}
};
分享多张图片:
现在支持多图分享的平台有两个,一个是新浪微博一个是QQ空间,都是最多上传9张图片,新浪微博超过9张不会上传,QQ空间超过九张会上传QQ空间相册
new ShareAction(ShareDetailActivity.this).withMedias(imagelocal,imagelocal,imagelocall)
.setPlatform(share_media)
.withText("hello")
.setCallback(shareListener).share();
<>然后这里补上登录
//授权登录
private void authorization(SHARE_MEDIA share_media) {
UMShareAPI.get(this).getPlatformInfo(this, share_media, new UMAuthListener() {
@Override
public void onStart(SHARE_MEDIA share_media) {
Log.d(TAG + "onStart >>>", "授权开始");
}
@Override
public void onComplete(SHARE_MEDIA share_media, int i, Map<String, String> map) {
Log.d(TAG + "onComplete >>>", "授权完成");
/sdk是6.4.4的,但是获取值的时候用的是6.2以前的(access_token)才能获取到值,未知原因
String uid = map.get("uid");
String openid = map.get("openid");//微博没有
String unionid = map.get("unionid");//微博没有
String access_token = map.get("access_token");
String refresh_token = map.get("refresh_token");//微信,qq,微博都没有获取到
String expires_in = map.get("expires_in");
String name = map.get("name");
String gender = map.get("gender");
String iconurl = map.get("iconurl");
//然后拿到需要的参数请求做下一步操作,一般情况下后台会拿unionid作为账户唯一标识
//头像和昵称,性别,是微信用户的信息
}
@Override
public void onError(SHARE_MEDIA share_media, int i, Throwable throwable) {
Toast.makeText(activity, "授权失败", Toast.LENGTH_SHORT).show();
Log.d(TAG + "onError >>>", "授权失败");
}
@Override
public void onCancel(SHARE_MEDIA share_media, int i) {
Log.d(TAG + "onCancel >>>", "授权取消");
Toast.makeText(activity, "授权取消", Toast.LENGTH_SHORT).show();
}
});
}
当然看官方文档也是没问题的,只是可能没那么详细:(https://developer.umeng.com/docs/66632/detail/66639)
最后谢谢参考!