Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 尝试获取原始文件夹中声音的标识符时,尝试调用虚拟方法资源_Android_Nullpointerexception - Fatal编程技术网

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