Search code examples
javaandroidandroid-recyclerviewmedia-player

How to pass raw mp3 from recyclerview item to another activity


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!


Solution

  • 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();
            }
    
        });
    }
    }