Azure 下通知(百度推送)

作者: 流水潺湲 | 来源:发表于2017-10-18 14:42 被阅读97次

1. 从 Bintray 上 Notification-Hubs-Android-SDK 的“文件”选项卡下载 notification-hubs-0.4.jar 文件。 libs 文件夹,然后刷新 libs 文件夹。


2. 下载并解压缩百度推送 Android SDK,打开 libs 文件夹,然后将 pushservice-x.y.z jar 文件以及 armeabi & mips 文件夹复制到 Android 应用程序的 jniLibs 文件夹。


3. 打开 Android 项目的 AndroidManifest.xml 文件,并添加百度 SDK 所需的权限。

<!-- Push service 运行需要的权限 -->
<uses-permission android:name="android.permission.READ_PHONE_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.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.包名" />
<permission
    android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.包名"
    android:protectionLevel="normal"></permission>

向 AndroidManifest.xml 中的 application 元素添加 android:name 属性,并替换 yourprojectname(例如 com.skypine.skypine)。 确保此项目名称与你在百度控制台中配置的项目名称匹配。

 <application android:name="yourprojectname.DemoApplication"

4. 在 .MainActivity 活动元素后的 application 元素内添加以下配置,并替换 yourprojectname(例如 com.example.BaiduTest):

<!--自定义的receiver-->
<receiver android:name=".receiver.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" />

<!-- 适配Android N系统必需的ContentProvider声明,写权限包含应用包名-->
<provider
    android:name="com.baidu.android.pushservice.PushInfoProvider"
    android:authorities="com.skypine.skypine.bdpush"
    android:exported="true"
    android:protectionLevel="signature"
    android:writePermission="baidu.push.permission.WRITE_PUSHINFOPROVIDER.com.skypine.skypine" />


<!--推送-->

5. 将一个名为 ConfigurationSettings.java 的新类添加到项目中。

    /**
 * 百度推送
 * Created by syhuang on 2017/7/14.
 */

public class ConfigurationSettings {
    public static String API_KEY = "zrHB4m1yzwHDNFxI8uBAHxhi";
    public static String NotificationHubName = "daisy-notification";
    public static String NotificationHubConnectionString = "Endpoint=sb://daisy-ns.servicebus.chinacloudapi.cn/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=wJTvYJB4wG1GJOvEtdKwxEPT6rGOdLbcmBb+lEtzt7k=";
}

6. 将以下代码添加到该类中:

public class ConfigurationSettings {
        public static String API_KEY = "...";
        public static String NotificationHubName = "...";
        public static String NotificationHubConnectionString = "...";
    }

使用前面从百度云项目中检索到的内容设置 API_KEY 的值,使用 Azure 经典门户中的通知中心名称设置 NotificationHubName,并使用 Azure 经典门户中的 DefaultListenSharedAccessSignature 设置 NotificationHubConnectionString。


7. 添加另一个名为 MyPushMessageReceiver.java的新类,并向此类中添加以下代码。 此类用于处理从百度推送服务器收到的推送通知。

/**
 * Created by syhuang on 2017/7/14.
 */

public class MyPushMessageReceiver extends PushMessageReceiver {
    /**
     * TAG to Log
     */
    public static NotificationHub hub = null;
    public static String mChannelId, mUserId;
    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);
        mChannelId = channelId;
        mUserId = userId;

        try {
            if (hub == null) {
                hub = new NotificationHub(
                        ConfigurationSettings.NotificationHubName,
                        ConfigurationSettings.NotificationHubConnectionString,
                        context);
                Log.i(TAG, "Notification hub initialized");
            }
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
        }

        registerWithNotificationHubs();
    }

    private void registerWithNotificationHubs() {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                try {
                    hub.registerBaidu(mUserId, mChannelId);
                    Log.i(TAG, "Registered with Notification Hub - '"
                            + ConfigurationSettings.NotificationHubName + "'"
                            + " with UserId - '"
                            + mUserId + "' and Channel Id - '"
                            + mChannelId + "'");
                } catch (Exception e) {
                    Log.e(TAG, e.getMessage());
                }
                return null;
            }
        }.execute(null, null, null);
    }

    /**
     * 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> successTags, List<String> failTags, String requestId) {
        String responseString = "onSetTags errorCode=" + errorCode
                + " sucessTags=" + successTags + " failTags=" + failTags
                + " requestId=" + requestId;
        Log.d(TAG, 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> successTags, List<String> failTags, String requestId) {
        String responseString = "onDelTags errorCode=" + errorCode
                + " sucessTags=" + successTags + " failTags=" + failTags
                + " requestId=" + requestId;
        Log.d(TAG, 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);
    }

    /**
     * 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);
        // Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
    }

    /**
     * 接收通知点击的函数。
     *
     * @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);
    }

    /**
     * 接收通知到达的函数。
     *
     * @param context             上下文
     * @param title               推送的通知的标题
     * @param description         推送的通知的描述
     * @param customContentString 自定义内容,为空或者json字符串
     */

    @Override
    public void onNotificationArrived(Context context, String title,
                                      String description, String customContentString) {
        String messageString = "title" + title + "message=\"" + description + "\" customContentString=" + customContentString;
        Log.d(TAG, messageString);
    }

    /**
     * 接收透传消息的函数。
     *
     * @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);
    }
}

8. 打开 MainActivity.java,并将以下内容添加到 onCreate 方法中:

    PushManager.startWork(getApplicationContext(),
            PushConstants.LOGIN_TYPE_API_KEY, ConfigurationSettings.API_KEY);

相关文章

  • Azure 下通知(百度推送)

    1. 从 Bintray 上 Notification-Hubs-Android-SDK 的“文件”选项卡下...

  • 推送通知

    推送通知 推送通知的作用 推送通知的呈现效果 推送通知的呈现效果总结 总结一下,推送通知有5种不同的呈现效果 1....

  • iOS的Azure推送集成随笔

    最近接了个集Azure推送的需求记录一下,如何在Apple Developer创建推送证书什么的就不说了,大家可以...

  • ios10前后推送基本使用

    一、推送的分类 本地推送通知“本地”可以理解为”不联网”;即使没有网络情况下,也可以推送通知消息通知发送方: 开发...

  • 本地推送通知、远程推送通知、激光推送

    title : 本地推送通知、远程推送通知、激光推送category : UI 本地推送通知、远程推送通知、激光...

  • iOS 关于远程推送的知识普及

    首先简单介绍一下iOS下推送通知吧!,推送通知分为有local本地推送,remote远程推送,而iOS7之后对远程...

  • 本地推送通知

    通知的显示方式 总结一下,推送通知有5种不同的呈现效果 注意⚠️ 发出推送通知时,如果程序正运行在前台,那么推送通...

  • iPad收不到任何通知

    突然发现iPad收不到通知,无论是微信还是其他APP推送的信息,通知栏都不会有响应。 百度一下没有找到问题所在,网...

  • 一些项目中可能只需要配置一次的东西吧

    本地推送&远程推送 1.远程推送 推送通知的分类远程推送通知本地推送通知 推送通知作用可以让不在前台运行的App告...

  • 推送通知

    推送通知 1. 什么是推送通知? 2. 推送通知的应用场景? 3. 推送通知的展现样式? 4. 推送通知的分类 本...

网友评论

    本文标题:Azure 下通知(百度推送)

    本文链接:https://www.haomeiwen.com/subject/eexeuxtx.html