的setDataSource与乌里导致NullPointerException异常

问题描述:

好了,这是onClickmethodbutton的setDataSource与乌里导致NullPointerException异常

public void aggiungi (View v){ 

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("audio/*"); 
    startActivityForResult(Intent.createChooser(intent, "Select"), PICK_AUDIO_REQUEST_CODE); 

} 

而且外面我已经处理的输出:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == PICK_AUDIO_REQUEST_CODE){ 
     if (resultCode == RESULT_OK){ 
      Uri uri_to_use = data.getData(); 
      setAudioToButton(uri_to_use); 
     } 
    } 

} 

而这里的setAudioToButton method称为

public void setAudioToButton(final Uri audio){ 
    PercentRelativeLayout percentRelativeLayout = (PercentRelativeLayout)findViewById(R.id.main_layout); 
    PercentRelativeLayout.LayoutParams layoutParams = new PercentRelativeLayout.LayoutParams(43, 12); 
    layoutParams.addRule(PercentRelativeLayout.ALIGN_PARENT_RIGHT); 
    layoutParams.addRule(PercentRelativeLayout.BELOW, R.id.quattro); 
    Button button = new Button(this); 
    button.setLayoutParams(layoutParams); 
    PercentRelativeLayout.LayoutParams layoutParams1 = (PercentRelativeLayout.LayoutParams)button.getLayoutParams(); 
    PercentLayoutHelper.PercentLayoutInfo percentLayoutInfo = layoutParams1.getPercentLayoutInfo(); 
    percentLayoutInfo.heightPercent = 0.12f; 
    percentLayoutInfo.widthPercent = 0.43f; 
    percentLayoutInfo.topMarginPercent = 0.063f; 
    percentLayoutInfo.leftMarginPercent = 0.007f; 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (mediaPlayer != null){mediaPlayer.stop();} 
      try {mediaPlayer.setDataSource(getBaseContext(), audio);} catch (IOException error){error.printStackTrace();} 
      try { 
       mediaPlayer.prepare(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      mediaPlayer.start(); 
     } 
    }); 
    button.setText("start"); 
    percentRelativeLayout.addView(button); 
} 

问题是wh恩我对新的按钮点击,使其听起来,我有一个NullPointerException

08-22 02:32:43.164 11880-11880/com.example.utente.usefulsounds E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.utente.usefulsounds, PID: 11880 
                      Theme: themes:{} 
                      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.example.utente.usefulsounds.MainActivity$1.onClick(MainActivity.java:182) 
                       at android.view.View.performClick(View.java:5204) 
                       at android.view.View$PerformClick.run(View.java:21158) 
                       at android.os.Handler.handleCallback(Handler.java:739) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5461) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

我想知道为什么会这样,我不明白

**

编辑:

**

我已经把这个在onCreatemethod

if (ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ 
     ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE_REQUEST_CODE); 
    } 

但它并没有奏效

现在,我已经尝试以不同的方式:这一翻译传递一个UriMediaPlayer,我已经通过了filedescriptor

button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (mediaPlayer != null){mediaPlayer.stop();} 
      File file = new File(audio.getPath()); 
      FileInputStream fileInputStream; 
      try { 
       fileInputStream = new FileInputStream(file); 
       try {mediaPlayer.setDataSource(fileInputStream.getFD());} catch (IOException error){error.printStackTrace();} 
      }catch (IOException ioe){button.setText("FILE ERROR");} 

      try { 
       mediaPlayer.prepare(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      mediaPlayer.start(); 
     } 
    }); 

按钮出现与文本“选择”,所以没有任何问题与file(否则它应该是“文件错误”),但是当我点击,我仍然有NullPointerExceptionmediaPlayer导致崩溃。为什么这个?我无法理解

+1

,并正在由'data.getData()返回什么;'? –

+0

@ScaryWombat它返回一个'uri';看到它我已经这样做了:在新的'Button'上代替'setText('start')',我把'setText(audio.toString())'和'uri'我得到的是'CONTENT :// COM.ANDRO.PROVIDERS.MEDIA.DOCUMENTS/DOCUMENT/AUDIO%3A24283'(caps locked,因为它在一个按钮中) – DISSENNATORE

+0

@ScaryWombat我在onCreate方法中添加了这个:'if(ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ActivityBit.requestPermissions(this,new String [] {android.Manifest.permission.READ_EXTERNAL_STORAGE},READ_EXTERNAL_STORAGE_REQUEST_CODE); '但是仍然不起作用... – DISSENNATORE

这里的答案

而不是做一个setDataSource()method你必须简单地使用create()method :)

EG。

MediaPlayer.create(getApplicationContext(), yourAudioUri).start(); 

编码快乐,玩得开心:)