Does accessing audio settings through AudioManager reduce volume for other applications?

In the application I'm developing, we must notify the user through a beep when an update for the foreground service occurs.

We use this foreground service to record sound. To play the sound, we use a speaker. We turn on the speakers of the phones before the beep and completely turn off the beep, as follows:

    stopSoundPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    SpeakerManager.get().disable();
                    .....
                }
            });
            SpeakerManager.get().enable();
            stopSoundPlayer.start();

I have the following permissions in the manifest:

// Audio related permissions
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

// Other permissions
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

The permission to record audio at runtime is properly managed.

, , . , . ?

SpeakerManager:

public class SpeakerManager {

    private static SpeakerManager instance;

    private final AudioManager audioManager;

    private SpeakerManager(Context context) {
        audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        audioManager.setMode(AudioManager.STREAM_MUSIC);
    }

    public static void init(Context context) {
        instance = new SpeakerManager(context);
    }

    public static SpeakerManager get() {
        if (instance == null) {
            throw new IllegalStateException("SpeakerManager should be initialized by calling init()");
        }
        return instance;
    }

    public void enable() {
        if (null != audioManager) {
            audioManager.setSpeakerphoneOn(true);
        }
    }

    public void disable() {
        if (null != audioManager) {
            audioManager.setSpeakerphoneOn(false);
        }
    }
}
+4
2

Akhils answer, :

1: , .

activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);

2: , mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

, :)

0

public final class BeepManager {

    private static final String TAG = BeepManager.class.getSimpleName();

    private static final float BEEP_VOLUME = 0.10f;

    private final Context context;

    public BeepManager(Activity activity) {
        activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);

        // We do not keep a reference to the Activity itself, to prevent leaks
        this.context = activity.getApplicationContext();
    }


    public void playBeepSound() {
        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

        if (am != null) {
            switch (am.getRingerMode()) {
                case AudioManager.RINGER_MODE_SILENT:
                case AudioManager.RINGER_MODE_VIBRATE:
                    return;
            }
        }

        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.stop();
                mp.release();
            }
        });
        mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.w(TAG, "Failed to beep " + what + ", " + extra);
                // possibly media player error, so release and recreate
                mp.stop();
                mp.release();
                return true;
            }
        });
        try {
            AssetFileDescriptor file = context.getResources().openRawResourceFd(R.raw.beep_sound);
            try {
                mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength());
            } finally {
                file.close();
            }
            mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
            mediaPlayer.prepare();
            mediaPlayer.start();
        } catch (IOException ioe) {
            Log.w(TAG, ioe);
            mediaPlayer.release();
        }
    }
}
+1
source

Source: https://habr.com/ru/post/1691346/


All Articles