Android 尝试获取原始文件夹中声音的标识符时,尝试调用虚拟方法资源
我试图播放声音(它们在原始文件夹中)当单击按钮时,我已经设置好了大部分内容Android 尝试获取原始文件夹中声音的标识符时,尝试调用虚拟方法资源,android,nullpointerexception,Android,Nullpointerexception,我试图播放声音(它们在原始文件夹中)当单击按钮时,我已经设置好了大部分内容 checkarchivo = nomarchivo; Log.d("resultado","start player"); Log.d("archivo ",nomarchivo); soundId = getResources().getIdentifier(nomarchivo, "raw", getPackageName()); Log.d("id:"
checkarchivo = nomarchivo;
Log.d("resultado","start player");
Log.d("archivo ",nomarchivo);
soundId = getResources().getIdentifier(nomarchivo, "raw", getPackageName());
Log.d("id:",""+soundId);
/*String mediaPath = "android.resource://" + getPackageName() + "/" +soundId;
Log.d("ruta",mediaPath);
prueba.setAudioStreamType(AudioManager.STREAM_MUSIC);
prueba.setDataSource(mediaPath);
prueba.prepare();
prueba.start();*/
我已经注释了最后几行,直到我修复了这个问题(起初它没有抛出错误),变量nomarchivo
来自一个参数,并且不是空的,因为日志正在抛出变量的内容
确切的错误是:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
错误抛出到getResources()行,我不知道为什么它不起作用,当然,如果我无法获取该文件的id,我无法为mediaplayer创建路径,因此无法播放声音
我试图初始化一个变量res=getResources()代码>在oncreate中,然后使用它,但没有成功,错误与以前相同
主要活动类别:
package com.werta600.frasesmuzska;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity implements AsyncResponse
{
ListView listView;
ArrayList<String> stringArray = new ArrayList<String>();
ArrayList<String> sArray = new ArrayList<String>();
Boolean isplaying = false;
static MediaPlayer prueba = new MediaPlayer();
String checkarchivo = "";
int soundId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testraw();
prueba.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
completionPlayer();
}
});
}
public void testraw(){
Field[] fields=R.raw.class.getFields();
int c = 1;
for(int count=2; count < fields.length; count++){
sArray.add(fields[count].getName());
c++;
}
MySimpleArrayAdapter sonidoadapter = new MySimpleArrayAdapter(this, sArray);
listView = (ListView) findViewById(R.id.listaprincipal);
listView.setAdapter(sonidoadapter);
}
public void reproducir(View view,String nombrearchivo){
try {
if (prueba.isPlaying()){
stopPlayer(nombrearchivo);
}else{
startPlayer(nombrearchivo);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void stopPlayer(String nomarchivo){
Log.d("resultado","stop player");
prueba.stop();
prueba.reset();
if (!checkarchivo.equals(nomarchivo)){
startPlayer(nomarchivo);
}
}
public void startPlayer(String nomarchivo){
try{
checkarchivo = nomarchivo;
Log.d("resultado","start player");
Log.d("archivo ",nomarchivo);
soundId = getResources().getIdentifier(nomarchivo, "raw", getPackageName());
Log.d("id:",""+soundId);
/*String mediaPath = "android.resource://" + getPackageName() + "/" +soundId;
Log.d("ruta",mediaPath);
prueba.setAudioStreamType(AudioManager.STREAM_MUSIC);
prueba.setDataSource(mediaPath);
prueba.prepare();
prueba.start();*/
}catch (Exception e){
e.printStackTrace();
}
}
public void completionPlayer(){
Log.d("resultado","completed player");
prueba.stop();
prueba.reset();
}
}
package com.werta600.frasesmuzska;
导入android.media.AudioManager;
导入android.media.MediaPlayer;
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入android.util.Log;
导入android.view.view;
导入android.widget.ListView;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.io.IOException;
导入java.lang.reflect.Field;
导入java.util.ArrayList;
导入java.util.HashMap;
公共类MainActivity扩展AppCompatActivity实现异步响应
{
列表视图列表视图;
ArrayList stringArray=新的ArrayList();
ArrayList sArray=新的ArrayList();
布尔isplay=false;
静态MediaPlayer prueba=新MediaPlayer();
字符串checkarchivo=“”;
内部声音ID;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testraw();
prueba.setOnCompletionListener(新的MediaPlayer.OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
completionPlayer();
}
});
}
公共void testraw(){
Field[]fields=R.raw.class.getFields();
int c=1;
for(int count=2;count
适配器:
package com.werta600.frasesmuzska;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public class MySimpleArrayAdapter extends ArrayAdapter<String> {
//to reference the Activity
private final Activity context;
//array completo
private final ArrayList<String > arraysonido;
public MySimpleArrayAdapter(Activity context, ArrayList<String> arraysonidoParam) {
super(context,R.layout.lista , arraysonidoParam);
this.context = context;
this.arraysonido = arraysonidoParam;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.lista, parent, false);
TextView nameTextField = (TextView) rowView.findViewById(R.id.nombresonido);
Button btnreproducir = (Button)rowView.findViewById(R.id.reproducirbtn);
final String sonidoactual = arraysonido.get(position);
final String mayus = sonidoactual.substring(0, 1).toUpperCase() + sonidoactual.substring(1);
final String nombremostrar = mayus.replace("_"," ");
Log.d("Sonido:",sonidoactual);
final MainActivity mActivity= new MainActivity();
nameTextField.setText(nombremostrar);
btnreproducir.setText("Reproducir");
btnreproducir.setTag(sonidoactual);
btnreproducir.setOnClickListener( new View.OnClickListener() {
String archivo = sonidoactual;
@Override
public void onClick(View v) {
mActivity.reproducir(v,archivo);
}
});
return rowView;
}
}
package com.werta600.frasesmuzska;
导入android.app.Activity;
导入android.content.Context;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.TextView;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.util.ArrayList;
公共类MySimpleArrayAdapter扩展了ArrayAdapter{
//参考活动
私人最终活动背景;
//数组复数
私人最终ArrayList arraysonido;
public MySimpleArrayAdapter(活动上下文,ArrayList arraysonidoParam){
super(context,R.layout.lista,arraysonidoParam);
this.context=上下文;
this.arraysonido=arraysonidoParam;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
视图行视图=充气机。充气(R.layout.lista,父项,false);
TextView name textfield=(TextView)rowView.findViewById(R.id.nombresonido);
按钮btnreproducir=(按钮)rowView.findViewById(R.id.reproducir);
最终字符串sonidActual=arraysonido.get(位置);
最后一个字符串mayus=sonidActual.substring(0,1).toUpperCase()+sonidActual.substring(1);
最后一个字符串nombremostrar=mayus.replace(““,”);
Log.d(“Sonido:”,sonidoactual);
最终MainActivity MacActivity=新的MainActivity();
nameTextField.setText(nombremostrar);
btnReproducer.setText(“复制”);
btnreproducir.setTag(SondoActual);
btnreproducir.setOnClickListener(新视图.OnClickListener(){
字符串archivo=声波实际值;
@凌驾
公共void onClick(视图v){
再生能力(v,archivo);
}
});
返回行视图;
}
}
请尝试以下操作:-
yourplayer.setDataSource(this, Uri.parse("android.resource://com.urPackageName/" + R.raw.your_sound));
问题是,您在适配器中实例化了一个新的MainActivity
。你不能那样做。您应该使用构造函数中给出的上下文
//to reference the Activity
private final MainActivity context;
[...]
public MySimpleArrayAdapter(Activity context, ArrayList<String> arraysonidoParam) {
super(context,R.layout.lista , arraysonidoParam);
this.context = (MainActivity)context; // cast the context you get to MainActivity, so you can call reproducir later
this.arraysonido = arraysonidoParam;
}
[...]
btnreproducir.setOnClickListener( new View.OnClickListener() {
String archivo = sonidoactual;
@Override
public void onClick(View v) {
context.reproducir(v,archivo);
}
});
//引用该活动
私人活动语境;
[...]
public MySimpleArrayAdapter(活动上下文,ArrayList arraysonidoParam){
super(context,R.layout.lista,arraysonidoParam);
this.context=(MainActivity)context;//将获得的上下文强制转换为Mai