使用try和catch请求Android运行时权限

时间:2016-11-14 03:40:09

标签: java android android-6.0-marshmallow android-permissions

我想知道如果我们获得SecurityException,使用Java的 try catch 语句来请求用户应用程序权限是否有意义?

粗略的例子是:

int hasReadExternalStoragePermission = ContextCompat.checkSelfPermission(MainActivity.this,
        Manifest.permission.READ_EXTERNAL_STORAGE);
if (hasReadExternalStoragePermission != PackageManager.PERMISSION_GRANTED) {
    if (!ActivityCompat.shouldShowRequestPermissionRationale(
            MainActivity.this,
            Manifest.permission.READ_EXTERNAL_STORAGE)) {
                // inform user
            }
    ActivityCompat.requestPermissions(MainActivity.this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            REQUEST_CODE_READ_EXTERNAL_STORAGE_OPEN_PROJECT);
    return;
}
myFunction();

try {
    myFunction();
} catch (SecurityException) {
       ActivityCompat.requestPermissions(
                 MainActivity.this,
                 new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},
                 REQUEST_CODE);
       return;
}

这两种方法的优缺点是什么?

2 个答案:

答案 0 :(得分:0)

关于未经检查的例外的一些想法:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

回顾SecurityException是运行时异常,我强调这一部分:

  

运行时异常表示编程问题导致的问题,(...)

所以我理解在抛出SecurityException之后请求权限意味着程序在调用操作之前没有检查应用程序是否具有某些特定权限的问题。我特别避免开发有问题的程序。

尽管如此,两个代码都是一样的。

答案 1 :(得分:0)

我一直想知道微小机会的窗口,可以在调用checkSelfPermissionmyFunction之间删除权限。这将是支持try ... catch选项的论点。但是,我所做的一些实验表明,虽然可以将权限添加到正在运行的应用程序中,但是如果删除了权限,则该应用程序将被终止。

我看到的所有小例子都显示在需要许可之前才调用checkSelfPermission,但是在某些情况下,最好尽早确保拥有许可,并且可以通过假设继续操作来简化后续代码获得许可。