一旦给出运行时许可,歌曲就不会立即显示

时间:2017-10-01 04:21:07

标签: android android-runtime

我正在制作音乐应用,我创建了一个从外部存储加载歌曲的功能。我已经给了marshmallow的运行时权限,但问题是我一旦授予权限就不会显示歌曲。但当我停止应用程序并重新打开它时,我可以看到显示的歌曲。我想在给予运行时权限时显示歌曲(从外部存储器读取)。谢谢!

Songs.java片段类:

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

       }

    }


  }

2 个答案:

答案 0 :(得分:0)

编辑过的问题的编辑回复

onCreateView方法中,在返回语句之前,您已拨打loadSongs();而不是那样,请致电checkUserPermission();

旧答案

您还应该在方法onRequestPermissionsResult中执行帖子权限授予任务,方法是在您的活动中覆盖它。

您可以使用我的帮助程序库来摆脱它。 https://github.com/nabinbhandari/Android-Permissions

答案 1 :(得分:0)

您必须覆盖此方法才能对允许或拒绝的权限执行操作。

@Override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
switch (requestCode) {
    case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            // permission was granted, yay! Do the
            // contacts-related task you need to do.

        } else {

            // permission denied, boo! Disable the
            // functionality that depends on this permission.
        }
        return;
    }

    // other 'case' lines to check for other
    // permissions this app might request
}
}