androidandroid-runtime

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);

       }

    }


  }

Solution

  • 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