Android:函数未在 Android 中以运行时权限执行

Android: Function is not excuting with runtime permissions in Android

在下面的代码中,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()

只需像下面这样更改您的代码:

@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();
        }
    }

首先检查权限如下,

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