首页 文章

Nullpointer Exception“void android.media.MediaPlayer.setDataSource(android.content.Context,android.net.Uri)”

提问于
浏览
2

我正在尝试从 Fragment 中的用户的音乐文件夹中获取音乐文件,但是当我这样做并在onActivityResult中接收它(并记录它)后,当我想用mediaplayer播放它时,我得到一个Nullpointer异常 . 选择文件的代码:

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(不要忘记我在片段中)

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:尝试调用虚方法'void android.media.MediaPlayer.setDataSource (android.content.Context,android.net.Uri)'对com.package.example.GameFragment.onActivityResult(GameFragment.java)中com.package.example.GameFragment.mplayergo(GameFragment.java:764)的空对象引用:748)W / System.err:在android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:156)W / System.err:at android.app.Activity.dispatchActivityResult(Activity.java:6290)W /System.err:在android.app.ActivityThread.deliverResults(ActivityThread.java:3606)W / System.err:在android.app.ActivityThread.handleSendResult(ActivityThread.java:3653)W / System.err:在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 (H andler.java:102)W / System.err:在android.os.Looper.loop(Looper.java:135)W / System.err:在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();
       }
    }

1 回答

  • 6

    “mplayer”未初始化 . 因此,当您尝试调用方法“setDataSource”时,它会获得空指针异常 . 尝试在调用该方法之前初始化“mplayer” .

相关问题