未处理的 IO 异常?使用媒体播放器播放 mp3 文件 - Android
Posted
技术标签:
【中文标题】未处理的 IO 异常?使用媒体播放器播放 mp3 文件 - Android【英文标题】:Unhandled IO exception ? Playing mp3 file with a media player - Android 【发布时间】:2013-08-13 10:15:41 【问题描述】:这是我的代码: (例如,假设我将它放在 OnCreate 中,以便在 Activity 启动时播放声音。)
AssetFileDescriptor afda = getAssets().openFd("AudioFile.mp3");
MediaPlayer player;
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();
除其他外,这是我在 SO 上找到的解决方案:
try // above erroneous code here
mediaPlayer.start();
catch (IllegalArgumentException e)
e.printStackTrace();
catch (SecurityException e)
e.printStackTrace();
catch (IllegalStateException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
我尝试将每个给出 Unhandled IO 异常错误的语句放在 try catch 语句中。但是在这样做时,应用程序会出现 ANR,无法启动,并且 logcat 会给出类似“无法初始化 MainActivity”的信息 ....
经过进一步研究,我发现此代码对其他人都有效,也许我没有添加任何东西..
这段代码有什么问题?如何纠正?
(或者,有没有更好更有效或更简单的方式来播放文件?我只需要播放/暂停功能。) (我有一个 [scrollable tab + swipe] 导航应用程序,我想在每个选项卡的屏幕上播放不同的 mp3 文件......只需将它放在 oncreate 中进行测试......)
这是修改后的代码和它产生的运行时错误的 logcat。基本上,我放在 try catch 框中的所有语句都会给出“未处理的异常类型 IO”编译时错误。
将这3个错误语句放在try catch中编译时没有问题,但导致activity无法启动(见代码下方的logcat输出)
try
AssetFileDescriptor afda = getAssets().openFd("AudioFile.mp3");
catch (IllegalArgumentException e)
e.printStackTrace();
catch (SecurityException e)
e.printStackTrace();
catch (IllegalStateException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
MediaPlayer player;
player = new MediaPlayer();
try
player.setDataSource(afd.getFileDescriptor());
catch (IllegalArgumentException e)
e.printStackTrace();
catch (SecurityException e)
e.printStackTrace();
catch (IllegalStateException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
try
player.prepare();
catch (IllegalArgumentException e)
e.printStackTrace();
catch (SecurityException e)
e.printStackTrace();
catch (IllegalStateException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
player.start();
08-13 16:00:41.869: E/androidRuntime(16412): FATAL EXCEPTION: main
08-13 16:00:41.869: E/AndroidRuntime(16412): java.lang.RuntimeException: Unable to start activity ComponentInfown.w/wn.w.MainActivity: java.lang.NullPointerException
08-13 16:00:41.869: E/AndroidRuntime(16412): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2077)
08-13 16:00:41.869: E/AndroidRuntime(16412): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
08-13 16:00:41.869: E/AndroidRuntime(16412): at android.app.ActivityThread.access$600(ActivityThread.java:134)
08-13 16:00:41.869: E/AndroidRuntime(16412): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
08-13 16:00:41.869: E/AndroidRuntime(16412): at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 16:00:41.869: E/AndroidRuntime(16412): at android.os.Looper.loop(Looper.java:154)
08-13 16:00:41.869: E/AndroidRuntime(16412): at android.app.ActivityThread.main(ActivityThread.java:4624)
08-13 16:00:41.869: E/AndroidRuntime(16412): at java.lang.reflect.Method.invokeNative(Native Method)
08-13 16:00:41.869: E/AndroidRuntime(16412): at java.lang.reflect.Method.invoke(Method.java:511)
08-13 16:00:41.869: E/AndroidRuntime(16412): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
08-13 16:00:41.869: E/AndroidRuntime(16412): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
08-13 16:00:41.869: E/AndroidRuntime(16412): at dalvik.system.NativeStart.main(Native Method)
08-13 16:00:41.869: E/AndroidRuntime(16412): Caused by: java.lang.NullPointerException
08-13 16:00:41.869: E/AndroidRuntime(16412): at wn.w.MainActivity.onCreate(MainActivity.java:71)
08-13 16:00:41.869: E/AndroidRuntime(16412): at android.app.Activity.performCreate(Activity.java:4479)
08-13 16:00:41.869: E/AndroidRuntime(16412): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
08-13 16:00:41.869: E/AndroidRuntime(16412): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
08-13 16:00:41.869: E/AndroidRuntime(16412): ... 11 more
在第 71 行,我有: player.setDataSource(afd.getFileDescriptor()); (这是在try catch中(见上面的代码))
【问题讨论】:
发布完整的Logcat...请.. 完成 :)(见上面的编辑) MainActivity.java: Line 71 这是什么?? player.setDataSource(afd.getFileDescriptor()); 请检查下面的代码并重播.. 【参考方案1】:替换
AssetFileDescriptor afda = getAssets().openFd("AudioFile.mp3");
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();
与
AssetFileDescriptor afda;
try
afda = getAssets().openFd("AudioFile.mp3");
catch (IOException e)
e.printStackTrace();
if (afd != null)
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();
else
Log.i("Check This", "AudioFile.mp3 really exist? afd is null ");
【讨论】:
未处理的异常类型 IOException,我认为问题在于“afd”和“player”两者 你能把音频放入RAW文件和MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);媒体播放器.start(); developer.android.com/guide/topics/media/mediaplayer.html 等等,让我试试..顺便说一句,create() 一个给出了同样的错误(空指针) 不,:/ if 块中的相同编译时错误(与我对此答案的第一条评论相同)......我不知道为什么玩家会导致这个:/ 我可以以某种方式做到这一点使用 XML 或任何其他解决方案更容易? 顺便说一句,在您上面建议的 player.create(..,..) 中,我将 Context 变量初始化为 null...以上是关于未处理的 IO 异常?使用媒体播放器播放 mp3 文件 - Android的主要内容,如果未能解决你的问题,请参考以下文章
MediaPlayer播放在线MP3资源时报出java.io.IOException: Prepare failed.: status=0x1异常