本篇博客记录下在AndroidStudio中Jpush推送的使用、遇到的坑及解决。以及在实际项目中的使用。
1,注册帐号,创建应用:
Jpush官网地址:https://www.jpush.cn
2,下载Jpush SDK:
下载地址:http://docs.jpush.io/resources/#android-sdk
doc:开发文档
exampli:示例工程(eclipse版)
lib:需要导入的jar以及.so文件
res:需要导入的资源
下面分别是studio以及eclipse的示例manifest文件,最后一个是更新日志。
在这里以AndroidStudio演示,因为会有点需要解决的问题。eclipse可以看官方文档。
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.** {*;}
<!-- 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"
}
还剩下一个错误,就是需要我们自定义一个广播接受者了,创建一个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的话,默认用户会打开主界面并且接受不到自定义消息。
创建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,发送个推送测试下吧。