这段时间在学Android开发,自己跟着第一行代码这本书在学,学到了8.4播放多媒体这一章节。然后跟着书上的代码敲,还是能发现到很多问题啊。
-
一个低级的错误
03-11 22:32:50.983 14567-14567/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: cn.jnu.playaudiotest, PID: 14567
java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.jnu.playaudiotest/cn.jnu.playaudiotest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.setDataSource(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2946)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6810)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.setDataSource(java.lang.String)' on a null object reference
at cn.jnu.playaudiotest.MainActivity.initMediaPlayer(MainActivity.java:65)
at cn.jnu.playaudiotest.MainActivity.onCreate(MainActivity.java:40)
at android.app.Activity.performCreate(Activity.java:7224)
at android.app.Activity.performCreate(Activity.java:7213)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2926)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6810)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
一开始我还一直一位是我的文件位置错了,空指针居然都能改错,都是因为我该死的粗心啊!
错误
正确
-
音乐存放的位置
内容是使用MediaPlayer来实现Android中音频文件的播放,书中是通过获取外部存储的music.mp3文件来播放。
问题就来了,外部存储?SD卡?我翻遍了我2000k的小米note3,也只有内部存储设备啊,然后我就查到这么一遍文章,解决了问题。
Android 文件外/内部存储的获取各种存储目录路径
打印一下路径
位置
就说嘛,我这么高大上的手机都拿来测试了,被一个SD卡难住那可太没面子了。果断把我的卡路里改称music.mp3放到对应的目录下,又可以继续开心地敲代码了。
-
释放资源
刚开心了一小会儿,他又来了,带着一串红走来了。
报错
我又查了一下,发现是我写少了onDestroy()方法,之前的资源没有释放。
活动关闭要释放资源
-
解决:
后来我发现将文件名改了,错误还是一样的,查了好久,发现MediaPlayer有好多种状态,通过方法来控制,这个太细了,等真的用到的时候要好好研究。一直的错误是在状态1的时候开始,才发现文件根本没有准备好,我又尝试着把它放到内部存储设备的根目录下,居然就能够播放了。这种结果好似是推翻了我前面打印出来的文件路径的测试,我也不知道为什么。