友盟分享和第四方登录自动集成
PS:写在最前面,先注册Application。
PS:写在最前面,先注册Application。
PS:写在最前面,先注册Application。
没有注册的话报空指针异常:
‘void com.umeng.commonsdk.debug.UMDebugLog.mutlInfo(java.lang.String, int, java.lang.String[])’ on a…
自动集成方式
集成
1、友盟一切之前的的基础化组件集成:(日志打印很重要!!)
implementation 'com.umeng.sdk:common:latest.integration'
implementation 'com.umeng.sdk:utdid:1.1.5.3'
implementation 'com.umeng.sdk:debug:latest.integration'//错误日志打印
这个在基础化组件中一定要写上,特别是debug开发,否则不给错误日志的打印,死都不知道怎么死的
2、集成分享和登录:
dependencies {
compile 'com.umeng.sdk:common:latest.integration'
compile 'com.umeng.sdk:utdid:1.1.5.3'
}
友盟帮我们集成了微信QQ微博等三方登录和分享,所以我们只需要集成友盟第四方就可以很快使用这些第三方,那么集成友盟的方式有两种,自动集成和手动集成。所谓自动集成就用到AS的compile(implementation)快捷导入第三方库来集成,手动集成就是在友盟官网上下载需要集成的登录的相应jar包。另外自动集成目前仅支持QQ微信新浪微博,这里主要使用自动集成,手动集成请看官网:https://developer.umeng.com/docs/66632/detail/66639
添加依赖:自动集成的方式现在只支持微信,QQ,新浪三个平台,如果需要使用其它平台请选择手动集成。根据使用的平台添加如下对应的依赖:
compile 'com.umeng.sdk:share-core:latest.integration' compile 'com.umeng.sdk:share-qq:latest.integration' compile 'com.umeng.sdk:share-wechat:latest.integration' compile 'com.umeng.sdk:share-sina:latest.integration'
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纯图分享或避免其它平台纯图分享的时候图片不被压缩,可以增加以下权限:
xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
平台差异性配置:
新浪:
新浪平台暂无其他配置
QQ相关配置:
如果使用了QQ平台,需要在主工程(app module)的
build.gradle
中defaultConfig{}中添加如下配置:manifestPlaceholders = [qqappid: "你的qq appid"]
微信相关配置:
在包名目录下创建wxapi文件夹,新建一个名为
WXEntryActivity
的activity继承WXCallbackActivity
。
Android6.0权限适配:
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判断,用户是否同意了授权。如果没有同意,可以根据回调进行相应处理:
java
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
}
初始化
初始化需要在您的Application中调用我们的初始化接口:
@Override
public void onCreate() {
super.onCreate();
UMConfigure.init(this,"5a12384aa40fa3551f0001d1"
,"umeng",UMConfigure.DEVICE_TYPE_PHONE,"");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0
}
其中第四个参数是推送的key没有可以不写
签名配置
签名的概念将文件夹中的签名文件放入到工程中,例如我的签名文件是debug.keystore。
签名文件在User/Administrator/.androiud/debug.keystore
将它拷贝到app模块根目录下,然后增加签名文件的密码:
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword "1399369123"
keyAlias "key0"
keyPassword "1399369123"
}
}
然后在buildTypes中将这个signingConfigs配置进去:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword "1399369123"
keyAlias "key0"
keyPassword "1399369123"
}
}
}
PS:签名文件如果不加,部分平台的授权会受到影响。
签名问题参考资料:
https://blog.csdn.net/guozhaohui628/article/details/55102421
https://blog.csdn.net/u012005313/article/details/48577751
https://blog.csdn.net/guozhaohui628/article/details/71513110
相关阅读
混淆设置
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
-keep public class javax.**
-keep public class android.webkit.**
-dontwarn android.support.v4.**
-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**
-keep public class com.umeng.socialize.* {*;}
-keep class com.facebook.**
-keep class com.facebook.** { *; }
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-keep class com.umeng.weixin.handler.**
-keep class com.umeng.weixin.handler.*
-keep class com.umeng.qq.handler.**
-keep class com.umeng.qq.handler.*
-keep class UMMoreHandler{*;}
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
-keep class com.tencent.mm.sdk.** {
*;
}
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
-dontwarn twitter4j.**
-keep class twitter4j.** { *; }
-keep class com.tencent.** {*;}
-dontwarn com.tencent.**
-keep class com.kakao.** {*;}
-dontwarn com.kakao.**
-keep public class com.umeng.com.umeng.soexample.R$*{
public static final int *;
}
-keep public class com.linkedin.android.mobilesdk.R$*{
public static final int *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}
-keep class com.umeng.socialize.impl.ImageImpl {*;}
-keep class com.sina.** {*;}
-dontwarn com.sina.**
-keep class com.alipay.share.sdk.** {
*;
}
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}
-keep class com.linkedin.** { *; }
-keep class com.android.dingtalk.share.ddsharemodule.** { *; }
-keepattributes Signature
使用
分享
先说坑:
第一个坑是没有注册Application,报一个空指针异常
‘void com.umeng.commonsdk.debug.UMDebugLog.mutlInfo(java.lang.String, int, java.lang.String[])’ on a…
需要集成基础化组件和日志打印,否则崩都不知道怎么什么原因
implementation 'com.umeng.sdk:common:latest.integration' implementation 'com.umeng.sdk:utdid:1.1.5.3' implementation 'com.umeng.sdk:debug:latest.integration'//错误日志打印
这些的基础上,还是很多错,不只一个:
[SCH10000]您的activity中没有重写onActivityResult方法
https://developer.umeng.com/docs/66632/detail/66849?um_channel=sdk
解决:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); UMShareAPI.get(this).onActivityResult(requestCode,resultCode,data); }
[SQ10011]qq配置不正确,AndroidManifest中AuthActivity的data中要加入自己的qq应用id
您没有配置QQ的appkey,请在Application中调用PlatformConfig.setxxx进行配置
解决:
UMConfigure.init(this, "5acdb696a40fa36b670000c7", "umeng", UMConfigure.DEVICE_TYPE_PHONE, ""); PlatformConfig.setQQZone("1106834270", "4zQPFmjvloNZsxWy");
再说分享的使用
友盟分享分为两种形式:
- 使用分享面板的分享,用户可以调用我们的打开分享面板的方法,点击分享面板的对应平台进行分享。
- 不使用分享面板的分享,用户可以自己写分享按钮,或者触发事件,然后调用我们的分享方法,进行分享。简而言之,直接分享就是在用户自己的界面组件中插入分享行为,分享面板是打开我们写好的一个界面组件,根据点击事件进行分享。
使用:
- 纯文本,有的平台不支持纯文本,如QQ
- 图片,分享长图和大图有相应的压缩方法
- 链接
- 视频
- 音乐,其中可以在聊天界面播放,url必须以.mp3结尾
下面是这些分享的使用
btnopenumsharepanel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/**
* 纯文本,错误,QQ平台不支持纯文本分享...
*/
// new ShareAction(MainActivity.this).withText("hello").setDisplayList(SHARE_MEDIA.QQ,
// SHARE_MEDIA.WEIXIN, SHARE_MEDIA.SINA).setCallback(shareListener).open();
/**
* 图片,测试的QQ分享没什么问题
*/
// UMImage image = new UMImage(MainActivity.this, R.drawable.pic);//资源图片,完全OJBK
UMImage image = new UMImage(MainActivity.this, "https://ss0.baidu" + "" +
".com/6ONWsjip0QIZ8tyhnq/it/u=3357604743," +
"669910008&fm=173&app=12&f=JPEG?w=218&h=146&s=0D6161865FBAB1DA06CC8C8B03003083");
//网络图片,完全OJBK
image.compressStyle = UMImage.CompressStyle.SCALE;//大小压缩,默认为大小压缩,适合普通很大的图
/**
* 链接,测试的QQ分享,不能在我的电脑上查看,正常聊天可以
*/
// UMWeb web = new UMWeb("https://aweme.snssdk" +
// ".com/aweme/v1/play/?video_id=77f070d498664014b07418fe1d1524d0&line=0");
// web.setTitle("This is title");//标题
// web.setThumb(image); //缩略图
// web.setDescription("描述:5201314");//描述
/**
* 视频,测试的QQ,不能在我的电脑上查看,正常聊天可以
*/
// UMVideo video = new UMVideo("https://aweme.snssdk" +
// ".com/aweme/v1/play/?video_id=77f070d498664014b07418fe1d1524d0&line=0\n");
// video.setTitle("This is video title");//视频的标题
// video.setThumb(image);//视频的缩略图
// video.setDescription("my description");//视频的描述
/**
* 音乐,测试QQ,完全ojbk,不要发送给我的电脑
*/
//聊天界面播放的音乐链接需要以.mp3结尾才行
UMusic music = new UMusic("http://sc1.111ttt.cn:8282/2018/1/03m/13/396131232171.m4a?tflag=1519095601&pin=6cd414115fdb9a950d827487b16b5f97#.mp3");//音乐的播放链接
music.setTitle("This is music title");//音乐的标题
music.setThumb(image);//音乐的缩略图
music.setDescription("my description");//音乐的描述
music.setmTargetUrl("https://www.baidu.com/");//音乐的跳转链接
new ShareAction(MainActivity.this).withText("hello").withMedia(music).setDisplayList(SHARE_MEDIA.QQ,
SHARE_MEDIA.WEIXIN, SHARE_MEDIA.SINA).setCallback(shareListener).open();
}
});
查阅官网文档整理而来:https://developer.umeng.com/docs/66632/detail/66639#h3–
分享的高级用法
第三方登录
废话不多说,直接上代码
btnQQLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// //我想每次获取用户资料都授权怎么办?https://developer.umeng.com/docs/66632/detail/66824?um_channel=sdk
// UMShareConfig config = new UMShareConfig();
// config.isNeedAuthOnGetUserInfo(true);
// UMShareAPI.get(MainActivity.this).setShareConfig(config);
// //我想每次获取用户资料都授权怎么办?https://developer.umeng.com/docs/66632/detail/66824?um_channel=sdk
UMShareAPI.get(MainActivity.this).getPlatformInfo(MainActivity.this, SHARE_MEDIA.QQ, authListener);
//或者,下面这个方法得不到用户基本信息的.........
// UMShareAPI.get(MainActivity.this).doOauthVerify(MainActivity.this, SHARE_MEDIA.QQ, authListener);
}
});
btnQQLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 如果需要退出登录的按钮,可以调用删除对应缓存的方法:
UMShareAPI.get(MainActivity.this).deleteOauth(MainActivity.this, SHARE_MEDIA.QQ, authListener);
}
});
btnIsQQLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean isQQLogin = UMShareAPI.get(MainActivity.this).isAuthorize(MainActivity.this, SHARE_MEDIA.QQ);
if (isQQLogin) {
ToastUtil.showShort(MainActivity.this, "QQ已经登录了");
} else {
ToastUtil.showShort(MainActivity.this, "QQ没登录");
}
}
});
PS:以QQ为例子的登录注销以及判断是否登录
登录:
我想每次登录都获取权限怎么办?https://developer.umeng.com/docs/66632/detail/66824?um_channel=sdk
登录并得到信息:
UMShareAPI.get(MainActivity.this).getPlatformInfo(MainActivity.this, SHARE_MEDIA.QQ, authListener);
仅仅登录,得不到信息:
UMShareAPI.get(MainActivity.this).doOauthVerify(MainActivity.this, SHARE_MEDIA.QQ, authListener);
注销:
UMShareAPI.get(MainActivity.this).deleteOauth(MainActivity.this, SHARE_MEDIA.QQ, authListener);
判断是否登录:
public void onClick(View view) { boolean isQQLogin = UMShareAPI.get(MainActivity.this).isAuthorize(MainActivity.this, SHARE_MEDIA.QQ); if (isQQLogin) { ToastUtil.showShort(MainActivity.this, "QQ已经登录了"); } else { ToastUtil.showShort(MainActivity.this, "QQ没登录"); } }
注意
- 注册MyApplication
- 添加打印日志库,否则错误没有任何提示
- 建议手动集成,上面的自动集成只兼容QQ微信微博,而分享肯定不止这三个第三方的