android - 空指针异常 "void android.media.MediaPlayer.setDataSource(android.content.Context, android.net.Uri)"

标签 android android-fragments android-intent nullpointerexception mediastore

我试图从 Fragment 中的用户音乐文件夹中获取音乐文件,但是当我这样做并在 onActivityResult 中接收到它(并记录它)后,我得到了一个当我想用媒体播放器播放它时出现空指针异常。 选择文件的代码:

    Button pickFile = (Button) v.findViewById(R.id.btnpick);
    pickFile.setOnClickListener(new OnClickListener() {

   @Override
        public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, 1);
        }
    });

OnActivityResult(不要忘记我在 fragment 中)

  public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data); 
  getActivity();
  if ((resultCode == getActivity().RESULT_OK) && (data != null)) {
  Log.d("result", "okreceived");
  Uri soundUri = Uri.parse(data.getData().toString());
  Log.i("result", "Intent data " + data.getData().toString());
  mplayergo(soundUri);
       }
  if (resultCode == getActivity().RESULT_CANCELED)
  {
  //null
  }
        }

       public void mplayergo(Uri soundUri){
           try {
               mplayer.setDataSource(getActivity(), soundUri);
               mplayer.start();
           } catch (IOException e) {
               e.printStackTrace();

           } catch (Exception e) {
               e.printStackTrace();
           }

        }

这是日志:

D/result: okreceived I/result: Intent data content://media/external/audio/media/34839 W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.setDataSource(android.content.Context, android.net.Uri)' on a null object reference at com.package.example.GameFragment.mplayergo(GameFragment.java:764) at com.package.example.GameFragment.onActivityResult(GameFragment.java:748) W/System.err: at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:156) W/System.err: at android.app.Activity.dispatchActivityResult(Activity.java:6290) W/System.err: at android.app.ActivityThread.deliverResults(ActivityThread.java:3606) W/System.err: at android.app.ActivityThread.handleSendResult(ActivityThread.java:3653) W/System.err: at android.app.ActivityThread.access$1400(ActivityThread.java:154) W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1371) W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102) W/System.err:
at android.os.Looper.loop(Looper.java:135) W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5300) W/System.err: at java.lang.reflect.Method.invoke(Native Method) W/System.err: at java.lang.reflect.Method.invoke(Method.java:372) W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

通过重新初始化 MediaPlayer 并将 URI 设置为源解决。

 public void mplayergo(Uri soundUri){
       try {
           mplayer.stop();
           mplayer.reset();
           mplayer.release();
           mplayer = MediaPlayer.create(getActivity(), soundUri);
          // mplayer.start();
       } catch (Exception e) {
           e.printStackTrace();
       }
    }

最佳答案

mplayer 未初始化。因此,当您尝试调用方法 setDataSource 时,它会出现空指针异常。在调用该方法之前尝试初始化 mplayer

关于android - 空指针异常 "void android.media.MediaPlayer.setDataSource(android.content.Context, android.net.Uri)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35980712/

相关文章:

android - 如何从 Firebase Task<AuthResult> 登录失败中检索错误代码?

java - Retrofit 2 请求没有给我数据

Android 应用程序邀请/免费代码

android - 在 Fragment 中使用 PullToRefreshExpandableListView

java - 如何使用新数据重新启动 Activity。 (在游戏中提升等级)

android-intent - 防止在关闭屏幕时重新创建 Android Activity

android - 多进程共享首选项在多进程环境中返回错误值

android - Google Maps API v2 自定义 MapFragment + SimpleFragment

android - 使用 fragment 重现 Honeycomb GMail UI

android - 使用 monkeyrunner : How can I call intents during the execution of an application?