Nullpointer 异常“无效 android.media.MediaPlayer.setDataSource(android.content.Context,android.net.Uri)”

Posted

技术标签:

【中文标题】Nullpointer 异常“无效 android.media.MediaPlayer.setDataSource(android.content.Context,android.net.Uri)”【英文标题】:Nullpointer Exception "void android.media.MediaPlayer.setDataSource(android.content.Context, android.net.Uri)" 【发布时间】:2016-06-29 02:07:19 【问题描述】:

我正在尝试从 Fragment 中的用户的音乐文件夹中获取音乐文件,但是当我这样做并在 onActivityResult 中接收到它(并记录它)后,我得到一个当我想用媒体播放器播放它时出现 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 数据 内容://媒体/外部/音频/媒体/34839 W/System.err: java.lang.NullPointerException:尝试调用虚拟方法'void android.media.MediaPlayer.setDataSource(android.content.Context, android.net.Uri)' 在空对象引用上 com.package.example.GameFragment.mplayergo(GameFragment.java:764) 在 com.package.example.GameFragment.onActivityResult(GameFragment.java:748) W / System.err:在 android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:156) W / System.err:在 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:在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1371) W / System.err:在 android.os.Handler.dispatchMessage(Handler.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:在 java.lang.reflect.Method.invoke(Native Method) W/System.err:在 java.lang.reflect.Method.invoke(Method.java:372) W / System.err:在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) W / System.err:在 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();
       
    

【问题讨论】:

你初始化你的 MediaPlayer 类了吗? 是的,它已经被初始化并且它在除了这里之外的片段中运行良好,或者也许我必须再次初始化它,因为我正在修改流? 然后检查 getActivity() 我认为它是空的。 哦,是的,我必须重新初始化它,解决了:) 【参考方案1】:

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

【讨论】:

是的,我必须重新初始化它,现在它可以工作了,谢谢 :)

以上是关于Nullpointer 异常“无效 android.media.MediaPlayer.setDataSource(android.content.Context,android.net.Uri)”的主要内容,如果未能解决你的问题,请参考以下文章

获取 XMPPConnection 的 Nullpointer 异常

setAdapter() 上的 NullPointer 异常

UnitTesting Android TabActivity时获取Nullpointer异常

尝试访问 ListView 的子项时出现 Nullpointer 异常

YouTube API Auth 类中的 Nullpointer 异常 - 使用 Java 上传视频

android上的nullpointer异常[重复]