让eclipse也支持FCM(Firebase Cloud Messaging)

接入谷歌推送(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
apply plugin: 'com.google.gms.google-services'
 在运行,就可以接收到推送了,那么as上就集成完成了,那么eclipse上该怎么使用呢?

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库制作完成!

0 条评论
发表一条评论