2016-08-22 6 views
0

Ну, это onClickmethod из button: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); 
} 

Проблема в том, ен я нажимаю на новую кнопку, чтобы сделать его звук, у меня есть 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) 

Я задаюсь вопросом, почему это происходит, я не могу понять,

**

EDIT:

**

Я поместил это в 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); 
    } 

Но он не работал

Теперь я пытался по-другому: Intead от прохождения Uri к MediaPlayer, я прошел 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(); 
     } 
    }); 

Кнопка появляется с текстом «select», поэтому нет никаких проблем с file (иначе это должно быть «ошибка файла»), но когда я нажимаю на него, у меня все еще есть сбой, вызванный NullPointerException с mediaPlayer. Почему это? Я не могу понять,

+1

и то, что возвращается на 'data.getData();'? –

+0

@ScaryWombat Возвращается 'uri'; для этого я сделал так: вместо 'setText ('start')' на новой 'Button', я помещаю' setText (audio.toString()) 'и' uri', который я получаю, является 'CONTENT : // COM.ANDROID.PROVIDERS.MEDIA.DOCUMENTS/DOCUMENT/AUDIO% 3A24283' (блокировка блокировки, потому что это кнопка) – DISSENNATORE

+0

@ScaryWombat Я добавил это в метод onCreate: 'if (ContextCompat.checkSelfPermission (getApplicationContext(), android.Manifest.permission.READ_EXTERNAL_STORAGE)! = PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions (это новая строка [] {android.Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE_REQUEST_CODE); } 'но все равно не работает ... – DISSENNATORE

ответ

0

ВОТ ОТВЕТ

Вместо того, чтобы делать setDataSource()method вы должны просто использовать в create()method :)

Ев.

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

Днем кодирования и получайте удовольствие :)