Android學習之友盟5.0推送,分享踩坑總結

隔壁小王 8年前發布 | 18K 次閱讀 友盟 Android開發 移動開發

這幾天都沒有寫博客,今天集成友盟5.0推送,分享,得閑,總結一下友盟5.0推送分享踩得哪些坑!

之前寫的友盟踩坑心得是基于友盟4.3版本的,現在友盟5.0相較于4.3,有了較大的改動,嗚呼哀哉!學而時習之吧。

友盟5.0的好處:集成推送,分享可以通過導入module的形式,代碼簡化,維護性高,(一些資源文件就不用自己慢慢去拷貝了)。

至于缺點,就是剛剛改版,會有很多跟4.3不一樣的使用方法,所以需要前人去踩坑了!

友盟推送:

1:添加Module

Android studio導入Module自不必多說,把下載的SDK里面的PushSDK當做Module導入自己的項目。

注意點:

如果是android6.0以上的api編譯,需要在PushSDK的build.gradle文件的android{}塊內添加useLibrary ‘org.apache.http.legacy’,并把compileSdkVersion的版本號改為23。

2:設置測試模式

PushAgent mPushAgent = PushAgent.getInstance(this);
        mPushAgent.setDebugMode(true);

注意:在application的oncrete()方法中添加。

3:配置AppKey & Umeng Message Secret

  <meta-data
            android:name="UMENG_APPKEY"
            android:value="570ccd8267e5s8e026e002343" />
        <meta-data
            android:name="UMENG_MESSAGE_SECRET"
            android:value="b694ba6b27bbw61ed619fb81757ece13d" />
    <receiver  android:name="com.umeng.message.NotificationProxyBroadcastReceiver" android:exported="false" />
        <receiver  android:name="com.umeng.message.SystemReceiver" android:process=":push">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />

                <data android:scheme="package" />
            </intent-filter>
        </receiver>
        <receiver  android:name="com.umeng.message.MessageReceiver" android:exported="false" android:process=":push">
            <intent-filter>
                <action android:name="org.agoo.android.intent.action.RECEIVE" />
            </intent-filter>
        </receiver>
        <receiver  android:name="com.umeng.message.ElectionReceiver" android:process=":push">
            <intent-filter>
                <action android:name="org.agoo.android.intent.action.ELECTION_RESULT_V4" />

                <category android:name="umeng" />
            </intent-filter>
        </receiver>
        <receiver  android:name="com.umeng.message.RegistrationReceiver" android:exported="false">
            <intent-filter>
                <action android:name="com.up72.ftfx.intent.action.COMMAND" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.umeng.message.UmengMessageBootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <service  android:name="com.umeng.message.UmengService" android:exported="true" android:label="PushService" android:process=":push">
            <intent-filter>
                <action android:name="com.up72.ftfx.intent.action.START" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.up72.ftfx.intent.action.COCKROACH" />
            </intent-filter>
            <intent-filter>
                <action android:name="org.agoo.android.intent.action.PING_V4" />

                <category android:name="umeng" />
            </intent-filter>
        </service>
        <service  android:name="com.umeng.message.UmengIntentService" android:process=":push" />
        <service  android:name="com.umeng.message.UmengMessageIntentReceiverService" android:exported="true" android:process=":push">
            <intent-filter>
                <action android:name="org.android.agoo.client.MessageReceiverService" />
            </intent-filter>
            <intent-filter>
                <action android:name="org.android.agoo.client.ElectionReceiverService" />
            </intent-filter>
        </service>
        <service  android:name="com.umeng.message.UmengMessageCallbackHandlerService" android:exported="false">
            <intent-filter>
                <action android:name="com.umeng.messge.registercallback.action" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.umeng.message.unregistercallback.action" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.umeng.message.message.handler.action" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.umeng.message.autoupdate.handler.action" />
            </intent-filter>
        </service>
        <!-- If you donot want to use the standard notification bar in SDK, you can define IntentService instead to handle message. -->

        <service  android:name="com.umeng.message.UmengDownloadResourceService" android:exported="false" />
        <service  android:name="com.umeng.message.local.UmengLocalNotificationService" android:exported="false" />

注意:配置在清單文件中,確保和友盟后臺注冊應用信息是一致的。

4:開啟推送服務

在應用主Activity中(一般就是MainActivity)添加

PushAgent mPushAgent = PushAgent.getInstance(this);
        mPushAgent.enable();
        if (mPushAgent.isEnabled() || UmengRegistrar.isRegistered(this)) {
            device_token = mPushAgent.getRegistrationId();
            Log.e("device_token", device_token);
        }

獲取Device Token,

注意:device_token要在友盟后臺添加測試Token才能進行推送測試,否則機器接受不到。

mPushAgent.disable(); 關閉推送服務

PushAgent.getInstance(context).onAppStart(); 開啟統計,在所有Activity中的Oncrete()中添加

5:消息的接收

UmengMessageHandler messageHandler = new UmengMessageHandler() {
            /** * 參考集成文檔的1.6.3 * http://dev.umeng.com/push/android/integration#1_6_3 * */
            @Override
            public void dealWithCustomMessage(final Context context, final UMessage msg) {
                new Handler().post(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        // 對自定義消息的處理方式,點擊或者忽略
                        boolean isClickOrDismissed = true;
                        if (isClickOrDismissed) {
                            //自定義消息的點擊統計
                            UTrack.getInstance(getApplicationContext()).trackMsgClick(msg);
                        } else {
                            //自定義消息的忽略統計
                            UTrack.getInstance(getApplicationContext()).trackMsgDismissed(msg);
                        }
                    }
                });
            }
        };
        mPushAgent.setMessageHandler(messageHandler);
        mPushAgent.enable();
    }

注意:在Application的Oncrete()方法中添加此方法

這樣就可以接收到消息了。

友盟分享:(只講述新浪,QQ,QQzone,微信,朋友圈)

1:集成友盟5.0分享sdk

這里寫圖片描述

友盟提供了兩種集成方式

1.解壓SDK壓縮包,將文件夾中的’main/libs’和’main/res’文件夾復制到你的項目工程根目錄下(如使用’ADT 17’以下用戶需要手動添加’libs’下的jar文件到工程Path中)

2.解壓SDK壓縮包,將文件夾中的social_sdk_library_project文件夾導入Eclipse,并在您的工程中添加對此項目的引用即可。

這里為了方便和維護,我選擇了第二種方式,Android studio也可以將其作為module導入。

2:清單文件配置

<activity  android:name="com.umeng.socialize.editorpage.ShareActivity" android:excludeFromRecents="true" android:theme="@style/Theme.UMDefault" />
        <activity  android:name="com.up72.ftfx.wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <activity  android:name="com.up72.ftfx.WBShareActivity" android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait">
            <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="com.sina.weibo.sdk.component.WeiboSdkBrowser" android:configChanges="keyboardHidden|orientation" android:exported="false" android:windowSoftInputMode="adjustResize" />

        <service  android:name="com.sina.weibo.sdk.net.DownloadService" android:exported="false" />

        <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:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" />

具體可以看友盟文檔,這里只包括了新浪,QQ,QQZone,微信,朋友圈的

這里寫圖片描述

注意:微信,已經新浪微博的回調Activity路徑
注意:AuthActivity的android:scheme,格式為tencent+appID

權限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.SET_DEBUG_APP" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />

3:初始化配置

  void initUM() {
        PlatformConfig.setWeixin("wx79afb257f799bb67", "e6ac6f3e1a9a0c318334e1e35b15df28");
        //微信 appid appsecret
        PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad");
        //新浪微博 appkey appsecret
        PlatformConfig.setQQZone("1105327228", "GYttMYCpxiGOfY5v");
        // QQ和Qzone appid appkey
    }

注意:集成到Application中,進行初始化

4:分享

public void shareContent() {
        image = new UMImage(getActivity(),
                BitmapFactory.decodeResource(getResources(), R.mipmap.icon));
        new ShareAction(getActivity()).setDisplayList(SHARE_MEDIA.SINA, SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE, SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE)
                .setShareboardclickCallback(shareBoardlistener)
                .open();

    }

    private UMShareListener umShareListener = new UMShareListener() {
        @Override
        public void onResult(SHARE_MEDIA platform) {
            Toast.makeText(getActivity(), platform + " 分享成功啦", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(SHARE_MEDIA platform, Throwable t) {
//            Toast.makeText(getActivity(), platform + " 分享失敗啦", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCancel(SHARE_MEDIA platform) {
//            Toast.makeText(getActivity(), platform + " 分享取消了", Toast.LENGTH_SHORT).show();
        }
    };

    private ShareBoardlistener shareBoardlistener = new ShareBoardlistener() {

        @Override
        public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) {
            switch (share_media) {
                case SINA:
                    new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.SINA).setCallback(umShareListener)
                            .withTitle("分享app")
                            .withText(
                                    "測試"
                                            + "url")
                            .withMedia(image)
                            .share();
                    break;
                case QQ:
                    new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.QQ).setCallback(umShareListener)
                            .withTitle("分享app")
                            .withText("hello umeng")
                            .withTitle("qqshare")
                            .withMedia(image)
                            .withTargetUrl("http://dev.umeng.com")
                            .share();
                    break;
                case QZONE:
                    new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.QZONE).setCallback(umShareListener)
                            .withTitle("分享app")
                            .withText("hello umeng")
                            .withMedia(image)
                            .withTargetUrl("https://open.weixin.qq.com/cgi-bin/appdetail?t=manage/detail&type=app&lang=zh_CN&token=d3211865a37fad17d540149aff67a8eee8473739&appid=wx79afb257f799bb67")
                            .share();
                    break;
                case WEIXIN:
                    new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.WEIXIN).setCallback(umShareListener)
                            .withTitle("分享app")
                            .withMedia(image)
                            .withText("hello umeng")
                            .share();
                    break;
                case WEIXIN_CIRCLE:
                    new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.WEIXIN_CIRCLE).setCallback(umShareListener)
                            .withTitle("分享app")
                            .withMedia(image)
                            .share();
                    break;
            }

        }
    };

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        UMShareAPI.get(getActivity()).onActivityResult(requestCode, resultCode, data);
    }

這里集成的很全面,具體還是介紹下吧

我這里為了防止分享內容不一致,將其分開寫了

分享一致內容:

/**普通分享面板,分享相同一致內容**/
               new ShareAction(this).setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.QZONE,SHARE_MEDIA.WEIXIN,SHARE_MEDIA.WEIXIN_CIRCLE)
                      .setShareboardclickCallback(shareBoardlistener)
                       .open();

這里友盟對分享代碼做了極大的簡化,提高了我們的開發效率與集成速度

注意:

微信分享:微信只注意一個問題—–>簽名問題

為了防止每次都打線上的包來測試,我們可以將as的debug.keystore的MD5簽名獲取到,去掉冒號(:),大寫變小寫,在微信開發平臺上將注冊的應用包名改為本機debug簽名,測試通了,在改為正式簽名。

QQ分享:初始化配置沒問題就問題不大,主要問題在QQ空間分享時,會出現

這里寫圖片描述

這是比較坑壁的,不多說,騰訊攔截了分享鏈接,用友盟測試鏈接也不會通過的,換上正式鏈接可能就不會出現這個問題

以QQ空間分享為例:

                    new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.QZONE).setCallback(umShareListener)
                            .withTitle("分享app")
                            .withText("hello umeng")
                            .withMedia(image)
                            .withTargetUrl("https://open.weixin.qq.com/cgi-bin/appdetail?t=manage/detail&type=app&lang=zh_CN&token=d3211865a37fad17d540149aff67a8eee8473739&appid=wx79afb257f799bb67")
                            .share();

這里withTargetUrl不能少,去掉就會分享不成功。

新浪分享:

注意:新浪分享的title是不顯示的,URL鏈接只能加在分享文字后顯示,并且需要確保withText()不為空

當同時傳遞URL參數和圖片時,注意確保圖片不能超過32K,否則無法分享,不傳遞URL參數時圖片不受32K限制

 new ShareAction(getActivity()).setPlatform(SHARE_MEDIA.SINA).setCallback(umShareListener)
                            .withTitle("分享app")
                            .withText("測試" + "url")
                            .withMedia(image)
                            .share();

不要輕信demo啊,可以作為參考,但不一定完全正確。

至于第三方登錄,我也講講吧

第三方登錄:講白了,就是授權,獲取用戶信息兩部分

授權部分

 private UMAuthListener umAuthListener = new UMAuthListener() {
        @Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            Toast.makeText(getApplicationContext(), "Authorize succeed", Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onError(SHARE_MEDIA platform, int action, Throwable t) {
            Toast.makeText( getApplicationContext(), "Authorize fail", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCancel(SHARE_MEDIA platform, int action) {
            Toast.makeText( getApplicationContext(), "Authorize cancel", Toast.LENGTH_SHORT).show();
        }
    };

至于獲取用戶信息

已授權的平臺,可以獲取用戶信息(新浪微博可以獲取用戶好友列表) 實現的方法與授權和解除授權類似:

mShareAPI = UMShareAPI.get(this);

初始化UMShareAPI,然后進行用戶信息獲取:

mShareAPI.getPlatformInfo(UserinfoActivity.this, platform, umAuthListener);

對于新浪微博好友列表的獲取使用的接口是:

mShareAPI.getFriend(UserinfoActivity.this, SHARE_MEDIA.SINA, umGetfriendListener);

注意要重寫

onActivityResult()

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mShareAPI.onActivityResult(requestCode, resultCode, data);
} 

算了,copy一點,關于信息字段,可以打斷點看看返回內容,也可以參考我在友盟4.3版本所寫的。

 

來自: http://blog.csdn.net/qq_16131393/article/details/51243942

 本文由用戶 隔壁小王 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!