天天看點

Android Studio內建百度推送遇到的坑

之前做過友盟推送,感覺挺簡單的,是以做百度推送的時候也沒當回事,結果悲劇了!!!

看過文檔之後,也挺失望,現在都用AS了,百度推送官網卻還是隻針對eclipse內建的文檔,是以看了文檔之後,又進行了一番度娘,以下進行重點總結:

1.首先需要在百度推送官網建立應用,并啟用推送功能,如下圖。

Android Studio內建百度推送遇到的坑

2.在配置詳情頁中,掃描二維碼或者點選下載下傳SDK,可以下載下傳對應包名的demo。

Android Studio內建百度推送遇到的坑

3.下載下傳demo後,可以先安裝demo中的APK測試一下。如圖,成功收到消息。

Android Studio內建百度推送遇到的坑

到這裡心裡小小的竊喜一下,感覺哎呦,百度推送還是挺好用的嘛!

**4.建立一個工程,将自己需要的檔案提取出來,盡可能的去掉無用的東西。**demo中包好了許多功能是你用不到的,是以需要将自己需要功能的相關檔案摘出來。結果測試沒問題。需要的東西如下:

pushservice-5.2.0.12.jar包,所有的.so檔案,notification_custom_builder.xml(這是通知欄的布局),

AndroidManifest.xm中的權限:

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <!-- 适配Android N系統必需的ContentProvider寫權限聲明,寫權限包含應用包名-->
    <uses-permission android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.kw.crazyfrog" />
    <permission
        android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.kw.crazyfrog"
        android:protectionLevel="normal">
    </permission>


 <!-- push富媒體,不使用富媒體推送不需要 -->
        <activity
            android:name="com.baidu.android.pushservice.richmedia.MediaViewActivity"
            android:configChanges="orientation|keyboardHidden"
            android:label="MediaViewActivity" >
        </activity>
        <activity
            android:name="com.baidu.android.pushservice.richmedia.MediaListActivity"
            android:configChanges="orientation|keyboardHidden"
            android:label="MediaListActivity"
            android:launchMode="singleTask" >
        </activity>
        <!-- push富媒體結束 -->

        <!-- push應用定義消息receiver聲明 -->
        <receiver android:name="com.baidu.push.example.MyPushMessageReceiver">
            <intent-filter>
                <!-- 接收push消息 -->
                <action android:name="com.baidu.android.pushservice.action.MESSAGE" />
                <!-- 接收bind,unbind,fetch,delete等回報消息 -->
                <action android:name="com.baidu.android.pushservice.action.RECEIVE" />
                <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
            </intent-filter>
        </receiver>

        <!-- push必須的receviver和service聲明 -->
        <receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"
            android:process=":bdservice_v1">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
                <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
        <!-- 以下四項為可選的action聲明,可大大提高service存活率和消息到達速度 -->
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
        <action android:name="android.intent.action.USER_PRESENT" />
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.baidu.android.pushservice.RegistrationReceiver"
            android:process=":bdservice_v1">
            <intent-filter>
                <action android:name="com.baidu.android.pushservice.action.METHOD" />
                <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED"/>
                <data android:scheme="package" />
            </intent-filter>                   
        </receiver>
        <service
            android:name="com.baidu.android.pushservice.PushService"
            android:exported="true"
            android:process=":bdservice_v1"  >
            <intent-filter>
                <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
            </intent-filter>
        </service>
    <service android:name="com.baidu.android.pushservice.CommandService"
            android:exported="true" />
        <!-- push結束 -->

        <!-- 适配Android N系統必需的ContentProvider聲明,寫權限包含應用包名-->
        <provider
            android:name="com.baidu.android.pushservice.PushInfoProvider"
            android:authorities="com.baidu.push.example.bdpush"
            android:writePermission="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.kw.crazyfrog"
            android:protectionLevel = "signature"
            android:exported="true" />

        <!-- 在百度開發者中心查詢應用的API Key -->
        <meta-data android:name="api_key" android:value="ohdmT4bU6ODBsBvPG21GADrb" />
           

建議:權限裡的内容别改!!

初始化代碼:

PushManager.startWork(getApplicationContext(),
                PushConstants.LOGIN_TYPE_API_KEY,
                "自己的API-KEY");
           

Reciver中的代碼:

public class MyReceiver extends PushMessageReceiver {
    @Override
    public void onBind(Context context, int i, String s, String s1, String s2, String s3) {

    }

    @Override
    public void onUnbind(Context context, int i, String s) {

    }

    @Override
    public void onSetTags(Context context, int i, List<String> list, List<String> list1, String s) {

    }

    @Override
    public void onDelTags(Context context, int i, List<String> list, List<String> list1, String s) {

    }

    @Override
    public void onListTags(Context context, int i, List<String> list, String s) {

    }

    @Override
    public void onMessage(Context context, String s, String s1) {

    }

    @Override
    public void onNotificationClicked(Context context, String s, String s1, String s2) {

    }

    @Override
    public void onNotificationArrived(Context context, String s, String s1, String s2) {

    }
}
           

好了,以上内容內建進去就能滿足基本的推送功能,建立一個工程,并內建以上内容,測試沒問題!

需要注意的是:

.so檔案要放在jniLibs檔案夾中,jniLibs檔案夾在main目錄下,與java在同一目錄

Android Studio內建百度推送遇到的坑

初始化代碼,官方建議放在主Activity中,而非Application中

5.既然自己建的demo也沒問題,那就可以內建到項目中了吧,好開始內建

jar包,.so檔案,權限,布局檔案,初始化代碼,自己建Receiver檔案等等,很快就內建完畢。

經過測試,不行!!!!!,接收不到消息。

想啊想,不知道錯在哪,然後開始懷疑是不是包沖突了?然後各種方法排除測試等等,沒得到任何結論!!

我用三個手機測試,分别是魅藍note2-5.0系統,三星-4.4系統,華為mate9-6.0系統。

這三個手機,運作demo測試,均沒問題,都可以接受到通知。

但項目中內建的百度推送,隻有5.0系統的魅藍手機可以接收到消息,另兩個手機都不行。于是乎,開始懷疑是不是系統相容性問題等等,無果。

然後看大神們寫的部落格,不小心看到一句話

http://blog.csdn.net/cdkd123/article/details/50521924

在build.gradle裡要配置下:

sourceSets {  
        main {   
            jniLibs.srcDirs = ['src/main/jniLibs']  
        }  
}  
           

而不是

sourceSets {  
        main {   
            jniLibs.srcDirs = ['libs']  
        }  
}  
           

我試了試,去掉這句話也可以。

注意,項目中本來配置着

在官網,建議使用Android Studio工具開發者,将.so檔案放入jniLibs目錄下,奶奶的,為啥不說清楚,gradle中也需要配置!!!

就這樣,問題解決了。

此外說一下,如果要自定義鈴聲或通知欄樣式,需要在初始化代碼後面加入一下代碼

Resources resource = this.getResources();
        String pkgName = this.getPackageName();
        CustomPushNotificationBuilder cBuilder = new CustomPushNotificationBuilder(
                resource.getIdentifier(
                        "notification_custom_builder", "layout", pkgName),
                resource.getIdentifier("notification_icon", "id", pkgName),
                resource.getIdentifier("notification_title", "id", pkgName),
                resource.getIdentifier("notification_text", "id", pkgName));
        cBuilder.setNotificationFlags(Notification.FLAG_AUTO_CANCEL);
        cBuilder.setNotificationDefaults(Notification.DEFAULT_VIBRATE);
        cBuilder.setStatusbarIcon(this.getApplicationInfo().icon);
        cBuilder.setLayoutDrawable(resource.getIdentifier(
                "rty", "drawable", pkgName));
        cBuilder.setNotificationSound((Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.kuangwa)).toString());
        // 推送進階設定,通知欄樣式設定為下面的ID
        PushManager.setNotificationBuilder(this, , cBuilder);
           

特别是鈴聲,音頻檔案要放到raw檔案夾下,并且代碼中要将Uri路徑傳給cBuilder.setNotificationSound()方法。

總結一下,百度推送我遇到的大坑:

.so檔案需要放入jniLibs檔案加下,并且gradle中要配置路徑!!

sourceSets {  
        main {   
            jniLibs.srcDirs = ['src/main/jniLibs']  
        }  
}  
           

或者去掉,但是不能配置錯了。