Android Studio整合百度推送遇到的坑
之前做過友盟推送,感覺挺簡單的,因此做百度推送的時候也沒當回事,結果悲劇了!!!
看過文件之後,也挺失望,現在都用AS了,百度推送官網卻還是隻針對eclipse整合的文件,因此看了文件之後,又進行了一番度娘,以下進行重點總結:
1.首先需要在百度推送官網建立應用,並啟用推送功能,如下圖。
2.在配置詳情頁中,掃描二維碼或者點選下載SDK,可以下載對應包名的demo。
3.下載demo後,可以先安裝demo中的APK測試一下。如圖,成功收到訊息。
到這裡心裡小小的竊喜一下,感覺哎呦,百度推送還是挺好用的嘛!
**4.新建一個工程,將自己需要的檔案提取出來,儘可能的去掉無用的東西。**demo中包好了許多功能是你用不到的,因此需要將自己需要功能的相關檔案摘出來。結果測試沒問題。需要的東西如下:
pushservice-5.2.0.12.jar包
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在同一目錄
初始化程式碼,官方建議放在主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, 1, cBuilder);
特別是鈴聲,音訊檔案要放到raw資料夾下,並且程式碼中要將Uri路徑傳給cBuilder.setNotificationSound()方法。
總結一下,百度推送我遇到的大坑:
.so檔案需要放入jniLibs檔案加下,並且gradle中要配置路徑!!
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
或者去掉,但是不能配置錯了。