为什么 mediaplayer.prepareAsync() 抛出 IllegalStateException?

Why does the mediaplayer.prepareAsync() throw an IllegalStateException?

这是我的 Activity:

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

但它在 player.prepareAsync() 调用时抛出 IllegalStateException

虽然我已经尝试了在这个网站上找到的其他答案,但我无法修复它。

请注意,此 activity 是由 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"/>

MediaPlayer 内部已经有 prepare()。所以如果你调用第二个 prepare(),它会抛出异常。

Link official doc

您好,回答晚了,但我认为您需要更多解释来支持@Miller 的回答。

您正在使用 static MediaPlayer create (Context context, Uri uri) 方法创建 MediaPlayer 实例。该方法会通过自身调用prepare()为你分配audioSessionId。

Note that since prepare() is called automatically in this method, you cannot change the audio session ID 

很明显,您不能编辑它的 audioSessionID。而当您调用 player.prepareAsync(); 时,它会请求新的 sessionId。结果是 illegalStateExceptionsee docx