百度推送 集成實例

選擇推送平臺時,根據需求,比較了極光推送和百度推送,最後決定選擇百度,心裏覺得,百度相對碩大一些。
從小白開始,step by step
1. 註冊百度賬號。
2. 快速創建應用,先體驗一把推送的感覺
在新版的管理控制平臺,點擊管理控制平臺,創建應用,渠道那個什麼的,不用管,創建成功後,會產生應用相關的信息。
圖片說明文字
有了API key 這個玩意,推送第一步已經完成了。
看這個界面
圖片說明文字

點擊推送設置--->設置包名---->快速示例---->下載Android示例。這樣,一個快速demo 就完成了。把這個項目導入到Eclipse中,直接運行,在控制平臺發送消息,demo 就可以收到了。
百度推送的消息分爲以下幾種:1. 通知,就是android的下拉通知,在通知欄裏面有顯示;2 消息,百度所謂的透傳消息。在通知欄裏沒有顯示。3. 富媒體,這個可以推送圖片、語音、甚至視頻,正在測試階段。
百度推送的幾個重要的名稱,這個得理解清楚了。
API Key :應用標識,服務端綁定和推送都要用到
Secret Key :應用私鑰,服務端推送時用到
APP ID: 這個id ,就是個id ,雖然也有唯一行,暫時沒什麼用
channel ID:推送通道id,通常對應一臺終端。同樣的一個app ,裝在手機A 和手機B上,channel id是不同的。
user id : 應用的用戶id,同一個用戶,可以在不同的終端上擁有同一個app 。user id 和 channel id 配合使用,可以指定到唯一用戶的唯一終端。
清楚了這些,接着就把這些東西集成到自己的項目中。
3.將SDK添加到自己工程。
3.1 添加lib 文件,layout 相關的文件,可以自己寫,官方給你的demo 中的,也可以使用。添加完成後,是這個樣子。
圖片說明文字
3.2 將工程的Application 類繼承 FrontiaApplication 類,並且添加上 super.onCreate() 這一句話,否則會崩潰。這句話,是SDK用戶使用手冊中的,似乎很嚴重的樣子,不明覺厲。

```public class DemoApplication extends FrontiaApplication{

1
2
3
4
5
6
@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();

}

}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 3.3  AndroidManifest.xml 中添加使用權限

    <!-- Push service 運行需要的權限 -->
    <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" />

    <!-- for log. -->
    <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.SYSTEM_ALERT_WINDOW"/>
    <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" />

3.4 註冊Activity 和Broadcast Receiver
    自己的Activity就不說了,推送使用到富媒體的,註冊這兩個Activity
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
     <!-- push service rich media display -->
    <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>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
         註冊自定義的Broadcast Receiver 
        <!-- push service client -->
        <!--這個是自己定義的-->
        <receiver android:name="your package.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>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    //註冊服務端service
    <!-- push 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" />
        </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" />
1
2
3
4
5
最後,別忘了添加API Key


```java
<meta-data android:name="api_key" android:value="your API Key" />

3.5 調用API
3.5.1 綁定: 默認綁定是自動完成的。無賬號綁定就用這個方法

1
2
3
4
    PushManager.startWork(getApplicationContext(),
                      PushConstants.LOGIN_TYPE_API_KEY, 
                      Utils.getMetaValue(MainActivity.this, "api_key"));
//Utils 工具類是官方提供好的。

綁定的結果,會在MyPUshMessageReceiver 類的 OnBind() 方法中返回

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
     * 調用PushManager.startWork後,sdk將對push server發起綁定請求,這個過程是異步的。綁定請求的結果通過onBind返回。
     * 如果您需要用單播推送,需要把這裏獲取的channel id和user id上傳到應用server中,再調用server接口用channel id和user id給單個手機或者用戶推送。
     * 
     * @param context
     *          BroadcastReceiver的執行Context
     * @param errorCode
     *          綁定接口返回值,0 - 成功
     * @param appid 
     *          應用id。errorCode非0時爲null
     * @param userId
     *          應用user id。errorCode非0時爲null
     * @param channelId
     *          應用channel id。errorCode非0時爲null
     * @param requestId
     *          向服務端發起的請求id。在追查問題時有用;
     * @return
     *     none
     */
    @Override
    public void onBind(Context context, int errorCode, String appid, 
                String userId, String channelId, String requestId) {
        String responseString = "onBind errorCode=" + errorCode + " appid="
                + appid + " userId=" + userId + " channelId=" + channelId
                + " requestId=" + requestId;
        Log.e(TAG, responseString);

        // 綁定成功,設置已綁定flag,可以有效的減少不必要的綁定請求
        if (errorCode == 0) {
            Utils.setBind(context, true);
            Log.e(TAG, responseString+"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        }
        // Demo更新界面展示代碼,應用請在這裏加入自己的處理邏輯
        updateContent(context, responseString);
    }

接受通知後的處理方法,在通知沒有點擊前,是無法獲取通知內容的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    /**
     * 接收通知點擊的函數。注:推送通知被用戶點擊前,應用無法通過接口獲取通知的內容。
     * 
     * @param context 上下文
     * @param title 推送的通知的標題
     * @param description 推送的通知的描述
     * @param customContentString 自定義內容,爲空或者json字符串
     */
    @Override
    public void onNotificationClicked(Context context, String title, 
                String description, String customContentString) {
        String notifyString = "通知點擊 title="" + title + "" description=""
                + description + "" customContent=" + customContentString;
        Log.d(TAG, notifyString);

        // 自定義內容獲取方式,mykey和myvalue對應通知推送時自定義內容中設置的鍵和值
        if (customContentString != null & customContentString != "") {
            JSONObject customJson = null;
            try {
                customJson = new JSONObject(customContentString);
                String myvalue = null;
                if (customJson.isNull("mykey")) {
                    myvalue = customJson.getString("mykey");
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        // Demo更新界面展示代碼,應用請在這裏加入自己的處理邏輯
        updateContent(context, notifyString);
    }
//customContentString 可以自定義通知的格式和內容

       {
        //android必選,ios可選
        "title" : "hello" ,   
        description: "hello world" 

        //android特有字段,可選
        "notification_builder_id": 0,
        "notification_basic_style": 7,
        "open_type":0,
        "net_support" : 1,
        "user_confirm": 0,
        "url": "http://developer.baidu.com",
        "pkg_content":"",
        "pkg_name" : "com.baidu.bccsclient",
        "pkg_version":"0.1",

        //android自定義字段
        "custom_content": {
        "key1":"value1", 
        "key2":"value2"
        },  

        //ios特有字段,可選
       "aps": {
        "alert":"Message From Baidu Push",
        "Sound":"",
        "Badge":0
       },

       //ios的自定義字段
         "key1":"value1", 
         "key2":"value2"
      }

在MyPushMessageReceiver中,有幾個很重要的方法,設置標籤,刪除標籤,解除綁定等。

3.5.2 設置通知樣式
默認的通知欄,基本可以滿足需要的,要是想自定義,也有這樣的接口。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 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_SOUND | Notification.DEFAULT_VIBRATE);
        cBuilder.setStatusbarIcon(this.getApplicationInfo().icon);
        cBuilder.setLayoutDrawable(resource.getIdentifier("simple_notification_icon", "drawable", pkgName));
        PushManager.setNotificationBuilder(this, 1, cBuilder);

//爲什麼給的demo 中要搞這麼高深,偶也不知道。
CustomPushNotificationBuilder(1,2,3,4);四個參數 1layout 文件,2,通知欄圖標id 3title id ,4, text id ,對應description 字段。
// 在這裏,我一定要大聲的告訴你。Notification,一定要設置icon ,不然就看不到下拉通知。因爲這個問題,我找了一天半呀!

還有兩個兩個方法,設置標籤,刪除標籤。

1
2
3
4
5
6
7
8
// Push: 刪除tag調用方式
                        List<String> tags = Utils.getTagsList(textviewGid.getText().toString());
                        PushManager.delTags(getApplicationContext(), tags);


// Push: 設置tag調用方式
                        List<String> tags = Utils.getTagsList(textviewGid.getText().toString());
                        PushManager.setTags(getApplicationContext(), tags);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章