2016-08-22 134 views
0

好了,這是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

回答

0

這裏的答案

而不是做一個setDataSource()method你必須簡單地使用create()method :)

EG。

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

編碼快樂,玩得開心:)

相關問題