【发布时间】:2017-08-10 21:22:45
【问题描述】:
我正在我的应用程序中播放警报声。在大多数设备上,这可以完美运行。一些用户描述没有声音播放。这似乎主要影响三星和华为设备。这是失败的一个最小示例:
alarmUri = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);
try {
if(!mediaPlayer.isPlaying()) {
mediaPlayer.setDataSource(this, alarmUri);
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
mediaPlayer.setAudioStreamType(audioManager.STREAM_ALARM);
mediaPlayer.setLooping(true);
mediaPlayer.prepare();
mediaPlayer.start();
}
} catch(Exception e) {
Log.d(logtag,"Exception: " + e);
}
对于受影响的用户,会抛出以下异常:
异常 java.io.IOException: setDataSource failed.: 状态=0x80000000
这似乎只有在 alarmURI 看起来像这样时才会发生:content://media/external/audio/media/11,即它驻留在外部存储中。当alarmURI 看到这个content://media/internal/audio/media/40 时,我从未见过它发生过。
如果我使用的 Uri 包含 /external/ 部分,我是否需要 READ_EXTERNAL_STORAGE 权限才能播放声音?还是我错过了其他东西?通常,如果权限是问题,我希望抛出一个 SecurityException 。
/e:我可以在我的设备上重现该错误。这是更详细的错误报告:
异常 java.lang.SecurityException: Permission Denial: 读取 com.android.providers.media.MediaProvider URI content://media/external/audio/media 来自 pid=27158, uid=10177 需要 android.permission.READ_EXTERNAL_STORAGE,或 grantUriPermission()
【问题讨论】:
标签: android permissions android-mediaplayer android-contentprovider android-external-storage