每次打开应用时,Firebase都会发送令牌代码

时间:2016-11-17 02:53:08

标签: android firebase firebase-cloud-messaging

我想在打开应用时发送令牌代码。我不想发送新令牌,只有相同的令牌。此代码工作正常,但仅限第一次。

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
    String token = FirebaseInstanceId.getInstance().getToken();
    registerToken(token);
    Log.d("TOKEN", token);
}

private void registerToken(String token){
OkHttpClient client = new OkHttpClient();
RequestBody body = new FormBody.Builder()
        .add("token", token)
        .build();

Request request = new Request.Builder()
        .url("url")
        .post(body)
        .build();
try {
    client.newCall(request).execute();
} catch (IOException e) {
    e.printStackTrace();
}
}}

我知道onTokenRefresh仅在应用安装时启动。当我第一次打开我的应用程序,第二次,3。4.等等时,如何将令牌发送到服务器。

我尝试将此代码添加到我的活动中但应用程序未运行。给我一个错误

  

不幸的是(应用名称)已停止。

我已将此代码添加到onCreate

中的主要活动中
String token = FirebaseInstanceId.getInstance().getToken();
registerToken(token);

并在此代码之后

private void registerToken(String token){
OkHttpClient client = new OkHttpClient();
RequestBody body = new FormBody.Builder()
        .add("token", token)
        .build();

Request request = new Request.Builder()
        .url("url")
        .post(body)
        .build();
try {
    client.newCall(request).execute();
} catch (IOException e) {
    e.printStackTrace();
}
}}

Sory因为我的英语不好。

编辑:我的MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

我的FirebaseInstanceIDService.java

public class FirebaseInstanceIDService extends FirebaseInstanceIdService {
    @Override
    public void onTokenRefresh() {
        String token = FirebaseInstanceId.getInstance().getToken();
        registerToken(token);
        Log.d("TOKEN", token);
    }
    private void registerToken(String token){
        OkHttpClient client = new OkHttpClient();
        RequestBody body = new FormBody.Builder()
                .add("Token", token)
                .build();

        Request request = new Request.Builder()
                .url("url")
                .post(body)
                .build();
        try {
            client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

编辑2: 我认为这段代码在mainactivity.java

中不起作用
Request request = new Request.Builder()
                    .url("url")
                    .post(body)
                    .build();

当我将此代码添加到mainactivity时,我的应用程序崩溃了。

完整代码

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String token = FirebaseInstanceId.getInstance().getToken();
        registerToken(token);
        Log.d("TOKEN", token);
    }
    private void registerToken(String token){
        OkHttpClient client = new OkHttpClient();
        RequestBody body = new FormBody.Builder()
                .add("token", token)
                .build();

        Request request = new Request.Builder()
                .url("url")
                .post(body)
                .build();
        try {
            client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如何使用AsyncTask发送数据?

3 个答案:

答案 0 :(得分:2)

您可以随时致电:

获取令牌
FirebaseInstanceId.getInstance().getToken();

因此,您可以将其放入MainActivity.onCreate()并发送。

public void onCreate(Context ctx) {
    ...
    String token = FirebaseInstanceId.getInstance().getToken();
    if (token != null) {
        registerToken(token);
    }
    ...
}
private void registerToken(String token){
    OkHttpClient client = new OkHttpClient();
    RequestBody body = new FormBody.Builder()
            .add("token", token)
            .build();

    Request request = new Request.Builder()
            .url("url")
            .post(body)
            .build();
    try {
        client.newCall(request).execute();
    } catch (IOException e) {
        e.printStackTrace();
    }

}}

首次启动应用程序时,活动开始时尚未生成令牌。因此,您需要检查null 是否也在服务中实施onTokenRefresh

答案 1 :(得分:1)

我建议你在你的FirebaseInstaceIdService 中制作一个自定义方法,如下所示:

public class FirebaseInstanceIDService extends FirebaseInstanceIdService {
    private static final String TAG = FirebaseInstanceIDService.class.getSimpleName();
    private static String fcmToken;


    public static String getToken() {

        fcmToken = FirebaseInstanceId.getInstance().getToken();

        Log.d(TAG, "Old token: " + fcmToken);

    return fcmToken;
    }

}

现在,在 mainActivity onCreate 中调用该方法并在每个应用上检索令牌,如下所示:

FirebaseInstanceIdService.getToken(); 

请告诉我这是否可以帮助您实现您想要的目标。

答案 2 :(得分:0)

试试这个,

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";

    @Override
    public void onTokenRefresh() {

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

        sendRegistrationToServer(refreshedToken);
    }

    private void sendRegistrationToServer(String token) {
        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("myprefs", MODE_PRIVATE);
        SharedPreferences.Editor edit = sharedPreferences.edit();
        edit.putString("token", token);
        edit.commit();


    }
}

现在您可以将MainActivity onCreate方法中的令牌发送到服务器

     public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    SharedPreferences sharedpreferences = getApplicationContext().getSharedPreferences("myprefs", MODE_PRIVATE);
  String   token = sharedpreferences.getString("token", "");
    OkHttpClient client = new OkHttpClient();
            RequestBody body = new FormBody.Builder()
                    .add("Token", token)
                    .build();

            Request request = new Request.Builder()
                    .url("url")
                    .post(body)
                    .build();
            try {
                client.newCall(request).execute();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

现在,每当令牌通过firebase更改时,它也会在共享首选项中自动更改