2016-05-13 78 views
0

在下面的代码中,getInfoFromDevice没有被执行,我也尝试了Log.d(),但它不能提供进一步的帮助。Android:函数没有在运行时权限在Android中运行

在代码中,我使用运行时权限来检查用户是否授予访问外部存储的权限,如果是,则调用函数getInfoFromDevice()。我不确定该功能的位置是否正确?但是这个函数没有执行。可能是什么原因 ?

它不会引发任何错误,

public class MainActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback { 

    ArrayList<String> listOfSongs = new ArrayList<String>(); 
    ListView liststructure; 
    final private int REQUEST_CODE_ASK_PERMISSIONS = 123; 
    String MUSIC_STRING = MediaStore.Audio.Media.IS_MUSIC + "!=0"; 
    String[] STAR = {"*"}; 
    String orderColumns = MediaStore.Audio.AudioColumns.TITLE + " COLLATE LOCALISED ASC"; 
    private final int REQUEST_GRANTED_BY_USER = 1; 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     checkPermissions(); 
     liststructure = (ListView) findViewById(R.id.listView); 


     SongsList list = new SongsList(MainActivity.this, listOfSongs); 
     liststructure.setAdapter(list); 

    } 

    private void checkPermissions() { 
     int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, 
       Manifest.permission.READ_EXTERNAL_STORAGE); 


     if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 



      ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_GRANTED_BY_USER); 


     } 

    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 


     if(requestCode == REQUEST_GRANTED_BY_USER) 
     { 

     getInfoFromDevice(); 


     } else { 
        // Permission Denied 
        Toast.makeText(MainActivity.this, "EXTERNAL_STORAGE Denied", Toast.LENGTH_SHORT) 
          .show(); 
       } 





    } 

    void getInfoFromDevice() { 
     Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     Cursor cursor = getContentResolver().query(uri, STAR, MUSIC_STRING, null, null); 

     if (cursor != null) 

     { 
      if (cursor.moveToFirst()) { 
       do { 
        String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); 
        String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
        String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); 
        String albumID = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); 
        listOfSongs.add(album + " " + name + " " + albumID); 

       } while (cursor.moveToNext()); 

      } 
     } 

    } 


} 

请让我知道如果你需要更多的细节。

编辑1

代码会寻找MP3文件MediaStore库的帮助,并会检查是否有访问外部存储器的权限,如果是,它会调用该函数getInfoFromDevice()

回答

2

只要改变你的代码如下图所示:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     liststructure = (ListView) findViewById(R.id.listView); 
     SongsList list = new SongsList(MainActivity.this, listOfSongs); 
     liststructure.setAdapter(list); 

     checkPermissions(); 
    } 

    private void checkPermissions() { 
     if (Build.VERSION.SDK_INT >= 23) { 
     int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, 
       Manifest.permission.READ_EXTERNAL_STORAGE); 
      if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_GRANTED_BY_USER); 
      }else{ 
       getInfoFromDevice(); 
      } 
     }else{ 
      getInfoFromDevice(); 
     } 
    } 
+0

真棒这个工作就像一个魅力。 –

+0

为什么我们最后检查权限?在显示权限对话框之前使用 –

+0

。允许活动完成工作(在屏幕上加载视图)。那就是为什么而已。 –

0

首先检查如下许可,

public void checkPermission(String permission) { 
    if (ContextCompat.checkSelfPermission(BaseActivity.this, 
      permission) 
      != PackageManager.PERMISSION_GRANTED) { 

     if (ActivityCompat.shouldShowRequestPermissionRationale(BaseActivity.this, 
       Manifest.permission.READ_EXTERNAL_STORAGE)) { 

      ActivityCompat.requestPermissions(BaseActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
        10); 

     } else { 
      ActivityCompat.requestPermissions(BaseActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
        10); 

     } 
    } 
} 

然后,

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case 10: { 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED)      
      { 
       // permission granted call your function 
       getInfoFromDevice(); 

      } else { 
       // permission denied. 
      } 
      return; 
     } 
    } 
} 

您还可以使用下面的插件可以轻松地增加运行时间权限,而更多的努力, https://android-arsenal.com/details/1/3571