java强制音频路由到扬声器(如果用户偏好,还可以选择路由到BT)和setStreamType被棒棒糖忽略
我的目标如下,我想在首选项中为用户提供以下选项:
- 播放声音:“始终打开扬声器”或“在可用时使用蓝牙”
- 使用流:
STREAM_MUSIC
、STREAM_ALARM
、STREAM_NOTIFICATION
或STREAM_RING
我的第一个问题是,当用户将一个(棒棒糖)设备连接到一个支持a2dp的设备(汽车立体声)时,我似乎无法通过设备扬声器播放声音。(声音也没有通过a2dp设备播放)
我遇到的第二个问题是setStreamType
不知何故从棒棒糖开始就停止工作了?在棒棒糖上setStreamType
被忽略,声音总是通过AudioManager.STREAM_MUSIC
播放?(在设备pre-Lollipop上,相同的代码仍然有效)
private void playSound() {
try {
if (am == null) am = (AudioManager) _context.getSystemService(Context.AUDIO_SERVICE);
if (am.isWiredHeadsetOn() || am.isBluetoothA2dpOn()){
am.setWiredHeadsetOn(false);
am.setBluetoothScoOn(false);
// am.setMode(AudioManager.MODE_IN_CALL); // bel speaker
// am.setSpeakerphoneOn(false); // bel speaker
am.setMode(AudioManager.MODE_IN_CALL); // media speaker
am.setSpeakerphoneOn(true); // media speaker
} else {
// am.setMode(AudioManager.MODE_IN_CALL); // bel speaker
// am.setSpeakerphoneOn(false); // bel speaker
am.setMode(AudioManager.MODE_NORMAL); // media speaker
am.setSpeakerphoneOn(true); // media speaker
}
Class audioSystemClass = Class.forName("安卓.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse",
int.class,
int.class);
// 1 == FOR_MEDIA, 10 == FORCE_NO_BT_A2DP (FORCE_SPEAKER would be 1).
setForceUse.invoke(null, 1, 1);
alarmsound = _prefs.getString("alarm", alarmsound);
as = Uri.parse(alarmsound);
if (mp == null) mp = MediaPlayer.create(_context, as);
mp.reset();
if (alarmsound.startsWith("content://settings/system/"))
mp.setDataSource(_context, Uri.parse("安卓.resource://nl.xxxxxxxx.xxxxxxxx/raw/beep"));
else setMediaPlayerDataSource(_context, mp, as.toString());
mp.setAudioStreamType(Globals.AudioStreamType);
mp.prepare();
long alarmDuration = mp.getDuration();
mp.start();
}
来自Globals类:
public static int AudioStreamType = AudioManager.STREAM_MUSIC;
(用户可以将其更改为其他流类型)
我声明在清单中使用权限安卓.permission.MODIFY_AUDIO_SETTINGS
希望有人能给我指出正确的方向
共 (0) 个答案