友盟实现

作者: 夜沐下的星雨 | 来源:发表于2020-09-13 20:20 被阅读0次

在最近使用三方友盟时,每次根据文档生成时都会出现错误,运气好了两天,不好一周,并且随着三方版本的更新,如何在我们的项目中更新这个三方版本呢?
至此我将这个友盟分成模块,每次更改只需要更改这个模块就可以了
下图我创的模块:



下载Umeng SDK将里面的内容粘贴到上图对应的包 中。

https://developer.umeng.com/docs/66632/detail/66639#h3--

  1. 自己去友盟,微信,qq,微博等平台注册账号,拿到各种key,appId

    注意: 注册账号的时候,包名(applicationId)和签名信息一定不要搞错了。签名信息一定要用你自己准备用来打包的那个签名文件里面的签名信息(MD5)

  2. 默认已经集成了 QQ,微信,微博。如果需要增加新的分享或者第三方登录的平台,只需要按照集成文档粘贴过去即可

  3. 在ShareUtils.java 这个类中 把自己的ID 替换掉即可

  4. 在你自己app 代码里面 任意地方(类,字段,方法)加一个 @Umeng("your.applicationId")

  5. 对于 QQ ,微博等平台,需要在你 分享或者登录的 Activity 中重写,否则收不到回调 :

    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
        }
    
  1. 如果需要升级友盟分享:

    1. 替换Libs 下面的jar 和 aar 包。
    2. 替换 res 目录下的所有资源文件
    3. 替换 consumer-rules.pro 下面的混淆规则
    4. 更具最新版的改动在在相应的地放修改(主要是AndroidManifest 文件)

注意:

// wx 的 有效期是1个月。过了1个月就必须重新授权登录。没有过期则不用跳转到授权页面,直接返回用户相关信息。

// qq 的 access_token_有效期是三个月。过了三个月就必须重新授权登录。没有过期则不用跳转到授权页面,直接返回用户相关信息。

qq 不支持纯文本分享

qq 和 微信 不支持图文同时分享,只会把图片分享过去。

微信分享成功后,停留在微信页面,是没有回调的

友盟问题汇总

以下是我粘贴的代码:
创建ShareUtils:获取友盟所需要的secret 和id


public class ShareUtils {
    /**
     *
     * @param context
     * @param channel 渠道号
     * @param isDebug 是否打开debug 日子
     */
    public static void init(Context context,String channel,boolean isDebug){
        UMConfigure.setLogEnabled(isDebug);
        MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.LEGACY_MANUAL);
        //平台表单名称
        PlatformName.SINA="新浪微博";
        /**
         * 初始化common库
         * 参数1:上下文,不能为空
         * 参数2:【友盟+】 AppKey
         * 参数3:【友盟+】 Channel
         * 参数4:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
         * 参数5:Push推送业务的secret
         */
        UMConfigure.init(context,"5da416070cafb26975000f3f",channel,UMConfigure.DEVICE_TYPE_PHONE,"");
        //第一个参数表示 AppID ,第二:AppSecret
        PlatformConfig.setWeixin("wxc18a6ee8aede4929", "cc1459aa71cc4c3ea24232d62df6231d"); 
        //第一个参数表示 APP ID ,第二:APP KEY
        PlatformConfig.setQQZone("1109759123", "a3x6lGx32PYMrmK3");
        PlatformConfig.setQQFileProvider("com.m.k.umeng.share.fileProvider");
        // 第一个参数表示 APP ID ,第二:App Secret,第三: 回调 地址
        PlatformConfig.setSinaWeibo("110298133","afb59986db07d0b9b0886e9980d28d1c","https://www.seetao.com");
    }
}

创建UmengQQShareProvider:

public class UmengQQShareProvider extends FileProvider {
}

在清单文件中填写:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.m.k.umeng" >



    <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" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application>

        <uses-library android:name="org.apache.http.legacy" android:required="false"/>

        <!--新浪-->
        <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>

        <!--新浪-->


        <!--微信-->
        <activity
                android:name="${applicationId}.wxapi.WXEntryActivity"
                android:configChanges="keyboardHidden|orientation|screenSize"
                android:exported="true"
                android:screenOrientation="portrait"
                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" />
                <!--记得把100424468 替换成你自己在qq 平台申请的 id,不要把 tencent 删掉-->
                <data android:scheme="tencent1109759123" />
            </intent-filter>
        </activity>
        <activity
                android:name="com.tencent.connect.common.AssistActivity"
                android:theme="@android:style/Theme.Translucent.NoTitleBar"
                android:configChanges="orientation|keyboardHidden|screenSize"/>


        <provider
            android:authorities="com.m.k.umeng.share.fileProvider"
            android:name="com.m.k.umeng.share.UmengQQShareProvider"
            android:exported="false"
            android:grantUriPermissions="true"
            >
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/mk_umeng_share_file_path"/>
        </provider>
        <!--qq-->

    </application>
</manifest>

至此这个模块就写完了。那么我们如何使用它呢?
在这我们使用了注解处理器的技术。获取当前lib需要得到App 的参数使用ApT 技术通过注解在编译器前生成代码来获取'app'中的参数
我们需要在app(提供了一个Application类,应用程序启动时系统会自动初始化该Application)中添加 :

//让应用启动后就使用
  @Umeng(BuildConfig.APPLICATION_ID)
    public void initUmengShare(){
        ShareUtils.init(this,"chanel",BuildConfig.DEBUG);
    }

至此就是使用友盟的一些分享功能和登录功能:
分享:

  UMWeb web = new UMWeb(getArguments().getString(DetailsActivity.KEY_NEW_SHARE_LINK));
                web.setTitle(getArguments().getString(DetailsActivity.KEY_NEW_TITLE));//标题
                UMImage thumb = new UMImage(getActivity(),getArguments().getString(DetailsActivity.KEY_NEW_IMAGE_URL));
                web.setThumb(thumb);  //缩略图
                web.setDescription(getArguments().getString(DetailsActivity.KEY_NEW_DESCRIPTION));//描述

                new ShareAction(getActivity()).withMedia(web).setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.WEIXIN_CIRCLE,SHARE_MEDIA.WEIXIN,SHARE_MEDIA.QQ)
                        .setCallback(new SampleShareListener() {
                            @Override
                            public void onResult(SHARE_MEDIA share_media) {
                                Logger.d();
                            }
                        }).open();

登录:

监听里写:
 login(SHARE_MEDIA.QQ);


//第三方登录
   public void login(SHARE_MEDIA media) {
       UMShareAPI umShareAPI = UMShareAPI.get(this);
       //media,三方平台
       //authListener,登录回调
       umShareAPI.getPlatformInfo(this, media, authListener);
   }

   UMAuthListener authListener = new UMAuthListener() {
       /**
        * @desc 授权开始的回调
        * @param platform 平台名称
        */
       @Override
       public void onStart(SHARE_MEDIA platform) {
           Log.e("TAG", platform.getName() + ":LoginActivity onStart()");
       }

       /**
        * @desc 授权成功的回调
        * @param platform 平台名称
        * @param action 行为序号,开发者用不上
        * @param data 用户资料返回
        */
       @Override
       public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
           logMap(data);
           Toast.makeText(LoginActivity.this, "成功了", Toast.LENGTH_LONG).show();
           Log.e("TAG", platform.getName() + "LoginActivity onComplete()");
       }

       /**
        * @desc 授权失败的回调
        * @param platform 平台名称
        * @param action 行为序号,开发者用不上
        * @param t 错误原因
        */
       @Override
       public void onError(SHARE_MEDIA platform, int action, Throwable t) {
           Log.e("TAG", platform.getName() + "LoginActivity onError()");
           Toast.makeText(LoginActivity.this, "失败:" + t.getMessage(), Toast.LENGTH_LONG).show();
       }

       /**
        * @desc 授权取消的回调
        * @param platform 平台名称
        * @param action 行为序号,开发者用不上
        */
       @Override
       public void onCancel(SHARE_MEDIA platform, int action) {
           Log.e("TAG", platform.getName() + "LoginActivity onCancel()");
           Toast.makeText(LoginActivity.this, "取消了", Toast.LENGTH_LONG).show();
       }
   };

   private void logMap(Map<String, String> data) {
       for (Map.Entry<String, String> entry : data.entrySet()) {
           Log.e("TAG", "logMap: " + entry.getKey() + "," + entry.getValue());
       }
   }

相关文章

网友评论

    本文标题:友盟实现

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