android - 为什么 mediaplayer.prepareAsync() 会抛出 IllegalStateException?
问题描述
这是我的活动:
public class AlarmPlayerActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener {
private MediaPlayer player;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm_player);
int alarm_number = getIntent().getIntExtra(Config.KEY_ALARM_NO, 0);
((TextView) findViewById(R.id.alarm_message)).setText(getString(R.string.alarms_was_set).concat(": " + alarm_number));
}
public void stopPlayingAlarm(View view) {
if (player != null && player.isPlaying()) {
player.reset();
player.stop();
player.release();
}
}
@Override
protected void onStart() {
super.onStart();
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
player = MediaPlayer.create(this, uri);
player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.setLooping(true);
player.setOnPreparedListener(this);
player.prepareAsync();
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
}
但它IllegalStateException
随叫随到player.prepareAsync()
。
尽管我尝试了在此站点中找到的其他答案,但我无法修复它。
请注意,此活动是从由RTC_WAKEUP
警报触发的广播接收器启动的。
这是我的 AndroidManifest 的一部分:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
解决方案
嗨,回答晚了,但我认为您需要更多解释来支持@Miller 的回答。
您正在使用方法创建MediaPlayer实例static MediaPlayer create (Context context, Uri uri)
。此方法将通过自己调用为您分配 audioSessionId prepare()
。
Note that since prepare() is called automatically in this method, you cannot change the audio session ID
所以很明显,你不能编辑它的 audioSessionID。而当你调用player.prepareAsync();
它时,它会请求新的 sessionId。这导致illegalStateException
. 见文档
推荐阅读
- python - ValueError:使用 seaborn 时缓冲区的维数错误(预期为 1,得到 2)
- java - Javax 验证未捕获 POJO 的内部字段
- python - python子进程多次提供输入和读取输出[windows]
- node.js - TypeScript 生成错误
- angular - 在 Ionic GET 请求中设置自定义标头问题
- javascript - 如何在 Javascript 中制作具有一定数量列的表?
- opengl-es - OpenGL透明背景
- javascript - 我需要从网站上的动态表中提取数据,我想使用 Jsoup (Java)
- javascript - 在不使用 event.preventDefault 的情况下防止 html5 表单提交
- android-studio - 我无法在我创建的 android studio 中打开我的模拟器