的setDataSource与乌里导致NullPointerException异常
问题描述:
好了,这是onClick
method
的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);
}
问题是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)
我想知道为什么会这样,我不明白
**
编辑:
**
我已经把这个在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();
}
});
按钮出现与文本“选择”,所以没有任何问题与file
(否则它应该是“文件错误”),但是当我点击,我仍然有NullPointerException
与mediaPlayer
导致崩溃。为什么这个?我无法理解
答
这里的答案
而不是做一个setDataSource()
method
你必须简单地使用create()
method
:)
EG。
MediaPlayer.create(getApplicationContext(), yourAudioUri).start();
编码快乐,玩得开心:)
,并正在由'data.getData()返回什么;'? –
@ScaryWombat它返回一个'uri';看到它我已经这样做了:在新的'Button'上代替'setText('start')',我把'setText(audio.toString())'和'uri'我得到的是'CONTENT :// COM.ANDRO.PROVIDERS.MEDIA.DOCUMENTS/DOCUMENT/AUDIO%3A24283'(caps locked,因为它在一个按钮中) – DISSENNATORE
@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