Android MediaPlayer не воспроизводит звук на некоторых платформах

В настоящее время я разрабатываю приложение для Android, которое воспроизводит звук пользователю через различные промежутки времени. У меня есть рабочий код (приведен ниже), который работает точно так, как ожидалось, на моем герое (под управлением 2.2) и на эмуляторе 1.6. Однако у моих друзей Xperia x8 это не работает — звук не воспроизводится. У него настроен тон уведомлений, который отлично воспроизводится, когда он получает текст и так далее.

private void prepareAudio(){
    alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    mp = new MediaPlayer();
    if(alert != null){
        try {
            mp.setDataSource(ctx, alert);
        } catch (IllegalArgumentException e) {
            Log.i("Prepare Audio", e.getMessage());
        } catch (SecurityException e) {
            Log.i("Prepare Audio", e.getMessage());
        } catch (IllegalStateException e) {
            Log.i("Prepare Audio", e.getMessage());
        } catch (IOException e) {
            Log.i("Prepare Audio", e.getMessage());
        }
    }
    am = (AudioManager)ctx.getSystemService(Context.AUDIO_SERVICE);
}

private void notifyUser(){
    if(alert != null){
        if (am.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
            mp.setAudioStreamType(AudioManager.STREAM_ALARM);
            mp.setLooping(false);
            try {
                mp.prepare();
            } catch (IllegalStateException e) {
                Log.i("Notify User", e.getMessage());
            } catch (IOException e) {
                Log.i("Notify User", e.getMessage());
            }
            mp.start();
        } else {
            Log.i("Notify User", "Alarm volume zero");
        }
    } else {
        Log.i("Notify User", "Uri is null");
    }
    long[] pattern = {0,200,300,600}; 
    v.vibrate(pattern, -1);
}

PrepareAudio вызывается при инициализации класса и уведомляет пользователя каждый раз, когда мы хотим воспроизвести звук. Телефон всегда вибрирует, когда должен, так что явно вызывается notifyUser.

Версия, которую установил мой друг, использует e.printStackTrace, а не Log.i, поэтому в logcat ничего не выплевывается. Я собираюсь попытаться завладеть его телефоном, чтобы обновить его до версии с Log.i, но тем временем есть ли что-то явно не так с кодом, который может вызвать такую ​​​​периодическую проблему?

Спасибо,


person Dan    schedule 27.01.2011    source источник


Ответы (2)


Итак, оказалось, что обновление моей обработки исключений, как указано в исходном сообщении, устранило проблему.

Если вы используете приведенный выше код для чего-либо, стоит отметить, что иногда e.getMessage() возвращает значение null, поэтому вместо

Log.i("Notify User", e.getMessage());

использовать

Log.i("Notify User", e.getMessage() + "");

Чтобы избежать каких-либо неприятных FC при возникновении исключения.

Извините за случайно оставшийся без ответа вопрос!

person Dan    schedule 31.01.2011

Не уверен, но в старых версиях Android были проблемы с воспроизведением файлов WAV. Это файлы WAV или MP3, которые вы пытаетесь воспроизвести?

person MusiGenesis    schedule 27.01.2011
comment
Я тестировал с mp3 (в эмуляторе, с 1.6), а затем с тем, что есть у моего Героя (с 2.2), оба работают. Я не знаю, какой формат использует x8 или какая версия Android (хотя быстрый гугл предлагает 2.1). Спасибо! - person Dan; 27.01.2011