在不重启应用程序的情况下授予外部存储权限

Granting external storage permissions without restarting the app

对于 Android 具有 API 23 或更高版本的设备,我如何在不重新启动应用程序的情况下授予外部存储权限(有点像用户的音乐库被上传到 Google Play单个会话中的音乐)?我知道这个问题已在 SO 中多次解决,但到目前为止我还没有找到任何运气。

这是我的清单文件中的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

主要活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23
        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);

            return; // Included here to prevent the app from crashing.
        }
    }

    /**
     * CODE HERE FOR INSTANTIATIONS AND SUCH.
     */
}

... 因为截至目前,我需要重新启动应用程序才能获得权限(以及 MainActivity 的实例化等) 接受来自初始弹出窗口。

非常感谢。

正如@CommonsWare 建议的那样,您可以将执行 INSTANTIATIONS AND SUCH 的所有代码放入 instantiateMyObjects() 之类的方法中,然后在 onCreate() 中调用它喜欢

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23
        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_CODE);
            // Define the constant MY_PERMISSION_CODE.

            return; // Included here to prevent the app from crashing.
        }
    }

    instantiateMyObjects();
}

并且当用户 accepts/denies 您的许可请求 onRequestPermissionsResult() 被调用。不要忘记定义 MY_PERMISSION_CODE 例如 1

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

    if (requestCode == MY_PERMISSION_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Now you can instantiate your objects.
            instantiateMyObjects();
        } else {
            // User denied it.
        }
    }
}