美文网首页Android基础Android开发Android开发经验谈
手把手带你集成友盟实现授权登录、分享

手把手带你集成友盟实现授权登录、分享

作者: Android_董 | 来源:发表于2019-09-24 15:45 被阅读0次
    android.jpg

    集成准备(获取AppKey)

    第一步.png 第二步.png 第三步.png 第四步.png 第五步.png 第六步.png

    这里就可以拿到友盟的AppKey了接下来集成友盟

    这里我选择的是手动集成

    1、获取SDK(下载最新SDK)
    2、导入jar和res(将main文件夹以及platform(选择你想使用的平台即可)文件下,对应的资源文件和jar放入你的工程)
    3、添加回调Activity(这里只做微信的回调 在包名目录下创建wxapi文件夹,新建一个名为WXEntryActivity的activity继承WXCallbackActivity。)

    微信.png
    QQ与新浪
    /**
         * @param requestCode
         * @param resultCode
         * @param data        
         *QQ与新浪不需要添加Activity,但需要在使用QQ分享或者授权的          
         *Activity中,添加
         *注意onActivityResult不可在fragment中实现,如果在fragment中 
         *调用登录或分享,
         * 需要在fragment依赖的Activity中实现
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
        }
    

    4、配置Android Manifest XML

    sdk中需要的Activity

    1、新浪

       <activity
            android:name="com.umeng.socialize.media.WBShareCallBackActivity"
            android:configChanges="keyboardHidden|orientation"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:exported="false"
            >
        </activity>
        <activity android:name="com.sina.weibo.sdk.web.WeiboSdkWebActivity"
                  android:configChanges="keyboardHidden|orientation"
                  android:exported="false"
                  android:windowSoftInputMode="adjustResize"
        >
    
        </activity>
        <activity
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
            android:launchMode="singleTask"
            android:name="com.sina.weibo.sdk.share.WbShareTransActivity">
            <intent-filter>
                <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
    
        </activity>
    

    2、微信

     <activity
                android:name=".wxapi.WXEntryActivity"
                android:configChanges="keyboardHidden|orientation|screenSize"
                android:exported="true"
                android:theme="@android:style/Theme.Translucent.NoTitleBar" />
    

    3、qq(请注意将我们的qq appkey替换成您自己的qq appkey)

         <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="tencent自己的AppID前边的tencent不删  " />-->
            <data android:scheme="" />
            </intent-filter>
            </activity>
            <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="orientation|keyboardHidden|screenSize"/>
    

    其他平台的配置请参照附录其他平台配置

    权限添加

    请在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.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE};                 ActivityCompat.requestPermissions(this,mPermissionList,123);
    }
    
    其中123是requestcode,可以根据这个code判断,用户是否同意了授权。如果没有同意,可以根据回调进行相应处理:
    @Override
    public void onRequestPermissionsResult(int requestCode,
            String permissions[], int[] grantResults) {
    
    }
    

    初始化设置(该设置需要在Application中进行设置)

    初始化需要在您的Application中调用我们的初始化接口:
    private void initUM() {
            //初始化友盟
            UMConfigure.init(this, "5d6901f43fc195884900017d"
                    , "umeng", UMConfigure.DEVICE_TYPE_PHONE, "");
            //设置组件化的log开关测试方便查看日志,在release的时候记着关闭
            UMConfigure.setLogEnabled(true);
            //设置日志加密
    //        UMConfigure.setEncryptEnabled(true);
            //设置各个平台appKey 这里只写了QQ的 其他的可以根据文档自己添加
            PlatformConfig.setQQZone("", "");
        }
    

    更多了解初始化接口可以参照文档

    签名配置

    签名的概念将文件夹中的签名文件放入到工程中

    这里就不详细说如何生成签名文件
    添加签名步骤
    Ctrl+Alt+Shift+S——>Modules——>Signing——>将签名添加到项目

    签名文件如果不加,部分平台的授权会受到影响。

    相关阅读
    【SX10002】微信您的应用签名不正确
    【SQ10005】非官方正版应用,错误码100044
    【SS10001】新浪签名问题

    使用分包功能的注意事项(这里我还没研究)

    部分用户可能会由于方法数限制问题使用了multiDexEnabled true对于这部分用户,需要正确配置application否则可能会出现NoClassDefFoundError具体配置可以参照MultiDex教学

    混淆设置

    -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.** {
       *;
    }
    
    -keep class com.twitter.** { *; }
    
    -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
    
    

    相关阅读
    【SC10008】去掉混淆-dontshrink报错
    【SC10003】Didn’t find class “android.view.x”

    【SC10004】编译可以成功但是许多warning

    分享(带面板)

    new ShareAction(MainActivity.this)
    .withText("hello")
    .setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN)
    .setCallback(umShareListener).open();
    

    关于分享面板的更多功能可以参照分享面板自定义

    分享(不带面板)

    new ShareAction(MainActivity.this)
    .setPlatform(SHARE_MEDIA.QQ)//传入平台
    .withText("hello")//分享内容
    .setCallback(umShareListener)//回调监听器
    .share();
    

    其中umShareListener为回调监听,构建如下:

    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(ShareSdkActivity.this, "成功了", Toast.LENGTH_LONG).show();
            }
    
            /**
             * @descrption 分享失败的回调
             * @param platform 平台类型
             * @param t 错误原因
             */
            @Override
            public void onError(SHARE_MEDIA platform, Throwable t) {
                Log.e("失败原因", t.getMessage() + "");
                Toast.makeText(ShareSdkActivity.this, "失败了" + t.getMessage(), Toast.LENGTH_LONG).show();
            }
    
            /**
             * @descrption 分享取消的回调
             * @param platform 平台类型
             */
            @Override
            public void onCancel(SHARE_MEDIA platform) {
                Toast.makeText(ShareSdkActivity.this, "取消了", Toast.LENGTH_LONG).show();
    
            }
        };
    

    分享的消息类型

    文本

    new ShareAction(ShareSdkActivity.this)
    .withText("hello")
    .withMedia(umImage)
    .setDisplayList(SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE,SHARE_MEDIA.WEIXIN)
    .setCallback(shareListener).open();
    
    注意: 分享到QQ好友暂不支持纯文本分享,调用友盟分享可以在失败回调里面进行操作

    图片

    在使用ShareAction的时候,调用withMedia可以设置一个UMImage(图片分享),UMImage的构建有如下几种形式
    UMImage image = new UMImage(ShareActivity.this, "imageurl");//网络图片
    UMImage image = new UMImage(ShareActivity.this, file);//本地文件
    UMImage image = new UMImage(ShareActivity.this, R.drawable.xxx);//资源文件
    UMImage image = new UMImage(ShareActivity.this, bitmap);//bitmap文件
    UMImage image = new UMImage(ShareActivity.this, byte[]);//字节流
    推荐使用网络图片和资源文件的方式,平台兼容性更高。对于部分平台,分享的图片需要设置缩略图,缩略图的设置规则为:
    UMImage umImage = new UMImage(ShareSdkActivity.this, R.mipmap.tab_icon_main);
    用户设置的图片大小最好不要超过250k,缩略图不要超过18k,如果超过太多(最好不要分享1M以上的图片,压缩效率会很低),图片会被压缩。用户可以设置压缩的方式:
    
    image.compressStyle = UMImage.CompressStyle.SCALE;//大小压缩,默认为大小压缩,适合普通很大的图
    image.compressStyle = UMImage.CompressStyle.QUALITY;//质量压缩,适合长图的分享
    压缩格式设置
    image.compressFormat = Bitmap.CompressFormat.PNG;//用户分享透明背景的图片可以设置这种方式,但是qq好友,微信朋友圈,不支持透明背景图片,会变成黑色
    最后调用分享
    new ShareAction(ShareSdkActivity.this)
    .withText("hello")
    .withMedia(umImage)
    .setDisplayList(SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE,SHARE_MEDIA.WEIXIN)
    .setCallback(shareListener).open();
    

    链接

    UMWeb web = new UMWeb("http://mobile.umeng.com/social");
    web.setTitle("This is music title");//标题
    web.setThumb(new UMImage(ShareSdkActivity.this, R.mipmap.ic_launcher));  //缩略图
    web.setDescription("测试链接dhasjdh");//描述
    new ShareAction(ShareSdkActivity.this)
    .withText("测试")
     .withMedia(web)
    .setPlatform(SHARE_MEDIA.QQ)
    //.setDisplayList(SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE)
    .setCallback(shareListener)
    .share();
    

    视频

    UMVideo video = new UMVideo(videourl);
    video.setTitle("This is music title");//视频的标题
    video.setThumb(image);//视频的缩略图
    video.setDescription("my description");//视频的描述
    new ShareAction(ShareSdkActivity.this)
    .withText("测试")
    .withMedia(video)
    .setPlatform(SHARE_MEDIA.QZONE)
    //.setDisplayList(SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE)
    .setCallback(shareListener)
    .share();
    

    音乐

    UMImage image1 = new UMImage(ShareSdkActivity.this, "http://www.umeng.com/images/pic/social/chart_1.png");//网络图片
    UMusic music = new UMusic(musicurl);//音乐的播放链接
    music.setTitle("This is music title");//音乐的标题
    music.setThumb(image1);//音乐的缩略图
    music.setDescription("my description");//音乐的描述
    music.setmTargetUrl(url);//音乐的跳转链接
    new ShareAction(ShareSdkActivity.this)
    .withText("测试")
    .withMedia(music)
    .setPlatform(SHARE_MEDIA.QZONE)
    //.setDisplayList(SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE)
    .setCallback(shareListener)
    .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.umeng_socialize_qzone));
    new ShareAction(ShareSdkActivity.this)
    .withText("测试")
    .withMedia(emoji)
    .setPlatform(SHARE_MEDIA.QZONE)
    //.setDisplayList(SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE)
    .setCallback(shareListener)
    .share();
    

    相关阅读:
    分享失败相关问题
    【SC10016】分享图片的大小限制是多少?
    【SC10018】如何实现不同分享平台分享不同的内容

    QQ授权登录

    这里我判断的是如果以获取授权直接获取用户信息
    如果每次都需要授权的话 新加一个退出登录按钮 点击删除授权
    获取用户QQ授权状态 true 已授权 false 未授权

    boolean isauth = UMShareAPI.get(ShareSdkActivity.this).isAuthorize(ShareSdkActivity.this, SHARE_MEDIA.QQ);
    if (isauth) {
    //已经授权成功过,直接去结果界面获取用户信息
    startActivityFinish(LoginResultActivity.class);
    } else {
    //授权      
    UMShareAPI.get(this).doOauthVerify(ShareSdkActivity.this, SHARE_MEDIA.QQ, authListener);
    }
    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) {
                startActivityFinish(LoginResultActivity.class);
                Toast.makeText(ShareSdkActivity.this, "成功了", Toast.LENGTH_LONG).show();
            }
    
            /**
             * @desc 授权失败的回调
             * @param platform 平台名称
             * @param action 行为序号,开发者用不上
             * @param t 错误原因
             */
            @Override
            public void onError(SHARE_MEDIA platform, int action, Throwable t) {
    
                Toast.makeText(ShareSdkActivity.this, "失败:" + t.getMessage(), Toast.LENGTH_LONG).show();
            }
    
            /**
             * @desc 授权取消的回调
             * @param platform 平台名称
             * @param action 行为序号,开发者用不上
             */
            @Override
            public void onCancel(SHARE_MEDIA platform, int action) {
                Toast.makeText(ShareSdkActivity.this, "取消了", Toast.LENGTH_LONG).show();
            }
        };
    
    String name = data.get("name");
    String gender = data.get("gender");
    String iconurl = data.get("iconurl");
    Log.e("姓名", name + "");
    Log.e("性别", gender + "");
    Log.e("头像Url", iconurl + "");
    

    登录成功后,第三方平台会将用户资料传回, 全部会在Map data中返回,,由于各个平台对于用户资料的标识不同,因此为了便于开发者使用,友盟将一些常用的字段做了统一封装,开发者可以直接获取,不再需要对不同平台的不同字段名做转换,这里列出我们封装的字段及含义。

    用户信息.png

    相关阅读:授权失败相关问题
    【SQ10003】QQ的unionID为空

    删除授权

    UMShareAPI.get(ShareSdkActivity.this).deleteOauth(ShareSdkActivity.this, SHARE_MEDIA.QQ,authListener);
    

    有很多集体的细节我们需要去友盟官方文档查看

    下一篇会将通过友盟实现微信、微博剩余的相关操作以及封装到工具类方便后续使用期待你的关注!!!

    第三方登录、分享相关文章阅读

    1、手把手带你实现QQ登录
    2、手把手带你实现QQ分享
    3、手把手带你集成友盟实现授权登录、分享

    相关文章

      网友评论

        本文标题:手把手带你集成友盟实现授权登录、分享

        本文链接:https://www.haomeiwen.com/subject/ybqiectx.html