Search code examples
androidnotificationsbroadcastreceiveraudio

Change output volume in BroadcastReceiver for Notification for non-streaming preference


WhatsApp seems to always notify me with high volume when running in the background and one of my contacts (who has a custom notification sound) comes up.

I'm trying to create a similar effect. I want to control the volume of the notification.

The only example I could find on Stack Overflow is this.

The differences here are that:

  1. My context is a BroadcastReceiver
  2. I am not streaming music but using a notification sound based on a list of default ringtones available on the phone (similar to WhatsApp).

The notification manager is based on getSystemService(Context.NOTIFICATION_SERVICE) so some of the method available normally for streaming does not seems to be available.

Could anyone shed some light. Code:

public class OnAlarmReceiver extends BroadcastReceiver {
private static final int NOTIFY_ME_ID=1337;

private static final String TAG = "OnAlarmReceiver";

@Override
public void onReceive(Context ctxt, Intent intent) {    
    Bundle bundle = intent.getExtras();
    int itemId = bundle.getInt("itemId");
    String itemTitle = bundle.getString("itemTitle");
    int priority = bundle.getInt("priority");
    long listId = bundle.getLong("listId");
    String listTitle = bundle.getString("listTitle");

    Toast.makeText(ctxt, "itemId: " + Integer.toString(itemId), Toast.LENGTH_LONG).show();

    SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(ctxt);
    boolean useNotification=prefs.getBoolean("use_notification", true);

    if (useNotification) {
        NotificationManager mgr = (NotificationManager)ctxt.getSystemService(Context.NOTIFICATION_SERVICE);                                 
        Notification notification = new Notification();         
        if (priority == 1) { // Display red icon
            notification=new Notification(R.drawable.nuvola_apps_kwrite, itemTitle, System.currentTimeMillis());    
        } else { // Display blue icon
            notification=new Notification(R.drawable.nuvola_apps_package_editors, itemTitle, System.currentTimeMillis());               
        }           
        Intent itemEditor = new Intent(ctxt, EditItem.class);
        long lAlarmId = (long) (int) itemId;
        itemEditor.putExtra(DbAdapter.KEY_ITEMS_ITEM_ID, lAlarmId);
        itemEditor.putExtra("listId", listId);
        itemEditor.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        PendingIntent i=PendingIntent.getActivity(ctxt, 0, itemEditor, PendingIntent.FLAG_UPDATE_CURRENT);          
        notification.setLatestEventInfo(ctxt, listTitle, itemTitle, i);         
        String notifyPreference = prefs.getString("notification_sound", "DEFAULT_RINGTONE_URI");                        
        notification.sound = Uri.parse(notifyPreference);

        if (priority == 1) {
            notification.defaults |= Notification.DEFAULT_VIBRATE;
        }           
        mgr.notify(itemId + NOTIFY_ME_ID, notification);
    }
    else {
        Intent i=new Intent(ctxt, AlarmActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        ctxt.startActivity(i);
    }
}

}


Solution

  • Hmm, did you try this? (yes its using an audio stream but it should work)

    private AudioManager mAudioManager;
    private Context ctxt;
    
    mAudioManager = (AudioManager)ctxt.getSystemService(Context.AUDIO_SERVICE);
    
    int streamVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION);
    
    mAudioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, streamVolume, 0);