请求权限:如何等待授权?

4
Android API 23及以上版本要求在运行时确认“危险”权限。根据其他StackOverflow建议,我使用checkSelfPermissions()检查所需的权限,并在需要时调用requestPermissions()。这个方法可以正常工作,但是请求是异步处理的,也就是说,requestPermissions()会立即返回。问题是,在requestPermissions()之后,我的应用程序继续执行。有时候,权限确认对话框会在稍后出现,但此时我的应用程序已经尝试了API调用,导致失败。
我认为在继续进行应用程序之前需要等待所有权限被授予。我想我可以实现一些轮询代码来解决这个问题,但这对我来说太粗糙了。那么,有什么“最佳实践”可以解决这个问题吗?文档中的各种最佳实践描述并没有解决这个问题。

@Afshin OP只是想等待结果。 - TheWanderer
@TheWanderer 哎呀,我以为他是想要绕过权限检查。我删除了我的评论。 - Afshin
1个回答

10

将您的逻辑放在自己的函数中,放在onCreate()之外。

private void doStuff() {
    //whatever
}

如果权限已经被授予,只需要直接从onCreate()中调用该函数:
@Override
public void onCreate(Bundle savedInstanceState) {
    //...
    if (checkSelfPermissions(/*whatever*/) {
        doStuff();
    } else {
        requestPermissions(/*whatever*/);
    }

    //nothing dependent on runtime permissions after this point
}

然后重写onRequestPermissionsResult()方法:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == /*whatever you set in requestPermissions()*/) {
        if (!Arrays.asList(grantResults).contains(PackageManager.PERMISSION_DENIED)) {
            //all permissions have been granted
            doStuff(); //call your dependent logic
        }
    }
}

有趣。我猜你是建议我将整个应用程序处理包装在onRequestPermissionsResult中。我会尝试一下。 - DontPanic
不,我建议(实际上是明确说明)你将它移动到一个新的函数中,然后在需要的地方调用它。 - TheWanderer
是的,我实际上就是按照你建议的做了 - 我想我只是总结得不够好。 - DontPanic
当您的“doStuff()”函数需要参数时,您该如何操作?是否有办法将参数传递给“onRequestPermissionsResult”? - Filip
2
@Filip,在获取任何数据或设置状态之前最好先请求权限。如果这不行,你就得使用成员变量来存储数据并在方法中使用它。 - TheWanderer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接