【问题标题】:Audio settings access via AudioManager causes decrease in volume for other apps?通过 AudioManager 访问音频设置会导致其他应用的音量降低?
【发布时间】:2017-12-26 11:54:46
【问题描述】:

在我正在开发的应用程序中,当前台服务发生更新时,我们必须通过哔声通知用户。

我们使用此foreground service 进行录音。要播放哔声,我们使用扬声器。我们在播放哔声之前启用手机扬声器,并在哔声完全播放时禁用,如下所示:

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

我在 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" />

运行时录音权限管理得当。

但是当我的应用程序安装在任何手机上时,它会自动降低所有其他正在播放音频的应用程序的音量。当我卸载我的应用程序时,音量会恢复。这可能是什么原因造成的?

下面是我的 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);
        }
    }
}

【问题讨论】:

    标签: android audio android-audiomanager android-mediarecorder


    【解决方案1】:

    在下面尝试播放哔声

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

    【讨论】:

      【解决方案2】:

      我关注了Akhils answer,但有一些细微的变化:

      更改 1:从构造函数中删除以下行,因为我想在服务中使用它。

      activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
      

      更改 2:因为我想播放此哔声作为通知声音,所以我更改了以下行 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);tomediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

      因此赏金归于 Akhil :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-05
        • 2014-12-11
        • 2013-05-30
        • 1970-01-01
        • 2014-05-05
        • 2023-03-11
        • 1970-01-01
        • 2012-05-17
        相关资源
        最近更新 更多