I used external storage permission to app. So it reads SD card. On Emulator,the songs are getting displayed as it has its sd card storage but the songs are not displayed on my physical device may be because in my device has song in its internal storage and not on any sd card. So how to fetch song from internal storage. Which permission to use?
Main Activity
package com.example.vocals;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.location.GnssAntennaInfo;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
public class MainActivity extends AppCompatActivity {
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=findViewById(R.id.songs);
Dexter.withContext(this)
.withPermission(READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
displaySong();
}
@Override
public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
permissionToken.continuePermissionRequest();
}
}).check();
}
public ArrayList<File>findSong(File file){
ArrayList<File>arraylist=new ArrayList<>();
File[] files= file.listFiles();
if(files!=null){
for(File singleFile:files){
if(singleFile.isDirectory() && !singleFile.isHidden()){
arraylist.addAll(findSong(singleFile));
}
else{
if(singleFile.getName().toString().endsWith(".mp3") || singleFile.getName().toString().endsWith("wav" )&& !singleFile.getName().toString().startsWith(".") )
{
arraylist.add(singleFile);
}
}
}
}
else{
Log.d("info", "findSong: No files found to play");
}
return arraylist;
}
public void displaySong() {
ArrayList<File>mySongs=findSong(Environment.getExternalStorageDirectory());
ArrayList<String>items=new ArrayList<>();
for(int i=0;i<mySongs.size();i++){
items.add(mySongs.get(i).getName().replace(".mp3","").replace(".wav",""));
}
// CustomAdapter songAdapter=new CustomAdapter(this,items);
ArrayAdapter<String> songAdapter=new ArrayAdapter(this, android.R.layout.simple_list_item_1,items);
listView.setAdapter(songAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent=new Intent(MainActivity.this,PlaySong.class);
intent.putExtra("position",i);
intent.putExtra("songlist",mySongs);
intent.putExtra("songname",items.get(i));
startActivity(intent);
}
});
}
}
Second activity play song code
package com.example.vocals;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import java.io.File;
import java.util.ArrayList;
public class PlaySong extends AppCompatActivity {
@Override
protected void onDestroy() {
super.onDestroy();
mp.stop();
mp.release();
updateSeek.interrupt();
}
TextView txtsong;
ImageView next,previous,pause;
MediaPlayer mp=new MediaPlayer();
Thread updateSeek;
int current_position=0;
int position;
ArrayList<File> songs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_song);
txtsong=findViewById(R.id.txtsong);
next=findViewById(R.id.next);
previous=findViewById(R.id.previous);
pause=findViewById(R.id.pause);
SeekBar seekBar=findViewById(R.id.seekBar);
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
songs= (ArrayList) bundle.getParcelableArrayList("songlist");
String txtcontent= intent.getStringExtra("songname");
txtsong.setText(txtcontent);
txtsong.setSelected(true);
position=intent.getIntExtra("position",0);
Uri uri=Uri.parse(songs.get(position).toString());// to string works but get name does not question why this happened?
mp=MediaPlayer.create(this,uri);
mp.start();
seekBar.setMax(mp.getDuration());
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mp.seekTo(seekBar.getProgress());
}
});
updateSeek=new Thread(){
@Override
public void run() {
super.run();
try{
while(current_position<mp.getDuration()){
current_position=mp.getCurrentPosition();
seekBar.setProgress(current_position);
sleep(800);
}
}
catch(Exception e){
e.printStackTrace();
}
}
};
updateSeek.start();
previous.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mp.stop();
mp.release();
if(position!=0){
position=position-1;
}
else{
position=songs.size()-1;
}
txtsong.setText(songs.get(position).toString().replace(".mp3",""));
Uri uri=Uri.parse(songs.get(position).toString());
mp= MediaPlayer.create(getApplicationContext(),uri);
mp.start();
pause.setImageResource(R.drawable.pause);
}
});
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mp.isPlaying()){
mp.pause();
pause.setImageResource(R.drawable.play);
}
else{
mp.start();
pause.setImageResource(R.drawable.pause);
}
}
});
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mp.stop();
mp.release();
if(position!=songs.size()-1){
position=position+1;
}
else{
position=0;
}
txtsong.setText(songs.get(position).toString().replace(".mp3",""));
Uri uri=Uri.parse(songs.get(position).toString());
mp= MediaPlayer.create(getApplicationContext(),uri);
mp.start();
pause.setImageResource(R.drawable.pause);
}
});
}
}
Manifest file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.vocals">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:requestLegacyExternalStorage="true"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Vocals">
<activity android:name=".PlaySong"
android:label="Player"
android:parentActivityName=".MainActivity"></activity>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>