Android:Android中的运行时权限不会影响功能

时间:2016-05-13 10:49:29

标签: android runtime android-permissions

在下面的代码中,getInfoFromDevice没有被执行,我也尝试使用Log.d(),但它无法提供进一步的帮助。

在代码中,我使用运行时权限来检查用户是否已授予访问外部存储的权限,如果是,则调用函数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

代码将在MediaStore库的帮助下查找mp3文件,并检查它是否具有访问外部存储的权限,如果是,则会调用函数getInfoFromDevice()

2 个答案:

答案 0 :(得分: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();
        }
    }

答案 1 :(得分: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