首页 > 解决方案 > 为什么 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"/>

标签: androidandroid-mediaplayeralarmillegalstateexception

解决方案


嗨,回答晚了,但我认为您需要更多解释来支持@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. 见文档


推荐阅读