Wooram Jung
Wooram Jung

Reputation: 248

How to change notification sound dynamically in Android O

Recently I use notification channel to support android O. But the problem is I cannot change the sound Uri dynamically. Our app have notification sound setting which user can change app notification sound as they want. But as you know, Android now do not allow developer to update notification channel before user reinstall app. There I consider several possible solutions which is not looks good.

  1. User ringtone manager to play ringtone instead of setSound. But when user disable notification in app setting, still ringtone will not stop playing. (This will be bad user experience)

  2. Delete notification channel and create new one when user change ringtone sound. But this also looks bad because in app setting google shows the history of deleted channel info.(Actually not necessary)

Is there any good solution?

Upvotes: 13

Views: 10563

Answers (2)

Mugunthan24
Mugunthan24

Reputation: 11

@RequiresApi(api = Build.VERSION_CODES.O) private void createChannels() {

    Nmanager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

    AudioAttributes attributes = new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_NOTIFICATION)
            .build();

    ArrayList arrayList = new ArrayList<String>();
    Field[] fields = R.raw.class.getFields();
    for (int i = 1; i < fields.length - 1; i++) {
        arrayList.add(fields[i].getName());
    }


    DBRingtone RDB = new DBRingtone(this);
    Cursor cursor = RDB.getringtone();

    if (cursor.getCount() > 0) {

        int ring = parseInt(cursor.getString(0));

         resID = getResources().getIdentifier((String) arrayList.get(ring), "raw", getPackageName());

        i=i+resID;

        uri = Uri.parse("android.resource://" + getPackageName() + "/" + resID);
    } else
        {
            i=i+10;
        uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.default_sound);
    }

    CHANNEL_ID = CHANNEL_ID+i;

    notificationChannel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
    notificationChannel.enableLights(true);
    notificationChannel.enableVibration(true);
    notificationChannel.setDescription("Your message");
    notificationChannel.setLightColor(Color.RED);
    notificationChannel.setSound(uri, attributes);
    notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
    Nmanager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    Nmanager.createNotificationChannel(notificationChannel);

}

Hello all, I have solved this problem using the above code and it's working. You can also assign CHANNEL_ID = CHANNEL_ID+resID directly to. For the purpose i have assigned using variable i. I have stored the user preferred Notification sounds resID is SQLite database and In the createchannels class i have retrieved that resID using cursor to create the uri's path.Hope this will help you Thank you...

Upvotes: 1

ianhanniballake
ianhanniballake

Reputation: 199825

On Android O+ devices, you should remove any notification specific settings within your app and offer a link within your settings screen to open the system's notification channel settings, where the user can adjust the sound of the notification channel directly.

Upvotes: 12

Related Questions