I'm trying to play sounds (they are in the raw folder) when clicking a button, I have most of the things set up.
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();*/
I have commented the last lines until I fixed the issue (at first it didn't throw an error), variable nomarchivo
comes from a parameter and is not null since the log is working throwing the contents of the variable.
The exact error is this one:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
The error throws to the getResources() line, and I have no clue why it doesn't work, of course, if I can't get the id of that file, I can't make a path for the mediaplayer so I can't play the sound.
I tried to initialize a variable res = getResources();
inside the oncreate, and then using it, but with no success, same error as before
Mainactivity class:
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();
}
}
Adapter:
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;
}
}