从FirebaseInstanceIdService访问Android帐户管理器

时间:2016-10-07 00:18:16

标签: android android-context firebase-cloud-messaging

当有个别用户的新数据时,我目前正在使用FCM触发SyncAdapter。

新用户登录应用后,我会使用AccountManager创建一个新帐户,并存储他们的auth_token,以便能够将其用于将来对服务器的API调用。

现在我需要向服务器发送不仅由Firebase创建的instanceID,还要向用户auth_token发送。这样做,我就可以在服务器上链接它们了。

这就是我想要做的事情:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = MyFirebaseInstanceIDService.class.getSimpleName();

    @Override
    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);

        sendTokenToServer(refreshedToken);
    }

    public void sendTokenToServer(String token) {
        AccountManager accountManager = AccountManager.get(getBaseContext());
        Account[] accounts = accountManager.getAccountsByType(Constants.ACCOUNT_TYPE);

        // ...
    }
}

这里的问题是getBaseContext()null。鉴于此,您如何认为我可以在此处获取帐户信息?

1 个答案:

答案 0 :(得分:0)

嗯,实际上这个问题与从FirebaseInstanceIdService访问上下文无关,而是与我最初如何实例化我的对象有关。

成功登录后,我创建了一个异步任务,将设备实例ID发送到服务器:

new SendInstanceIDTask().execute(FirebaseInstanceId.getInstance().getToken());

这样做,我无法访问上下文。改变我的异步任务,如下所示,我可以使一切按预期工作:

private class SendInstanceIDTask extends AsyncTask<String, Void, Void> {
    private Context context;

    public SendInstanceIDTask(Context context) {
        this.context = context;
    }

    @Override
    protected Void doInBackground(String... params) {
        MyFirebaseInstanceIDService firebaseService = new MyFirebaseInstanceIDService();
        firebaseService.sendTokenToServer(context, params[0]);

        return null;
    }
}