In my Android app I have a recyclerview which contains a list of items. In recyclerview activity each item has one textview and another activity has two textview and one audio play button. But audio not playing. How can I set setOnClickListener and play audio mp3 usung MediaPlayer. Here is my code-
NameModel.java
public class NameModel {
private String name,meaning;
private int audio;
public NameModel(String name, String meaning, int audio) {
this.name= name;
this.meaning= meaning;
this.audio= audio;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name= name;
}
public String getMeaning() {
return meaning;
}
public void setMeaning(String meaning) {
this.meaning= meaning;
}
public int getAudio() {
return audio;
}
public void setAudio(int audio) {
this.audio = audio;
}
}
NameAdapter.java
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position=getAdapterPosition();
NameModel nameModel=nameItemList.get(position);
Intent intent=new Intent(context, NameDetailsActivity.class);
intent.putExtra("NAME",nameModel.getName());
intent.putExtra("MEANING",nameModel.getMeaning());
intent.putExtra("AUDIO", nameModel.getAudio());
context.startActivity(intent);
}
});
MainActivity.java
public class MainActivity extends AppCompatActivity {
private LinearLayoutManager linearLayoutManager;
private List<NameModel> nameModelList;
private NameAdapter nameAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerViewId);
nameModelList = new ArrayList<>();
nameAdapter = new NameAdapter(this,nameModelList);
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setAdapter(nameAdapter);
recyclerView.setLayoutManager(linearLayoutManager);
RecyclerView.ItemDecoration itemDecoration=new DividerItemDecoration(getApplicationContext(),DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(itemDecoration);
nameModelList.add(new NameModel("Mahmud", "The praised one", R.raw.mahmud));
nameModelList.add(new NameModel("Maaz", "Brave Man", R.raw.maaz));
}
}
NameDetailsActivity.java
public class NameDetailsActivity extends AppCompatActivity {
Context context;
NameModel nameModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details_name);
String name = getIntent().getStringExtra("NAME");
String meaning = getIntent().getStringExtra("MEANING");
int audio = getIntent().getIntExtra("AUDIO",0);
TextView nameText = (TextView) findViewById(R.id.tvName);
TextView meaningText = (TextView) findViewById(R.id.tvMeaning);
Button playbutton = (Button) findViewById(R.id.playBtn);
nameText.setText(name);
meaningText.setText(meaning);
playbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MediaPlayer mediaPlayer = MediaPlayer.create(context,audio);
mediaPlayer.start();
}
});
}
}
any help would be appreciated. Thanks!
First of all you're doing getIntent().getStringExtra("AUDIO");
which is not right in this case.
You set int value in your intent.putExtra("AUDIO", nameModel.getAudio());
so you have to get int value back using int audio = getIntent().getIntExtra("AUDIO");
. Hope it will help you.
Also I've noticed 1 thing. In your NameDetailsActivity where do you initialize your context and your NameModel class? Actually I don't know why you need NameModel
class in NameDetailsActivity
, but anyway... If you will pass that context to mediaplayer without initialization, you will get nullPointerException. And you get exception like Caused by java.lang.NullPointerException Attempt to invoke virtual method 'int com.tahmid.name.models.NameModel.getAudioFile()'
. That's because your NameModel
class in NameDetailsActivity
is null.
You have to do 2 things.
If you need NameModel
class in NameDetailsActivity
, you have to create an empty constructor in NameModel
class. You can find it in my answer below. And you have to initialize context and nameModel in NameDetailsActivity
.
So try this code.
First of all in your NameModel
create an empty constructor.
public class NameModel {
private String name,meaning;
private int audio;
public NameModel() {}
public NameModel(String name, String meaning, int audio) {
this.name= name;
this.meaning= meaning;
this.audio= audio;
}
// The same code...
And your NameDetailsActivity
you can do this.
public class NameDetailsActivity extends AppCompatActivity {
Context context;
NameModel nameModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details_name);
context = getContext();
nameModel = new NameModel();
String name = getIntent().getStringExtra("NAME");
String meaning = getIntent().getStringExtra("MEANING");
int audio = getIntent().getIntExtra("AUDIO",0);
TextView nameText = (TextView) findViewById(R.id.tvName);
TextView meaningText = (TextView) findViewById(R.id.tvMeaning);
Button playbutton = (Button) findViewById(R.id.playBtn);
nameText.setText(name);
meaningText.setText(meaning);
playbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MediaPlayer mediaPlayer = MediaPlayer.create(context,audio);
mediaPlayer.start();
}
});
}
}