【问题标题】:Firebase send token code when app is opened everytime每次打开应用程序时,Firebase 都会发送令牌代码
【发布时间】:2016-11-17 02:53:08
【问题描述】:

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

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();
}
}}

对不起,我的英语不好。

编辑:我的 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 发送数据?

【问题讨论】:

  • 请添加堆栈跟踪以便更好地调试
  • 检查我的更新答案

标签: android firebase firebase-cloud-messaging


【解决方案1】:

您可以随时通过调用获取令牌:

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();
    }

}}

当您第一次启动应用程序时,到 Activity 启动时还没有生成令牌。因此,您需要检查null 并且还要在服务中实现onTokenRefresh

【讨论】:

  • 嗨弗兰克,我已经更新了我的帖子。我尝试了您的代码,但无法正常工作。使用您的代码image.prntscr.com/image/a128f7639ce04bb5b0ea3e1dd52eeabe.png 的 mainactivity 屏幕截图
  • 我认为这应该是让它真正投入使用的首选方式。感谢您向我指出。我在回答时肯定因为某种原因错过了它。也会编辑我的答案。
  • 我试过你的代码,第一次打开应用但第二次崩溃不幸的是(应用名称)已停止。
  • @FrankvanPuffelen 你能帮帮我吗?我可以通过 github 项目向您发送我的文件。你能看看吗?我已经尝试了几个星期,但没有工作
  • 如果应用程序崩溃了,会有一个堆栈跟踪。将堆栈跟踪添加到您的问题中,并在代码中指出导致崩溃的行号。
【解决方案2】:

我建议您在 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;
    }

}

现在在 ma​​inActivityonCreate 中调用该方法并在每次应用启动时检索令牌,如下所示:

FirebaseInstanceIdService.getToken(); 

如果这让你有一个想法来实现你想做的事情,请告诉我。

【讨论】:

  • 方法看起来不错。但是你为什么要把它放在服务中呢?它不也适合活动本身吗?
  • 您好 Nishant,感谢您的帮助。我没有添加此代码。它给了我错误。我已经用 mainactivity 和 FirebaseInstanceIDService 更新了我的帖子
【解决方案3】:

试试这个,

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 更改令牌时,它也会自动更改为共享首选项

【讨论】:

  • 您好,Umar,感谢您的帮助。那是行不通的。我已经用 activitymain.java 和 FirebaseInstanceIDService.java 更新了我的帖子
  • 我已经添加了我的 mainactivity 和 FirebaseInstanceIDService。我会在几分钟内添加你的代码和截图。
  • 我只是建议你获取和存储设备令牌的代码,但我没有包括你需要实现的网络调用
  • 我添加了您的代码,第一次生成了令牌,但第二次在 logcat 中什么也没有。 image.prntscr.com/image/8e32e8d82fff4d74bf7fcf06ee8516d5.pngimage.prntscr.com/image/1ae6c340e02a4cf69df68eebdae4e97c.png
  • 你错了。只需在您的问题代码中实现 onkenrefresh 方法并在其中调用我的方法 send Registrationttoserver
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
相关资源
最近更新 更多