简体   繁体   中英

Android mediaplayer using uri causes app crash

I have been working to resolve this problem for the last three days and cannot get it working. These are the steps of my app:

  1. Open file browser to select and audio file
  2. Audio file is selected
  3. Selected audio file is added to the database
  4. from a list of items the added file is selected
  5. a play button is pressed to play the sound file
  6. at this point the sound file will play, however if I close the app then open it again and attempt to play the same sound file the app crashes with the following error:

FATAL EXCEPTION: main

     Process: com.arcitech.developer.ultimatesoundboard, PID: 22967
     java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
         at com.arcitech.developer.ultimatesoundboard.activities.ItemDetailFragment$4.onClick(ItemDetailFragment.java:153)
         at android.view.View.performClick(View.java:5156)
         at android.view.View$PerformClick.run(View.java:20755)
         at android.os.Handler.handleCallback(Handler.java:739)
         at android.os.Handler.dispatchMessage(Handler.java:95)
         at android.os.Looper.loop(Looper.java:145)
         at android.app.ActivityThread.main(ActivityThread.java:5835)
         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:1399)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

the filepath(uri) I am saving to the database is: Content://com.android.providers.media.documents/document/audio%3A15790

and the code I am using is located in the onCreateView of a fragment:

MediaPlayer m; 
playSound.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {                 
        if (m != null) {
            m.stop();
            m.release();
            m = null;
        }
        m = MediaPlayer.create(getActivity(), Uri.parse(mItem.filePath));
        m.start();
        m.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer m) {
            countdownTimerHandler.removeCallbacks(countdownTimerRunnable);
        }
   });
  }
});

According to the doc for MediaPlayer.create() , it can return null if for some reason MediaPlayer cannot be created. You should be checking the return value for null every time unless you are very confident that it will not return null (but even then, do it for safety).

You may also want to check the log at the time create() is called to see if Android is leaving any clues as to why creation failed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM