接入谷歌推送(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庫製作完成!