如何将安卓客户端注册令牌发送到FCM服务器?

3
我希望实现安卓推送通知。我搜索了谷歌,没有找到提供发送注册令牌给服务器示例实现的文档。所有的都是空实现。有人有这种方法的正确样例实现吗?
至少需要API文档。

https://firebase.google.com/docs/cloud-messaging/android/client

public void onTokenRefresh() 
{

  // Get updated InstanceID token.

    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.w(TAG, "Refreshed token: " + refreshedToken);

  // If you want to send messages to this application instance or
  // Instance ID token to your app server.

发送注册令牌到服务器(refreshedToken);
  }

你必须将令牌保存在自定义服务器中,或者你可以使用Firebase数据库。 - Pawan Singh Chauhan
一旦用户安装了应用程序,客户端令牌应自动发送到FCM服务器。我们无法在数据库中手动添加它。请告诉我如何实现这一点。 - JavaUser
2个回答

3
首先,您需要创建一个扩展FirebaseInstanceIdServiceFirebaseIDService类。
public class FirebaseIDService extends FirebaseInstanceIdService {
    private static final String TAG = "FirebaseIDService";

    private SharedPreferences sharePrefs;
    private SharedPreferences.Editor edit;

    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        Intent intent = new Intent(FirebaseIDService.this, SaveFCMTokenService.class);
        intent.putExtra("TOKEN",refreshedToken);
        FirebaseIDService.this.startService(intent);
    }

}

接下来创建一个 SaveFCMTokenService 类,该类继承自 Service 类。

public class SaveFCMTokenService extends Service {

    @Override
    public void onCreate() {
    // TODO Auto-generated method stub
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub

        if(intent != null){

            Bundle b = intent.getExtras();

            if(b != null) {
                String token = b.getString("TOKEN");

                sendRegistrationToServer(token);
            }
        }
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

     private void sendRegistrationToServer(final String token) {
          // Add custom implementation, as needed.

       DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
        DatabaseReference fcmDatabaseRef = ref.child("FCM_Device_Tokens").push();

         FCM_Device_Tokens obj = new FCM_Device_Tokens();
         obj.setToken(token);
         fcmDatabaseRef.setValue(obj);
     }
}

此外,别忘了将这两个内容添加到清单文件中。
 <service android:name=".servicesreceivers.FirebaseIDService">
                android:exported="true">
                <intent-filter>
                    <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
                </intent-filter>
            </service>
            <service android:name=".servicesreceivers.SaveFCMTokenService" />

FCM_Device_Tokens模型类

@IgnoreExtraProperties
public class FCM_Device_Tokens {

    @SerializedName("token")
    private String token;

    public FCM_Device_Tokens() {
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

我想要实现sendRegistrationToServer()方法。 - JavaUser
我已经对sendRegistrationToServer方法进行了更改,请检查一下。 - Seenu69
谢谢Seenu。还有一个问题,我们如何根据Android设备上的用户登录发送消息?你有任何参考实现吗? - JavaUser
2
不,我不知道这个。顺便说一下,如果你已经得到了一个有效的答案,请接受它。 - Seenu69
这是一个笔误吗:ref.child应该是mDatabase.child吗? - Bargain23
@Seenu69,如果你已经有了FirebaseIDService,为什么还要创建另一个服务“SaveFCMTokenService”? - Red M

1
@IgnoreExtraProperties
public class User {

    public String token;
    public String email;

    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public User(String token, String email) {
        this.token = token;
        this.email = email;
    }

}

private DatabaseReference mDatabase;
mDatabase = FirebaseDatabase.getInstance().getReference();

// to save token in firebase db
User user = new User(token, email);
mDatabase.child("users").child("put_constant_id_here").setValue(user);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接