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);
录制完成后,用户可以播放录制的信息,该信息按预期工作:
MediaPlayer mediaPlayer = new MediaPlayer();
try {
fileName = getFilesDir().getAbsolutePath() + "/voiceMessage.amr";
Log.i(TAG, fileName);
mediaPlayer.setDataSource(fileName);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
}
Logcat为/data/data/com.messages.android/files/voiceMessage.amr
打印fileName
,这很好。保存语音邮件后,我会将其上传到我的服务器,然后为每个用户下载。下载的文件保存在内部存储中。
现在抛出异常的部分:
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) {
}
}
Logcat为/data/data/com.messages.android/files/c02bfe404359860eb582aff318afb1f41469514396529.amr
打印voiceMessage.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)
该例外仅出现在我们的开发手机Huawei ALE-L21上。两款不同的三星手机和一部不同的华为手机不会抛出异常。
编辑:我尝试了两种不同的方法,两种方法都没有成功。
1
FileInputStream fi = new FileInputStream(voiceMessage);
mediaPlayer.setDataSource(fi.getFD());
2
voiceMessage.setReadable(true, false);
mediaPlayer.setDataSource(voiceMessage.getAbsolutePath());
编辑3: 所以昨天我尝试了一些事情:我从服务器端的损坏设备上更改了语音留言文件的文件名,这样破损设备上的用户就会下载自己的语音留言,之前已上传到服务器。即使在下载之后播放它自己的语音消息也能正常工作。所以问题应该是录制时的OutputFormat,对吧?是否有适用于所有设备的Android 4.1+通用OutputFormat?