接入谷歌推送(Firebase Cloud Messaging),我们知道,谷歌现在只支持Android studio了,那么如果eclipse需要使用怎么办呢?好像已经被抛弃了,只能自己弄一个库了。
1、进入FCM,创建我们的测试应用,输入包名即可,然后下载google-services.json文件
2、先看看as上怎么集成fcm,然后依赖compile 'com.google.firebase:firebase-messaging:9.6.1'
,编写自己的FirebaseMessagingService、FirebaseInstanceIdService,在AndroidManifest.xml中加上这两个服务。最后,运行,测试,发现会报一个错误,如下
这是什么鬼,好像我们还需要在build.gradle上添加// ADD THIS AT THE BOTTOM
在运行,就可以接收到推送了,那么as上就集成完成了,那么eclipse上该怎么使用呢?
apply plugin: 'com.google.gms.google-services'
3、对于google-services.json文件到底是有什么作用,还有有没发现,是不是没有初始化的代码?所以我们可以使用as跟进去查看代码,as看源码很方便,直接点进去就有了,FirebaseApp.initializeApp(),需要传入FirebaseOptions参数,我们仔细看看属性和google-services.json文件的值就会发现,其实就是需要这些值来初始化
4、开始制作eclipse fcm库,新建一个eclipse项目,查看as项目看看引用了什么jar,
右键,打开找到所在位置,复制jar和res资源到eclipse上,此时我们有了jar库了
5、读取json文件参数,初始化FirebaseApp.initializeApp()
,把json文件放到assets文件夹下读取
ParseJson.java
package com.example.test3;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import org.json.JSONObject;
import android.content.Context;
/**
* google-services.json文件读取与解析
* @author Flyjun
*
*/
public class ParseJson {
private static HashMap<String, String> hashMap = new HashMap<String, String>();
//Json文件读取
protected static HashMap<String, String> resolve(Context context) {
try {
InputStream is = context.getResources().getAssets().open("google-services.json");
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte buffer[] = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1){
outStream.write(buffer, 0, len);
}
outStream.flush();
String json = new String(outStream.toByteArray(), "ISO-8859-1");
createHashMap(json);
//关闭输入输出流
outStream.close();
is.close();
buffer = null;
} catch (Exception e) {
e.printStackTrace();
}
return hashMap;
}
/**Json文件解析
* 获取FirebaseOptions.Builder对应的值
* @param str
* @throws Exception
*/
private static void createHashMap(String str) throws Exception{
JSONObject json = new JSONObject(str);
JSONObject info = json.getJSONObject("project_info");
JSONObject client = json.getJSONArray("client").getJSONObject(0);
JSONObject apiKey = client.getJSONArray("api_key").getJSONObject(0);
hashMap.put("ProjectId", info.getString("project_id"));
hashMap.put("ApiKey", apiKey.getString("current_key"));
hashMap.put("ApplicationId", client.getJSONObject("client_info").getString("mobilesdk_app_id"));
hashMap.put("DatabaseUrl", info.getString("firebase_url"));
hashMap.put("GcmSenderId", info.getString("project_number"));
hashMap.put("StorageBucket", info.getString("storage_bucket"));
}
}
初始化操作
if(FirebaseApp.getApps(this).isEmpty()){
FirebaseOptions.Builder builder = new FirebaseOptions.Builder();
builder.setApiKey(params.get("ApiKey"));
builder.setApplicationId(params.get("ApplicationId"));
builder.setDatabaseUrl(params.get("DatabaseUrl"));
builder.setGcmSenderId(params.get("GcmSenderId"));
builder.setStorageBucket(params.get("StorageBucket"));
FirebaseOptions options = builder.build();
FirebaseApp.initializeApp(this, options);
}
获取Token值
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
System.out.println("refreshedToken:"+refreshedToken);
添加FirebaseMessagingService、FirebaseInstanceIdService
6、完成了上面的操作,有初始化了,但是还不是不能接收到推送信息,想想我们的接入jpush什么的是不是有权限什么的,是的,fcm也需要,是时候来编译messaging demo,打开AndroidManifest.xml,你会发现我们还需要添加
<!-- fcm所需权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
android:name="包名.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="包名.permission.C2D_MESSAGE" />
<!-- iid服务和监听器 begin -->
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="包名" />
</intent-filter>
</receiver>
<!--
Internal (not exported) receiver used by the app to start its own exported services
without risk of being spoofed.
-->
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
android:exported="false" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
此时运行eclipse项目,就可以接收到推送了
eclipse fcm库制作完成!