fcm推送通知不能在一个加6手机中工作

问题描述 投票:5回答:3

当设备处于后台,前台以及通过从托盘中滑动关闭应用程序时,FCM推送通知正在以下设备中正常工作。品牌名称(android-版本)Micromax(5.1)摩托罗拉(7.1.1)诺基亚(8.1.0)三星(8.0.0)Nexus(8.1.0)xiaomi(7.1.2)

但是对于oneplus,当通过从托盘滑动关闭应用程序时fcm通知不起作用,但是当应用程序处于前台和后台时正常工作。设备版本OnePlus 8.1.0

但是当我手动关闭我的应用程序的电池优化选项时,在所有情况下fcm推送通知在Oneplus设备中正常工作

我的androidManifest.xml是

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.demo.Notification"
    android:installLocation="auto">

    <uses-permission android:name="android.permission.VIBRATE" />

    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <!-- [START fcm_default_icon] -->
        <!-- Set custom default icon. This is used when no icon is set for incoming notification messages. -->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@mipmap/ic_launcher" />
        <!-- [END fcm_default_icon] -->
        <!-- [START fcm_default_channel] -->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="@string/default_notification_channel_id"/>
        <!-- [END fcm_default_channel] -->

        <service
            android:name=".MyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

        <activity
            android:name="com.demo.Notification.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我的MyFirebaseMessagingService.java

package com.demo.Notification;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import org.json.JSONObject;

public class MyFirebaseMessagingService extends FirebaseMessagingService
{
    private static final String NOTIFICATION_MESSAGE_KEY = "MESSAGE";
    private NotificationManager notificationManager;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage)
    {

        sendNotification(remoteMessage.getData().get(NOTIFICATION_MESSAGE_KEY));
    }

    private void sendNotification(String msg)
    {
        String notification_message_title = "";
        String notification_message_text = "";
        int notification_id = 1;
        String channel_id = getString(R.string.default_notification_channel_id);

        try
        {
            JSONObject jsonObject = new JSONObject(msg);

            if(jsonObject.has("notification_message_title"))
            {
                notification_message_title = jsonObject.getString("notification_message_title");
                notification_message_title = (notification_message_title != null) ? notification_message_title.trim() : "";
            }

            if(jsonObject.has("notification_message_text"))
            {
                notification_message_text = jsonObject.getString("notification_message_text");
                notification_message_text = (notification_message_text != null) ? notification_message_text.trim() : "";
            }

            if("".equals(notification_message_title))
            {
                return;
            }

            if("".equals(notification_message_text))
            {
                return;
            }

        }
        catch(Exception e)
        {
            return;
        }

        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        {
            setupChannels();
        }

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this,channel_id);
        mBuilder.setAutoCancel(true);
        mBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
        mBuilder.setContentTitle(notification_message_title);
        mBuilder.setContentText(notification_message_text);
        mBuilder.setColor(Color.BLUE);
        mBuilder.setSmallIcon(R.mipmap.ic_launcher);

        Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
        mBuilder.setLargeIcon(largeIcon);

        Uri notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        mBuilder.setSound(notificationSound);


        Intent resultIntent = new Intent(this, MainActivity.class);
        resultIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent resultPendingIntent =
                PendingIntent.getActivity(
                        this,
                        notification_id,
                        resultIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );
        mBuilder.setContentIntent(resultPendingIntent);

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        {
            mBuilder.setChannelId(channel_id);
        }

        NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);
        notificationManagerCompat.notify(notification_id, mBuilder.build());

        //SEND Notification END
    }


    @RequiresApi(api = Build.VERSION_CODES.O)
    private void setupChannels(){
        String channel_id = getString(R.string.default_notification_channel_id);
        CharSequence channelName = getString(R.string.default_notification_channel_name);

        NotificationChannel channel = new NotificationChannel(channel_id, channelName, NotificationManager.IMPORTANCE_MAX);
        channel.enableLights(true);
        channel.setLightColor(Color.BLUE);
        channel.enableVibration(true);
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(channel);
        }
    }
}

我的app级build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    buildToolsVersion "27.0.3"
    defaultConfig {
        applicationId "com.demo.Notification"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:27.1.1'    
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.google.firebase:firebase-messaging:17.3.0'
}
apply plugin: 'com.google.gms.google-services'

我的项目级build.gradle

buildscript {
    repositories {
        jcenter()
        maven {
            url "https://maven.google.com"
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.google.gms:google-services:4.1.0'
    }
}

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://maven.google.com"
        }
    }
}

我正以这种方式向服务器发送令牌

public void registerDevice()
{
    FirebaseInstanceId.getInstance().getInstanceId()
            .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
                @Override
                public void onComplete(@NonNull Task<InstanceIdResult> task)
                {
                    String registrationId = task.getResult().getToken();
                    sendTokenToServer(registrationId);
                }
            });
}

任何小帮助将不胜感激

android push-notification battery oneplusx
3个回答
1
投票

发生这种情况是因为Doze Mode你可以通过设置推送通知消息优先级从后端到高消息优先级来查看fcmxswpoi


0
投票

在这些设备(如OnePlus,Huawie,OPPO)中,他们使用基于android OS的自定义版本的操作系统可能是当它在电池优化时强行关闭FCM的后台服务而我们没有得到任何通知。


0
投票

试试这个代码

documentation
© www.soinside.com 2019 - 2024. All rights reserved.