How to fetch internal storage songs to the music player app?

Viewed 28

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>
1 Answers

in below code helps you to get the song from internal storage.

 private void loadAudioFromLocal() {
    ContentResolver contentResolver = getContentResolver();
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
    String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
    Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder);
    if (cursor != null && cursor.getCount() > 0) {
        audioList = new ArrayList<>();
        while (cursor.moveToNext()) {
            String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
            String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
            String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
            String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));

            // Save to audioList
            audioList.add(new Audio(data, title, album, artist));
        }
    }
    Objects.requireNonNull(cursor).close();
    MusicPlayerAdapter adapter = new MusicPlayerAdapter(this, audioList, this);
    rvMusicPlayer.setAdapter(adapter);
}
Related