【问题标题】:Granting external storage permissions without restarting the app在不重新启动应用程序的情况下授予外部存储权限
【发布时间】:2017-02-21 17:56:03
【问题描述】:

对于具有 API 23 或更高版本的 Android 设备,我如何在不重新启动应用程序的情况下授予外部存储权限(有点像在单个会话中将用户的音乐库上传到 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 的实例化等)接受初始弹出窗口的权限后。

非常感谢。

【问题讨论】:

  • “我需要重新启动应用程序才能通过权限”——不,你不需要。移动“示例代码在此处”。进入另一种方法。如果您碰巧此时已经拥有权限,请从onCreate() 调用该方法。如果用户同意这些权限,也可以从onRequestPermissionsResult() 调用该方法。例如,请参阅this sample project

标签: android permissions android-permissions android-external-storage


【解决方案1】:

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

当用户接受/拒绝您的权限请求时,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.
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 2017-08-07
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多