Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.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
具有高优先级的Firebase消息未从Doze android 6+;唤醒设备;_Android_Firebase Cloud Messaging_Device Admin - Fatal编程技术网

具有高优先级的Firebase消息未从Doze android 6+;唤醒设备;

具有高优先级的Firebase消息未从Doze android 6+;唤醒设备;,android,firebase-cloud-messaging,device-admin,Android,Firebase Cloud Messaging,Device Admin,我已将我的项目从使用GCM迁移到使用Firebase。当设备处于唤醒状态或最近处于休眠状态时,推送通知通过ok发送,但如果我离开设备一小时,则在我唤醒设备之前不会发送推送 Android文档说,如果你需要唤醒一台设备来发送消息,那么使用FireBase并将优先级设置为high。它还说,设备管理应用程序不受瞌睡限制,我的应用程序是一个设备管理应用程序 我想我应该提到,当我将项目从GCM迁移到FCM时,我只在firebase控制台中指定了包名,而没有指定指纹 我尝试过的。 将优先级设置为高 {

我已将我的项目从使用GCM迁移到使用Firebase。当设备处于唤醒状态或最近处于休眠状态时,推送通知通过ok发送,但如果我离开设备一小时,则在我唤醒设备之前不会发送推送

Android文档说,如果你需要唤醒一台设备来发送消息,那么使用FireBase并将优先级设置为high。它还说,设备管理应用程序不受瞌睡限制,我的应用程序是一个设备管理应用程序

我想我应该提到,当我将项目从GCM迁移到FCM时,我只在firebase控制台中指定了包名,而没有指定指纹

我尝试过的。

  • 将优先级设置为高

    {
      "time_to_live": 300000,
      "delay_while_idle": false,
      "android": {
        "priority": "high"
      },
      "data": {
        "message": "PING_DEVICE",
        "time": "21/01/2018 16:20:28",
        "pushguid": "10062"
      },
      "registration_ids": [
        "eOMT........"
      ]
    }
    
    设定了生存时间,因此信息最终会被传递出去。延迟,当空闲设置为false时,FCM将在2016年9月后忽略该设置

  • 设备管理应用程序不受Doze的约束,我的是一个设备管理应用程序,但我也明确地将该应用程序添加到设置->电池->优化中的Doze白名单中。这是通过设置应用程序手动完成的,而不是以编程方式在代码中完成的

  • 我已经让我的设备进入睡眠状态3个小时了,没有任何提示。我还使用adb使设备进入睡眠状态。当adb将设备置于睡眠状态时,未收到推送,当adb将设备从睡眠状态中取出时,推送通过

    我还没有尝试过更多的想法。

    我的推送是数据消息。这是因为我不希望推送到设备上的通知栏,让用户单击它来执行功能。用户与设备管理应用程序没有交互。因此,数据消息由

    onMessageReceived(RemoteMessage remoteMessage)
    
    我相信通知消息确实会唤醒设备,这正是我所需要的,但我希望应用程序能够处理推送,而不是用户。我可以拥有通知和数据两种消息,但OnMessageReceived可以处理这些功能吗

    有没有人经历过类似的事情,或者对此有什么解决办法

    [第1版] 我在下面找到了一个链接,上面说你可以发送一条包含通知和数据的消息,但是如果应用程序在后台,则会显示通知,但只有当用户单击通知时才会执行数据。这不是我想要的,因为我希望数据立即在onMessageCived中执行

    [编辑二] 我已将以下代码和权限添加到应用程序中。该应用程序现在要求用户将该应用程序列入打瞌睡的白名单,因此我单击了“是”。然后,我通过adb将设备置于Doze状态并发送推送。直到我把设备从打瞌睡模式中拿回来,一切都没有发生。因此,不幸的是,这不起作用

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                Intent intent = new Intent();
                String packageName = getPackageName();
                PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
                if (!pm.isIgnoringBatteryOptimizations(packageName)) {
                    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                    intent.setData(Uri.parse("package:" + packageName));
                    startActivity(intent);
                }
            }
    
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    
    if(Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.M){
    意图=新意图();
    字符串packageName=getPackageName();
    PowerManager pm=(PowerManager)getSystemService(POWER\u服务);
    如果(!pm.isIgnoringBatteryOptimizations(packageName)){
    设置动作(设置、动作、请求、忽略、电池优化);
    setData(Uri.parse(“包:“+packageName”);
    星触觉(意向);
    }
    }
    
    [编辑部3]

    我已经做了进一步的测试,试图隔离问题,并将我的web应用程序代码从等式中去掉。我通过adb和使用的FireBase控制台将设备放入Doze,以发送推送推送正确这告诉我,将所有推送信息发送到fcm端点的web应用程序代码存在问题。我今晚会拿到密码,稍后再发

    [编辑部4] 我刚刚又做了一些测试。我将设备放入doze中,然后使用FireBase控制台发送带有2个键值对的数据消息。当设备处于睡眠状态且应用程序位于前台(屏幕上)时,推送将通过并执行onMessageReceived。这太棒了。但是,如果应用程序位于BG中,则仅显示通知。据我所知,从文档中,数据消息通过Intent发送到launcher活动,但我的launcher应用程序不处理推送。处理推送的类称为MyAndroidFirebaseMsgService,扩展了FirebaseMessagingService

    如果应用程序在BG中,我是否必须将意图路由到此类?这样做似乎有点开始了。GCM从来就不是这样

    此外,我不希望应用程序通过推送启动,因为这是非常具有侵入性的,因为设备用户可能正在使用不同的应用程序。我的应用程序也是一个设备管理应用程序,因此99%的时间没有用户交互,它只是一个在设备上执行策略的客户端。

    [编辑部5]

    internal static void SendNotification (  Dictionary<string, string> nameValues ,  List<string> theregIDs , string sPushName)
             {     
                string stringregIds =  string.Join("\",\"", theregIDs) ;
    
                 JavaScriptSerializer js = new JavaScriptSerializer();
                string keyValueJson = js.Serialize(nameValues);
    
                string TIME_TO_LIVE = "604800";
    
                string DELAY_WHILE_IDLE = "false";
    
                string ENDPOINTADDRESS = @"https://fcm.googleapis.com/fcm/send";
    
    
                postData = String.Concat("{\"time_to_live\":", TIME_TO_LIVE,  ",\"delay_while_idle\": ", DELAY_WHILE_IDLE,  ",  \"android\":{\"priority\":\"high\" } ,\"data\": { \"message\" : " + "\"" + sPushName + "\",\"time\": " + "\"" + System.DateTime.Now.ToString() + "\""
                    , keyValueJson
                   , "},\"registration_ids\":[\"" + stringregIds + "\"]}");
    
    
                WebRequest myWebRequest = null;
                WebResponse myWebResponse = null;
                try
                {
                    myWebRequest = WebRequest.Create(ENDPOINTADDRESS);                         
                    myWebRequest.Method = "post";
                    myWebRequest.ContentType = "application/json";
                    //  myWebRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
                    myWebRequest.Headers.Add("Authorization: key=" + Our_Api_Key);
                    myWebRequest.Headers.Add("Sender:id=" + Our_Sender_Id);
    
                    Byte[] BA = Encoding.UTF8.GetBytes(postData);
                    myWebRequest.ContentLength = BA.Length;
    
                    using (Stream dataStreamOut = myWebRequest.GetRequestStream())
                    {
                        dataStreamOut.Write(BA, 0, BA.Length);
    
                    }
    
                    using (myWebResponse = myWebRequest.GetResponse())
                    {
                        using (Stream dataStream = myWebResponse.GetResponseStream())
                        {
                            using (StreamReader tReader = new StreamReader(dataStream))
                            {
                                strServerResponse = tReader.ReadToEnd(); 
                            }
    
                        }
                    }
    
    
                }
                catch (WebException ex)
                {
    
    
    
                }
    
             }//
    
    内部静态void SendNotification(字典名称值、列表名称、字符串sPushName)
    {     
    string stringregIds=string.Join(“\”,\”,theregIDs);
    JavaScriptSerializer js=新的JavaScriptSerializer();
    字符串keyValueJson=js.Serialize(nameValues);
    字符串TIME_TO_LIVE=“604800”;
    空闲时的字符串延迟=“false”;
    字符串端点地址=@“https://fcm.googleapis.com/fcm/send";
    postData=String.Concat(“{time\\\\\\\\\\\\\\\\\\\\\\\\\\”:”,time\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    ,keyValueJson
    ,“},\“注册ID\:[\”“+stringregIds+”\“]}”);
    WebRequest myWebRequest=null;
    WebResponse myWebResponse=null;
    尝试
    {
    myWebRequest=WebRequest.Create(端点地址);
    myWebRequest.Method=“post”;
    myWebRequest.ContentTyp
    
        {
          "time_to_live": 300000,
          "delay_while_idle": false,
          "data": {
                   "message": "PING_DEVICE",
                   "time": "21/01/2018 16:20:28",
                   "pushguid": "10062"
                   },
          "priority": "high"  
    }
    
    {
        "android": {
            "priority": "high"
        }
    }
    
    {
        "priority": "high", // legacy HTTP protocol (this can also be set to 10)
        "android": {
            "priority": "high" // HTTP v1 protocol
        }
    }