Can't read External Storage files, even after giving permission

Viewed 24

I am trying to make a music player in Android Studio. I have made a function to fetch songs from storage:

public ArrayList<File> fetchSongs(File file){
        file.setReadable(true , false);
        File [] songs = file.listFiles();
        ArrayList<File> ar = new ArrayList<>();

        if( songs != null) {
            for (File f : songs) {
                if (f.getName().endsWith(".mp3")) {
                    ar.add(f);
                } else {
                    if (f.isDirectory()) {
                    ar.addAll(fetchSongs(f));
                }
                }
            }
        }
        Log.d("fileCheck", "file exists: " + file.exists() +", file cen be read: " + file.canRead());
    return ar; }

file.exists() returns true but file.canRead() returns false

I have given permission in Manifest file too:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

I have also requested the permission too using Dexter library. My code in onCreate() :

Dexter.withContext(this)
                .withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                .withListener(new PermissionListener() {
                    @Override
                    public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {

                        ArrayList<File> mySong = fetchSongs(Environment.getExternalStorageDirectory());
                        String [] items = new String[mySong.size()];
                        ArrayList<String> songs = new ArrayList<>();
                        for(int i =0; i<mySong.size(); i++){
                            items[i] = mySong.get(i).getName();
                        }

                        songsList = findViewById(R.id.listView);
                      songsList.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1 , items) {
                            @NonNull
                            @Override
                            public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                                TextView textView= (TextView) super.getView(position, convertView, parent);
                                int white = getContext().getResources().getColor(R.color.white);
                                textView.setTextColor(white);
                                return textView;
                            }
                       });
                    }

                    @Override
                    public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {

                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
                        permissionToken.continuePermissionRequest();
                    }
                })
                .check();
0 Answers
Related