友盟分享第四方登录自动集成_学习笔记

友盟分享和第四方登录自动集成

PS:写在最前面,先注册Application。

PS:写在最前面,先注册Application。

PS:写在最前面,先注册Application。

没有注册的话报空指针异常:

‘void com.umeng.commonsdk.debug.UMDebugLog.mutlInfo(java.lang.String, int, java.lang.String[])’ on a…

自动集成方式

集成

1、友盟一切之前的的基础化组件集成:(日志打印很重要!!)

https://developer.umeng.com/docs/66632/detail/66890#h1-u7EC4u4EF6u5316u57FAu7840u5E93u96C6u6210u6587u68631

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

  1. 添加依赖:自动集成的方式现在只支持微信,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'
  2. 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


  3. 平台差异性配置:

    • 新浪:

      新浪平台暂无其他配置

    • QQ相关配置:

      如果使用了QQ平台,需要在主工程(app module)的build.gradle中defaultConfig{}中添加如下配置:

      manifestPlaceholders = [qqappid: "你的qq appid"]
    • 微信相关配置:

      在包名目录下创建wxapi文件夹,新建一个名为WXEntryActivity的activity继承WXCallbackActivity

  4. 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

相关阅读

【SX10002】微信您的应用签名不正确

【SQ10005】非官方正版应用,错误码100044

【SS10001】新浪签名问题

混淆设置

-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

使用

分享

先说坑:

  1. 第一个坑是没有注册Application,报一个空指针异常

    ‘void com.umeng.commonsdk.debug.UMDebugLog.mutlInfo(java.lang.String, int, java.lang.String[])’ on a…

  2. 需要集成基础化组件和日志打印,否则崩都不知道怎么什么原因

    implementation 'com.umeng.sdk:common:latest.integration'
    implementation 'com.umeng.sdk:utdid:1.1.5.3'
    implementation 'com.umeng.sdk:debug:latest.integration'//错误日志打印
  3. 这些的基础上,还是很多错,不只一个:

    • [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");

再说分享的使用

友盟分享分为两种形式:

  • 使用分享面板的分享,用户可以调用我们的打开分享面板的方法,点击分享面板的对应平台进行分享。
  • 不使用分享面板的分享,用户可以自己写分享按钮,或者触发事件,然后调用我们的分享方法,进行分享。简而言之,直接分享就是在用户自己的界面组件中插入分享行为,分享面板是打开我们写好的一个界面组件,根据点击事件进行分享。

使用:

  1. 纯文本,有的平台不支持纯文本,如QQ
  2. 图片,分享长图和大图有相应的压缩方法
  3. 链接
  4. 视频
  5. 音乐,其中可以在聊天界面播放,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微信微博,而分享肯定不止这三个第三方的

你可能感兴趣的:(友盟分享第四方登录自动集成_学习笔记)