页首Html代码

work_weipa_百度云推送

问题:怎么实现消息推送?

回答:下载sdk,根据文档操作即可

资料:http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/clientsdk看文档和sdk(客户端+服务端)

例子:

导包:



配置:

AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>  
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
        package="com.example.weipa"  
        android:versionCode="1"  
        android:versionName="1.0" >  
      
        <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="17"/>  
        <!-- 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" />  
        <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" />  
           
        <application android:name="com.baidu.push.example.DemoApplication"  
            android:icon="@drawable/ic_launcher"  
            android:label="@string/app_name">  
            <activity  
                android:name="com.baidu.push.example.PushDemoActivity"  
                android:launchMode="singleTask"  
                android:screenOrientation="portrait"  
                android:label="@string/app_name" >  
                <intent-filter>  
                    <action android:name="android.intent.action.MAIN" />  
                    <category android:name="android.intent.category.LAUNCHER" />  
                </intent-filter>  
            </activity>  
            <activity  
                android:name="com.baidu.push.example.LoginActivity"  
                android:configChanges="orientation|keyboardHidden"  
                android:label="@string/login" >  
            </activity>  
              
            <activity  
                android:name="com.baidu.push.example.CustomActivity"  
                android:launchMode="singleTask"  
                android:configChanges="orientation|keyboardHidden" >  
            </activity>  
      
            <!-- 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="你的包名.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" />  
                </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>  
            <!-- push结束 -->  
              
            <!-- 在百度开发者中心查询应用的API Key -->  
            <meta-data android:name="api_key" android:value="URzcY5unGHBQb8o8fLS1wGHu" />  
        </application>  
      
    </manifest>  
View Code

 

MyPushMessageReceiver.java
    import com.baidu.frontia.api.FrontiaPushMessageReceiver;  
      
    /** 
     * Push消息处理receiver。请编写您需要的回调函数, 一般来说: onBind是必须的,用来处理startWork返回值; 
     * onMessage用来接收透传消息; onSetTags、onDelTags、onListTags是tag相关操作的回调; 
     * onNotificationClicked在通知被点击时回调; onUnbind是stopWork接口的返回值回调 
     *  
     * 返回值中的errorCode,解释如下:  
     *  0 - Success 
     *  10001 - Network Problem 
     *  30600 - Internal Server Error 
     *  30601 - Method Not Allowed  
     *  30602 - Request Params Not Valid 
     *  30603 - Authentication Failed  
     *  30604 - Quota Use Up Payment Required  
     *  30605 - Data Required Not Found  
     *  30606 - Request Time Expires Timeout  
     *  30607 - Channel Token Timeout  
     *  30608 - Bind Relation Not Found  
     *  30609 - Bind Number Too Many 
     *  
     * 当您遇到以上返回错误时,如果解释不了您的问题,请用同一请求的返回值requestId和errorCode联系我们追查问题。 
     *  
     */  
    public class MyPushMessageReceiver extends FrontiaPushMessageReceiver {  
        /** TAG to Log */  
        public static final String TAG = MyPushMessageReceiver.class  
                .getSimpleName();  
      
        /** 
         * 调用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.d(TAG, responseString);  
      
            // 绑定成功,设置已绑定flag,可以有效的减少不必要的绑定请求  
            if (errorCode == 0) {  
                Utils.setBind(context, true);  
            }  
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑  
            updateContent(context, responseString);  
        }  
      
        /** 
         * 接收透传消息的函数。 
         *  
         * @param context 
         *            上下文 
         * @param message 
         *            推送的消息 
         * @param customContentString 
         *            自定义内容,为空或者json字符串 
         */  
        @Override  
        public void onMessage(Context context, String message,  
                String customContentString) {  
            String messageString = "透传消息 message=\"" + message  
                    + "\" customContentString=" + customContentString;  
            Log.d(TAG, messageString);  
      
            // 自定义内容获取方式,mykey和myvalue对应透传消息推送时自定义内容中设置的键和值  
            if (!TextUtils.isEmpty(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, messageString);  
        }  
      
        /** 
         * 接收通知点击的函数。注:推送通知被用户点击前,应用无法通过接口获取通知的内容。 
         *  
         * @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 (!TextUtils.isEmpty(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);  
        }  
      
        /** 
         * setTags() 的回调函数。 
         *  
         * @param context 
         *            上下文 
         * @param errorCode 
         *            错误码。0表示某些tag已经设置成功;非0表示所有tag的设置均失败。 
         * @param successTags 
         *            设置成功的tag 
         * @param failTags 
         *            设置失败的tag 
         * @param requestId 
         *            分配给对云推送的请求的id 
         */  
        @Override  
        public void onSetTags(Context context, int errorCode,  
                List<String> sucessTags, List<String> failTags, String requestId) {  
            String responseString = "onSetTags errorCode=" + errorCode  
                    + " sucessTags=" + sucessTags + " failTags=" + failTags  
                    + " requestId=" + requestId;  
            Log.d(TAG, responseString);  
      
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑  
            updateContent(context, responseString);  
        }  
      
        /** 
         * delTags() 的回调函数。 
         *  
         * @param context 
         *            上下文 
         * @param errorCode 
         *            错误码。0表示某些tag已经删除成功;非0表示所有tag均删除失败。 
         * @param successTags 
         *            成功删除的tag 
         * @param failTags 
         *            删除失败的tag 
         * @param requestId 
         *            分配给对云推送的请求的id 
         */  
        @Override  
        public void onDelTags(Context context, int errorCode,  
                List<String> sucessTags, List<String> failTags, String requestId) {  
            String responseString = "onDelTags errorCode=" + errorCode  
                    + " sucessTags=" + sucessTags + " failTags=" + failTags  
                    + " requestId=" + requestId;  
            Log.d(TAG, responseString);  
      
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑  
            updateContent(context, responseString);  
        }  
      
        /** 
         * listTags() 的回调函数。 
         *  
         * @param context 
         *            上下文 
         * @param errorCode 
         *            错误码。0表示列举tag成功;非0表示失败。 
         * @param tags 
         *            当前应用设置的所有tag。 
         * @param requestId 
         *            分配给对云推送的请求的id 
         */  
        @Override  
        public void onListTags(Context context, int errorCode, List<String> tags,  
                String requestId) {  
            String responseString = "onListTags errorCode=" + errorCode + " tags="  
                    + tags;  
            Log.d(TAG, responseString);  
      
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑  
            updateContent(context, responseString);  
        }  
      
        /** 
         * PushManager.stopWork() 的回调函数。 
         *  
         * @param context 
         *            上下文 
         * @param errorCode 
         *            错误码。0表示从云推送解绑定成功;非0表示失败。 
         * @param requestId 
         *            分配给对云推送的请求的id 
         */  
        @Override  
        public void onUnbind(Context context, int errorCode, String requestId) {  
            String responseString = "onUnbind errorCode=" + errorCode  
                    + " requestId = " + requestId;  
            Log.d(TAG, responseString);  
      
            // 解绑定成功,设置未绑定flag,  
            if (errorCode == 0) {  
                Utils.setBind(context, false);  
            }  
            // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑  
            updateContent(context, responseString);  
        }  
      
        private void updateContent(Context context, String content) {  
            Log.d(TAG, "updateContent");  
            String logText = "" + Utils.logStringCache;  
      
            if (!logText.equals("")) {  
                logText += "\n";  
            }  
      
            SimpleDateFormat sDateFormat = new SimpleDateFormat("HH-mm-ss");  
            logText += sDateFormat.format(new Date()) + ": ";  
            logText += content;  
      
            Utils.logStringCache = logText;  
      
    //        Intent intent = new Intent();  
    //        intent.setClass(context.getApplicationContext(), MainActivity.class);  
    //        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    //        context.getApplicationContext().startActivity(intent);  
        }  
      
    }  
View Code

Utils.java

public class Utils {
    public static final String TAG = "PushDemoActivity";
    public static final String RESPONSE_METHOD = "method";
    public static final String RESPONSE_CONTENT = "content";
    public static final String RESPONSE_ERRCODE = "errcode";
    protected static final String ACTION_LOGIN = "com.baidu.pushdemo.action.LOGIN";
    public static final String ACTION_MESSAGE = "com.baiud.pushdemo.action.MESSAGE";
    public static final String ACTION_RESPONSE = "bccsclient.action.RESPONSE";
    public static final String ACTION_SHOW_MESSAGE = "bccsclient.action.SHOW_MESSAGE";
    protected static final String EXTRA_ACCESS_TOKEN = "access_token";
    public static final String EXTRA_MESSAGE = "message";

    public static String logStringCache = "";

    // 获取ApiKey
    public static String getMetaValue(Context context, String metaKey) {
        Bundle metaData = null;
        String apiKey = null;
        if (context == null || metaKey == null) {
            return null;
        }
        try {
            ApplicationInfo ai = context.getPackageManager()
                    .getApplicationInfo(context.getPackageName(),
                            PackageManager.GET_META_DATA);
            if (null != ai) {
                metaData = ai.metaData;
            }
            if (null != metaData) {
                apiKey = metaData.getString(metaKey);
            }
        } catch (NameNotFoundException e) {

        }
        return apiKey;
    }

    // 用share preference来实现是否绑定的开关。在ionBind且成功时设置true,unBind且成功时设置false
    public static boolean hasBind(Context context) {
        SharedPreferences sp = PreferenceManager
                .getDefaultSharedPreferences(context);
        String flag = sp.getString("bind_flag", "");
        if ("ok".equalsIgnoreCase(flag)) {
            return true;
        }
        return false;
    }

    public static void setBind(Context context, boolean flag) {
        String flagStr = "not";
        if (flag) {
            flagStr = "ok";
        }
        SharedPreferences sp = PreferenceManager
                .getDefaultSharedPreferences(context);
        Editor editor = sp.edit();
        editor.putString("bind_flag", flagStr);
        editor.commit();
    }

    public static List<String> getTagsList(String originalText) {
        if (originalText == null || originalText.equals("")) {
            return null;
        }
        List<String> tags = new ArrayList<String>();
        int indexOfComma = originalText.indexOf(',');
        String tag;
        while (indexOfComma != -1) {
            tag = originalText.substring(0, indexOfComma);
            tags.add(tag);

            originalText = originalText.substring(indexOfComma + 1);
            indexOfComma = originalText.indexOf(',');
        }

        tags.add(originalText);
        return tags;
    }

    public static String getLogText(Context context) {
        SharedPreferences sp = PreferenceManager
                .getDefaultSharedPreferences(context);
        return sp.getString("log_text", "");
    }

    public static void setLogText(Context context, String text) {
        SharedPreferences sp = PreferenceManager
                .getDefaultSharedPreferences(context);
        Editor editor = sp.edit();
        editor.putString("log_text", text);
        editor.commit();
    }

}
View Code

 

MainActivity.java

        PushManager.startWork(getApplicationContext(),   
                        PushConstants.LOGIN_TYPE_API_KEY,  
                            "URzcY5unGHBQb8o8fLS1wGHu"); 
View Code

 

 

 

posted on 2014-09-10 17:47  西北阳仔2号  阅读(287)  评论(0编辑  收藏  举报
页脚Html代码