【问题标题】:Why does the mediaplayer.prepareAsync() throw an IllegalStateException?为什么 mediaplayer.prepareAsync() 会抛出 IllegalStateException?
【发布时间】:2019-11-23 02:14:16
【问题描述】:

这是我的活动:

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

虽然我已尝试在此站点上找到其他答案,但我无法修复它。

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

【问题讨论】:

    标签: android android-mediaplayer alarm illegalstateexception


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      Link official doc

      【讨论】:

        猜你喜欢
        • 2011-08-29
        • 2021-07-19
        • 2011-07-07
        • 2012-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 2021-12-20
        相关资源
        最近更新 更多