fcm push notification not working in one plus 6 mobile

十年热恋 提交于 2021-02-18 22:35:34

问题


FCM push notification is working in following devices properly when the device is in the background, foreground and also when an app is close by swiping from a tray. Brandname (android-Version) Micromax (5.1) Motorola (7.1.1) Nokia (8.1.0) Samsung (8.0.0) Nexus (8.1.0) xiaomi (7.1.2)

But in case of oneplus, fcm notification is not working when an app is closed by swiping from a tray, but work properly when an app is in foreground and background. Device Version OnePlus 8.1.0

But when I manually off the battery optimization option for my app, then in all case fcm push notification work properly in Oneplus device

My androidManifest.xml is

<?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>

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

My app level build.gradel

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'

My project level 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"
        }
    }
}

And I am sending token to server in this way

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

Any small help will be appreciated


回答1:


this happens because of Doze Mode you can overcome this in fcm by setting the push notification message priority from backend side to be high message priority take a look at is documentation




回答2:


In these devices (like OnePlus,Huawie,OPPO) they are using custom version of os by base on android os may be when its on the battery optimisation it forcefully turn off the background service of FCM and we don't get any notification.




回答3:


Try this code

Uri defaultSoundUri = 
RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
 NotificationCompat.Builder notificationBuilder = new 
NotificationCompat.Builder(this)
 .setSmallIcon(R.drawable.ic_notif_icon)
  .setContentTitle("testTitle")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setChannelId("testChannelId") // set channel id
.setContentIntent(pendingIntent);


来源:https://stackoverflow.com/questions/52178082/fcm-push-notification-not-working-in-one-plus-6-mobile

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!