【问题标题】:Android MediaPlayer not playing sound on some platformsAndroid MediaPlayer 在某些平台上不播放声音
【发布时间】:2011-01-27 18:28:19
【问题描述】:

我目前正在开发一个以不同时间间隔向用户播放声音的 Android 应用程序。我有工作代码(包括在下面),它在我的 Hero(运行 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。手机总是在应该振动的时候振动,所以肯定是在呼叫 notifyUser。

我朋友安装的版本使用的是 e.printStackTrace 而不是 Log.i,所以 logcat 中没有任何内容被吐出。我将尝试获取他的手机以将其更新为带有 Log.i 的版本,但与此同时,代码是否有任何明显的错误可能导致这种间歇性问题?

谢谢,

【问题讨论】:

    标签: android audio media-player android-audiomanager


    【解决方案1】:

    事实证明,更新我在原始帖子中列出的异常处理似乎已经解决了这个问题。

    如果您将上述代码用于任何事情,值得注意的是,有时 e.getMessage() 返回 null,而不是

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

    使用

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

    在抛出异常时避免任何令人讨厌的 FC。

    抱歉,顺便问了一个无法回答的问题!

    【讨论】:

      【解决方案2】:

      不确定,但旧版本的 Android 在播放 WAV 文件时出现问题。您尝试播放的是这些 WAV 文件还是 MP3 文件?

      【讨论】:

      • 我已经用 mp3 进行了测试(在模拟器中,使用 1.6),然后我的 Hero 拥有的任何东西(使用 2.2)都可以工作。我不知道 x8 使用什么格式,或者是哪个版本的 Android(尽管快速谷歌建议使用 2.1)。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多