Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从设备到设备的Android Firebase云消息传递_Java_Android_Firebase Cloud Messaging - Fatal编程技术网

Java 从设备到设备的Android Firebase云消息传递

Java 从设备到设备的Android Firebase云消息传递,java,android,firebase-cloud-messaging,Java,Android,Firebase Cloud Messaging,我正在尝试发送firebase设备到设备推送通知,因此我有如下代码 private void sendNotification(final String token) { new AsyncTask<Void,Void,Void>(){ @Override protected Void doInBackground(Void... voids) { try { OkHttpClient

我正在尝试发送firebase设备到设备推送通知,因此我有如下代码

private void sendNotification(final String token) {

    new AsyncTask<Void,Void,Void>(){

        @Override
        protected Void doInBackground(Void... voids) {
            try {
                OkHttpClient client=new OkHttpClient();
                JSONObject json=new JSONObject();
                JSONObject dataJson=new JSONObject();
                dataJson.put("body","Hello, I am body");
                dataJson.put("title","I am title");
                json.put("notification",dataJson);
                json.put("to",token);
                RequestBody body=RequestBody.create(JSON,json.toString());
                Request request=new Request.Builder()
                        .header("Authorization","key="+LEGACY_SERVER_KEY)
                        .url("https://fcm.googleapis.com/fcm/send")
                        .post(body)
                        .build();
                Response response=client.newCall(request).execute();
                String finalResponse=response.body().string();

                //Toast.makeText(MainActivity.this, finalResponse, Toast.LENGTH_SHORT).show();
            }catch (Exception e){
                Toast.makeText(MainActivity.this, "Exception occured", Toast.LENGTH_SHORT).show();
            }
            return null;
        }
    }.execute();
}
private void sendNotification(最终字符串标记){
新建异步任务(){
@凌驾
受保护的空位背景(空位…空位){
试一试{
OkHttpClient=新的OkHttpClient();
JSONObject json=新的JSONObject();
JSONObject dataJson=新的JSONObject();
put(“body”,“你好,我是body”);
put(“标题”,“我是标题”);
put(“通知”,dataJson);
put(“to”,token);
RequestBody=RequestBody.create(JSON,JSON.toString());
Request Request=newrequest.Builder()
.header(“授权”、“密钥=“+LEGACY\u SERVER\u密钥”)
.url(“https://fcm.googleapis.com/fcm/send")
.职位(机构)
.build();
Response=client.newCall(request.execute();
String finalResponse=response.body().String();
//Toast.makeText(MainActivity.this,finalResponse,Toast.LENGTH_SHORT).show();
}捕获(例外e){
Toast.makeText(MainActivity.this,“发生异常”,Toast.LENGTH_SHORT.show();
}
返回null;
}
}.execute();
}
这里的问题是通知没有发送到其他设备。但当我取消对Toast(try块的最后一行)的注释时,通知将成功发送,并立即显示应用程序停止工作。有人请帮忙

当我取消注释Toast(try块的最后一行)时,将发送通知,但它表示不幸的是,应用程序已停止。logcat是:

01-23 07:17:11.907 4694-4731/bhavana.apps.saveme E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: bhavana.apps.saveme, PID: 4694
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:353)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.RuntimeException: Can't toast on a thread that has not called Looper.prepare()
        at android.widget.Toast$TN.<init>(Toast.java:390)
        at android.widget.Toast.<init>(Toast.java:114)
        at android.widget.Toast.makeText(Toast.java:277)
        at android.widget.Toast.makeText(Toast.java:267)
        at bhavana.apps.saveme.MainActivity$6.doInBackground(MainActivity.java:199)
        at bhavana.apps.saveme.MainActivity$6.doInBackground(MainActivity.java:176)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
        at java.lang.Thread.run(Thread.java:764) 
01-23 07:17:11.907 4694-4731/bhavana.apps.saveme E/AndroidRuntime:FATAL EXCEPTION:AsyncTask#1
流程:bhavana.apps.saveme,PID:4694
java.lang.RuntimeException:执行doInBackground()时出错
在android.os.AsyncTask$3.done(AsyncTask.java:353)
位于java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
位于java.util.concurrent.FutureTask.setException(FutureTask.java:252)
位于java.util.concurrent.FutureTask.run(FutureTask.java:271)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
运行(Thread.java:764)
原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程上toast
在android.widget.Toast$TN.(Toast.java:390)
在android.widget.Toast.(Toast.java:114)
位于android.widget.Toast.makeText(Toast.java:277)
位于android.widget.Toast.makeText(Toast.java:267)
位于bhavana.apps.saveme.MainActivity$6.doInBackground(MainActivity.java:199)
位于bhavana.apps.saveme.MainActivity$6.doInBackground(MainActivity.java:176)
位于android.os.AsyncTask$2.call(AsyncTask.java:333)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
运行(Thread.java:764)

您只能在UI线程中显示祝酒词。
删除此行或将其移动到“
onPostExecute”

Toast.makeText(MainActivity.this, "Exception occured", Toast.LENGTH_SHORT).show();
Toast.makeText()
需要在UI线程中执行。尝试将其替换为:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(MainActivity.this, "Exception occured", Toast.LENGTH_SHORT).show();
    }
});
如果只需要调试,也可以使用日志:

android.util.Log.i("debug", "success msg: " + finalResponse);
您可以通过覆盖
onPostExecute()

这假设
onPostExecute()
return
Boolean
,因此:

@Override
protected Boolean doInBackground(Void... params) {
    ......

    // return true on success
    if (success) {
        return true;
    }

    return false;
}
类需要这样定义:

new AsyncTask<Void, Void, Boolean>(){
newasynctask(){
原因:java.lang.RuntimeException:无法在 尚未调用Looper.prepare()

你应该使用

在UI线程上运行指定的操作。如果当前线程为 UI线程,则立即执行该操作 线程不是UI线程,操作被发布到事件队列 用户界面线程的

new AsyncTask<Void, Void, Boolean>(){
runOnUiThread(new Runnable() {
      public void run() {
         Toast.makeText(MainActivity.this, "Exception occured", Toast.LENGTH_SHORT).show();
      }
 });