带有 Uri 的 setDataSource 导致 NullPointerException

setDataSource with Uri causes NullPointerException

嗯,这是 onClick methodbutton:

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.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)

我想知道为什么会这样,我无法理解

**

编辑:

**

我把这个放在 onCreate method

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);
    }

但是没用

现在我尝试了一种不同的方式:不是将 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 没有任何问题(否则它应该是 "file error"),但是当我点击它时我仍然遇到由 NullPointerExceptionmediaPlayer 引起的崩溃。为什么这个?看不懂

答案在这里

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

例如

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

祝您编码愉快,玩得开心:)