MediaPlayer java.io.IOException: Prepare failed.: status=0x1 with Huawei ALE-L21

Chr*_*ris 5 android file-upload download media-player

我遇到了一个奇怪的问题。我的应用程序允许用户录制将保存为 .amr 文件的语音消息。

String fileName = getFilesDir().getAbsolutePath() + "/voiceMessage.amr";

MediaRecorder mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);
mediaRecorder.setOutputFile(fileName);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
Run Code Online (Sandbox Code Playgroud)

录制后,用户可以播放他录制的消息,按预期工作:

MediaPlayer mediaPlayer = new MediaPlayer();

try {
    fileName = getFilesDir().getAbsolutePath() + "/voiceMessage.amr";
    Log.i(TAG, fileName);
    mediaPlayer.setDataSource(fileName);
    mediaPlayer.prepare();
    mediaPlayer.start();
} catch (IOException e) {
}
Run Code Online (Sandbox Code Playgroud)

Logcat 打印/data/data/com.messages.android/files/voiceMessage.amrfileName,这很好。保存语音消息后,我会将其上传到我的服务器,稍后为每个用户下载。下载的文件保存在内部存储器中。

现在抛出异常的部分:

MediaPlayer mediaPlayer = new MediaPlayer();
File voiceMessage = user.getVoiceMessageFile(context);

if (voiceMessage.exists()) {
    try {
        Log.i(TAG, voiceMessage.getAbsolutePath());
        mediaPlayer.setDataSource(voiceMessage.getAbsolutePath());
        mediaPlayer.prepare();
        mediaPlayer.start();
    } catch (IOException e) {

    }
}
Run Code Online (Sandbox Code Playgroud)

logcat的版画/data/data/com.messages.android/files/c02bfe404359860eb582aff318afb1f41469514396529.amrvoiceMessage.getAbsolutePath()这是罚款。所以该文件存在并且在内部存储中。我不修改服务器端的文件。只需保存和下载。

仍然收到以下异常mediaPlayer.prepare()

> java.io.IOException: Prepare failed.: status=0x1  at
> android.media.MediaPlayer._prepare(Native Method)     at
> android.media.MediaPlayer.prepare(MediaPlayer.java:1168)  at
> com.messages.android.views.SeekBarLinearLayoutView.onClick(SeekBarLinearLayoutView.java:172)
>   at android.view.View.performClick(View.java:4766)   at
> android.view.View$PerformClick.run(View.java:19683)   at
> android.os.Handler.handleCallback(Handler.java:739)   at
> android.os.Handler.dispatchMessage(Handler.java:95)   at
> android.os.Looper.loop(Looper.java:135)   at
> android.app.ActivityThread.main(ActivityThread.java:5538)     at
> java.lang.reflect.Method.invoke(Native Method)    at
> java.lang.reflect.Method.invoke(Method.java:372)  at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
>   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Run Code Online (Sandbox Code Playgroud)

例外仅出现在我们的开发手机华为 ALE-L21 上。两部不同的三星手机和一部不同的华为手机不会抛出异常。

编辑:我尝试了两种不同的方法,都没有奏效。

1.

FileInputStream fi = new FileInputStream(voiceMessage);
mediaPlayer.setDataSource(fi.getFD());
Run Code Online (Sandbox Code Playgroud)

2.

voiceMessage.setReadable(true, false);
mediaPlayer.setDataSource(voiceMessage.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)

编辑3: 所以我昨天尝试了一些东西:我从服务器端的损坏设备更改了语音消息文件的文件名,以便损坏设备上的用户将下载自己的语音消息,该消息先前已上传到服务器. 播放它自己的语音信息,即使在下载后,也能正常工作。所以问题应该是录制时的OutputFormat,对吧?是否有适用于所有设备的 Android 4.1+ 通用输出格式?