(Android MediaPlayer) Как я должен вызывать setAudioStreamType(), если MediaPlayer.create() неявно вызывает prepare()?

Я пишу приложение будильника для Android, которое использует службу для воспроизведения сигнала будильника. В настоящее время я могу воспроизвести звук, но он воспроизводится в форме, которую можно отключить, уменьшив громкость устройства. Таким образом, я пытаюсь добавить вызов setAudioStreamType(AudioManager.STREAM_ALARM);, чтобы предотвратить это.

У меня есть следующее для моей функции onStartCommand()службы:

MediaPlayer mMP;    
@Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        try
        {
            mMP = MediaPlayer.create(this, R.raw.alarm);
            mMP.setAudioStreamType(AudioManager.STREAM_ALARM);
            mMP.setLooping(true);
            //mMP.prepare(); commented out since prepare() is called in create
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        if (mMP != null) mMP.start();

        return START_STICKY;
    }

Проблема в том, что при вызове setAudioStreamType() MediaPlayer никогда не воспроизводит звук. Если я закомментирую эту строку, будет воспроизводиться звук.

При вводе строки я получаю следующие ошибки времени выполнения:

04-10 19:32:03.115: E/MediaPlayer(3411): setAudioStream вызывается в состоянии 8

04-10 19: 32:03.115: E/MediaPlayer(3411): ошибка (-38, 0)

04-10 19:32:03.115: E/MediaPlayer(3411): запуск вызван в состоянии 0

04-10 19: 32:03.115: E/MediaPlayer(3411): ошибка (-38, 0)

04-10 19:32:03.115: E/MediaPlayer(3411): ошибка (-38,0)

04-10 19:32:03.115: E/MediaPlayer(3411): Ошибка (-38,0)

Некоторые исследования (сейчас не могу найти ссылку) показали, что setAudioStreamType()не может быть вызвана после вызова prepare()и что create()неявно вызывает prepare().

В любом случае, как я должен setAudioStreamType()без такой ошибки?

12
задан finiteloop 10 April 2012 в 23:35
поделиться