Android 推送:Android Studio 集成Jpush的使用教程

  • 前言
  • 准备
  • 使用
    • 集成SDK
    • 初始化SDK
  • 错误解决

前言

本篇博客记录下在AndroidStudio中Jpush推送的使用、遇到的坑及解决。以及在实际项目中的使用。

准备

  • 1,注册帐号,创建应用:

    Jpush官网地址:https://www.jpush.cn

  • 2,下载Jpush SDK:

    下载地址:http://docs.jpush.io/resources/#android-sdk

这里我下载的是:2.1.3的版本,目录结果如下:
Android 推送:Android Studio 集成Jpush的使用教程_第1张图片

doc:开发文档
exampli:示例工程(eclipse版)
lib:需要导入的jar以及.so文件
res:需要导入的资源
下面分别是studio以及eclipse的示例manifest文件,最后一个是更新日志。

使用

在这里以AndroidStudio演示,因为会有点需要解决的问题。eclipse可以看官方文档。

集成SDK

  • 1,将lib和res目录下的文件copy到我们的项目中:

  • 2,在proguard-rules.pro文件中加入以下混淆代码:

-dontoptimize -dontpreverify 
-dontwarn cn.jpush.** -keep class cn.jpush.** { *; } #==================gson==========================
-dontwarn com.google.** -keep class com.google.gson.** {*;} 
#==================protobuf======================
-dontwarn com.google.** -keep class com.google.protobuf.** {*;}
  • 3,配置Manifest文件:
<!-- Required 自定义用来收发消息的相关权限 -->
<permission  android:name="${applicationId}.permission.JPUSH_MESSAGE" android:protectionLevel="signature"/>

<!-- Required 一些系统要求的权限,如访问网络等-->
<uses-permission android:name="${applicationId}.permission.JPUSH_MESSAGE"/>
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>


<!-- Optional for location -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>

applicatoin下:

<!-- Required SDK核心功能-->
<activity  android:name="cn.jpush.android.ui.PushActivity" android:configChanges="orientation|keyboardHidden" android:exported="false" android:theme="@android:style/Theme.NoTitleBar">
    <intent-filter>
        <action android:name="cn.jpush.android.ui.PushActivity"/>

        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="${applicationId}"/>
    </intent-filter>
</activity>

<!-- Required SDK核心功能-->
<service  android:name="cn.jpush.android.service.DownloadService" android:enabled="true" android:exported="false">
</service>

<!-- Required SDK 核心功能-->
<!-- option since 2.0.5 可配置PushService,DaemonService,PushReceiver,AlarmReceiver的android:process参数 将JPush相关组件设置为一个独立进程 -->
<!-- 如:android:process=":remote" -->
<service  android:name="cn.jpush.android.service.PushService" android:enabled="true" android:exported="false">
    <intent-filter>
        <action android:name="cn.jpush.android.intent.REGISTER"/>
        <action android:name="cn.jpush.android.intent.REPORT"/>
        <action android:name="cn.jpush.android.intent.PushService"/>
        <action android:name="cn.jpush.android.intent.PUSH_TIME"/>

    </intent-filter>
</service>

<!-- Required SDK 核心功能 since 1.8.0 -->
<service  android:name="cn.jpush.android.service.DaemonService" android:enabled="true" android:exported="true">
    <intent-filter>
        <action android:name="cn.jpush.android.intent.DaemonService"/>
        <category android:name="${applicationId}"/>
    </intent-filter>
</service>

<!-- Required SDK核心功能-->
<receiver  android:name="cn.jpush.android.service.PushReceiver" android:enabled="true" android:exported="false">
    <intent-filter android:priority="1000">
        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/>
        <!--Required 显示通知栏 -->
        <category android:name="${applicationId}"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.USER_PRESENT"/>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
    </intent-filter>
    <!-- Optional -->
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED"/>
        <action android:name="android.intent.action.PACKAGE_REMOVED"/>

        <data android:scheme="package"/>
    </intent-filter>
</receiver>

<!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.AlarmReceiver"/>

<!-- User defined. 用户自定义的广播接收器-->
<receiver  android:name="您自己定义的Receiver" android:enabled="true">
    <intent-filter>
        <action android:name="cn.jpush.android.intent.REGISTRATION"/>
        <!--Required 用户注册SDK的intent-->
        <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED"/>
        <!--Required 用户接收SDK消息的intent-->
        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED"/>
        <!--Required 用户接收SDK通知栏信息的intent-->
        <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/>
        <!--Required 用户打开自定义通知栏的intent-->
        <action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK"/>
        <!--Optional 用户接受Rich Push Javascript 回调函数的intent-->
        <action android:name="cn.jpush.android.intent.CONNECTION"/>
        <!-- 接收网络变化 连接/断开 since 1.6.3 -->
        <category android:name="${applicationId}"/>
    </intent-filter>
</receiver>

<!-- Required . Enable it you can get statistics data with channel -->
<meta-data  android:name="JPUSH_CHANNEL" android:value="developer-default"/>
<meta-data  android:name="JPUSH_APPKEY" android:value="您应用applicationId对应的appKey"/>
<!-- </>值来自开发者平台取得的AppKey-->

提示:其中applicationId为 build.gradle配置中 defaultConfig节点下配置,如:

defaultConfig {
    applicationId "com.airsaid.jpushdemo"
}

将提示需要填写的地方,填上我们在创建应用后得到的key:
Android 推送:Android Studio 集成Jpush的使用教程_第2张图片

还剩下一个错误,就是需要我们自定义一个广播接受者了,创建一个MyReceiver继承自Broadcast并进行配置:

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            // 用户打开通知

        }
    }
}

注意:如果不自定义MyReceiver的话,默认用户会打开主界面并且接受不到自定义消息。

初始化SDK

创建Applicaton类,初始化SDK:

public class BaseApplicatoin extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        JPushInterface.init(this);
        JPushInterface.setDebugMode(true);
    }
}

注意在Manifest文件中applicatoin下加入:

android:name=".application.BaseApplicatoin"

错误解决

有很多即使做了以上几步,还是运行不了,出现这个错误:

JPushGlobal] JPush .so file do not match JPush .jar file in the project, Failed to init JPush

造成这个错误的原因是Android Studio没有正确加载这个文件(libjpush210.so)。
我们可以在工程APP目录下找到 build.gradle 文件,打开它

//在android下添加这个一个sourceSets.main    
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

到这里就可以正常的发送推送了,打开app,发送个推送测试下吧。

你可能感兴趣的:(android,错误,极光推送,Studio,接受)