Sebin Paul Sebin Paul - 3 years ago 192
Android Question

Songs doesn't display instantly as soon as runtime permission is given

I'm a making a music app and I have created a function to load songs from the external storage. I have given the runtime permission for marshmallow but the problem is as soon as I grant the permission the songs are not displayed. But when i stop the app and reopen it, I can see the songs displayed. I want to display the songs as soon as I give the runtime permission (read from external storage). Thanks!

Songs.java fragment class:

public class Songs extends Fragment {

private static final String TAG = "Songs";
RecyclerView recyclerView;
private ArrayList<SongInfoModel> SongList = new ArrayList<SongInfoModel>();
SongAdapter songAdapter;

SongInfoModel s;

ScaleInAnimationAdapter alphaAdapter;





@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup
container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.songs_activity, container, false);


recyclerView = (RecyclerView)view.findViewById(R.id.recyclerView);


LinearLayoutManager linearLayoutManager = new
LinearLayoutManager(getContext());
recyclerView.setLayoutManager(linearLayoutManager);

songAdapter = new SongAdapter(getContext(), SongList);
alphaAdapter = new ScaleInAnimationAdapter(songAdapter);
alphaAdapter.setDuration(1000);
alphaAdapter.setInterpolator(new OvershootInterpolator());
alphaAdapter.setFirstOnly(false);
recyclerView.setAdapter(alphaAdapter);




Collections.sort(SongList, new Comparator<SongInfoModel>(){
public int compare(SongInfoModel a, SongInfoModel b){
return a.getSongName().compareTo(b.getSongName());
}
});



loadSongs();


return view;
}


public void loadSongs(){

ContentResolver resolver = getActivity().getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC+"!=0";
Cursor cursor = resolver.query(uri,null,selection,null,null);
if(cursor != null){
if(cursor.moveToFirst()){
do{
String name = cursor.getString(cursor.getColumnIndex
(MediaStore.Audio.Media.DISPLAY_NAME));
String artist = cursor.getString(cursor.getColumnIndex
(MediaStore.Audio.Media.ARTIST));
String url = cursor.getString(cursor.getColumnIndex
(MediaStore.Audio.Media.DATA));
long duration = cursor.getLong(cursor.getColumnIndex
(MediaStore.Audio.Media.DURATION));
s = new SongInfoModel(name,artist,null,null,url,duration,null);
SongList.add(s);

}while (cursor.moveToNext());
}

cursor.close();
songAdapter = new SongAdapter(getContext(),SongList);

}

private void checkUserPermission(){
if(Build.VERSION.SDK_INT>=23){
if(ActivityCompat.checkSelfPermission(getContext(),
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]
{Manifest.permission.READ_EXTERNAL_STORAGE},123);
return;
}
}
loadSongs();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[]
permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 123:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
loadSongs();
}else
Toast.makeText(getContext(), "Permission
Denied",Toast.LENGTH_SHORT).show();
checkUserPermission();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions,
grantResults);

}

}


}

Answer Source

Edited answer to the edited question

In the onCreateView method, before return statement, you've called loadSongs(); Instead of that, call checkUserPermission();

Old answer

You should also perform the post permission grant task inside the method onRequestPermissionsResult by overriding it in your activity.

You may use my helper library to get rid of it. https://github.com/nabinbhandari/Android-Permissions

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download