Custom notification tone not working when the application is in the background

后端 未结 1 729
陌清茗
陌清茗 2021-01-25 06:12

I am trying to use the custom notification tone. The tone is working fine when the application running but the default tone is played when the app is in the background. Also the

相关标签:
1条回答
  • 2021-01-25 06:49

    You can push notification to your app for user engaging with fire base by sending notification,when your app is closed,on basis of some parameters go to fire base .

    Make sure Your Project is Added in Fire base first before doing this at all:otherwise add your project in fire base with package name,fingerprint and google_services.json file in app folder of your project .

    Fire base Cloud Messaging

    it will push notification to your app, if its closed then it let the user to open the app via notification pressed, and if you wants to show notification to the user to direct to another apps of the same account , when the app will be in use both will happened with this code:

    Create you first class MyFirebaseMessagingService

    public class MyFirebaseMessagingService extends FirebaseMessagingService {
    
    private static final String NOTIFICATION_ID_EXTRA = "notificationId";
    private static final String IMAGE_URL_EXTRA = "imageUrl";
    private static final String ADMIN_CHANNEL_ID ="admin_channel";
    private NotificationManager notificationManager;
    
    
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
    
        if (remoteMessage.getData().size()>0){
    
            Intent notificationIntent = new Intent(Intent.ACTION_VIEW);
            notificationIntent.setData(Uri.parse(remoteMessage.getData().get("applink")));
            PendingIntent pi = PendingIntent.getActivity(this, 0, notificationIntent, 0);
            notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
            final PendingIntent pendingIntent = PendingIntent.getActivity(this,
                    0 /* Request code */, notificationIntent,
                    PendingIntent.FLAG_ONE_SHOT);
    
            int notificationId = new Random().nextInt(60000);
            Bitmap bitmap = getBitmapfromUrl(remoteMessage.getData().get("imageurl"));
    
            Intent likeIntent = new Intent(this,LikeService.class);
            likeIntent.putExtra(NOTIFICATION_ID_EXTRA,notificationId);
            likeIntent.putExtra(IMAGE_URL_EXTRA,remoteMessage.getData().get("message"));
            PendingIntent likePendingIntent = PendingIntent.getService(this,
                    notificationId+1,likeIntent, PendingIntent.FLAG_ONE_SHOT);
    
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    
            notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
    
                setupChannels();
    
            }
    
            NotificationCompat.Builder notificationBuilder =
                    new NotificationCompat.Builder(this, ADMIN_CHANNEL_ID)
                            .setLargeIcon(bitmap)
                            .setSmallIcon(R.mipmap.ic_launcher)
                            .setContentTitle(remoteMessage.getData().get("title"))
                            .setStyle(new NotificationCompat.BigPictureStyle()
                                    .setSummaryText(remoteMessage.getData().get("message"))
                                    .bigPicture(bitmap))/*Notification with Image*/
                            .setContentText(remoteMessage.getData().get("message"))
                            .setAutoCancel(true)
                            .setSound(defaultSoundUri)
                            .addAction(R.drawable.icon,
                                    getString(R.string.notification_add_to_cart_button),likePendingIntent)
                            .setContentIntent(pendingIntent);
    
            notificationManager.notify(notificationId, notificationBuilder.build());
    
    
        }
    
    }
    
    
    @RequiresApi(api = Build.VERSION_CODES.O)
    private void setupChannels(){
        CharSequence adminChannelName = getString(R.string.notifications_admin_channel_name);
        String adminChannelDescription = getString(R.string.notifications_admin_channel_description);
    
        NotificationChannel adminChannel;
        adminChannel = new NotificationChannel(ADMIN_CHANNEL_ID, adminChannelName, NotificationManager.IMPORTANCE_LOW);
        adminChannel.setDescription(adminChannelDescription);
        adminChannel.enableLights(true);
        adminChannel.setLightColor(Color.RED);
        adminChannel.enableVibration(true);
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(adminChannel);
        }
    }
    
    
    
    public Bitmap getBitmapfromUrl(String imageUrl) {
        try {
            URL url = new URL(imageUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            return BitmapFactory.decodeStream(input);
    
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    
        }
    

    Create another class FirebaseIDService to get instance id service of fire base

    public class FirebaseIDService extends FirebaseInstanceIdService {
    
    
    public static final String FIREBASE_TOKEN = "firebase token";
    
    @Override
    public void onTokenRefresh() {
        super.onTokenRefresh();
    
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        SharedPreferences preferences =
                PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        preferences.edit().putString(FIREBASE_TOKEN, refreshedToken).apply();
    
    }
    

    Make class Name LikeService

    public class LikeService extends Service {
    
    private static final String NOTIFICATION_ID_EXTRA = "notificationId";
    private static final String IMAGE_URL_EXTRA = "imageUrl";
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
        }
    

    To Support Notification at Oreo with firebase dont forget to create Channels and this channels initialize in your First Launcher Activity.

    in oncreate of your project first launcher activity include these channels;

       String channelId = "1";
        String channel2 = "2";
    
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(channelId,
                    "Channel 1", NotificationManager.IMPORTANCE_HIGH);
    
            notificationChannel.setDescription("This is BNT");
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.enableVibration(true);
            notificationChannel.setShowBadge(true);
            notificationManager.createNotificationChannel(notificationChannel);
    
            NotificationChannel notificationChannel2 = new NotificationChannel(channel2,
                    "Channel 2",NotificationManager.IMPORTANCE_MIN);
    
            notificationChannel.setDescription("This is bTV");
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.enableVibration(true);
            notificationChannel.setShowBadge(true);
            notificationManager.createNotificationChannel(notificationChannel2);
    
        }
    

    Now you have to put your Firebase service class in Mainfest under application tag:

          <service android:name=".activities.services.MyFirebaseMessagingService"
            android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
    
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
                <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
    
            </intent-filter>
    
        </service>
    
        <service android:name=".activities.services.FirebaseIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
    

    Now run your app on your device before push notification with fire base make sure your code is integrated correctly then run app: and go to fire base cloud messaging:

    put data as in photo according to your app: when its closed:

    if your app is in use then your data written in advance option will show, its data about your promotional app of the same account, don use another account app here,

    make sure your key should be like in above class as onMessagede Recieved in MyFirebaseMessagingService class

    like

    title ,message,applink,imageurl

    0 讨论(0)
提交回复
热议问题