java - 在用户做出选择之前调用 onRequestPermissionsResult?
问题描述
在我的应用程序中,我正在请求 onCreate() 函数的权限,如下所示
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_GRANTED)
registerListener(context);
else if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.ACTIVITY_RECOGNITION))
new AlertDialog.Builder(context)
.setTitle("Permission required")
.setMessage("This permission is required to fetch the sensor data from your phone, denying it will cause the app to exit")
.setPositiveButton("Give permission", (dialog, which) -> ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, ACTIVITY_REQUEST_CODE))
.setNegativeButton("Deny", (dialog, which) -> ((Activity) context).finish())
.show();
else
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, ACTIVITY_REQUEST_CODE);
这是 onRequestPermissionsResult 被覆盖的方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == presenter.ACTIVITY_REQUEST_CODE)
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
presenter.registerListener(this);
else {
Toast.makeText(this, "Permission denied, exiting", Toast.LENGTH_LONG).show();
finish();
}
}
现在我面临的问题是我得到了正确的弹出窗口来询问权限,但是Permission denied, exiting
在我做出选择之前我看到了 toast 消息 (),并且由于finish()
方法调用应用程序在我做出选择之前退出!
我不知道为什么会这样,任何帮助表示赞赏!
解决方案
实际上onRequestPermissionsResult
正如预期的那样被完美地调用。你必须在它的体内处理箱子。您的问题是在打开以做出任何选择Activity
之前完成。dialog
因此,只需尝试注释掉finish()
里面的方法onRequestPermissionsResult
。查看下面的代码以获得更好的清晰度。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == presenter.ACTIVITY_REQUEST_CODE)
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
presenter.registerListener(this);
else {
// if user denies permission then Dialog would be pop up. That's why I commented out both toast and finish() method below.
// If user clicks deny on the dialog then only finish activity.
//Toast.makeText(this, "Permission denied, exiting", Toast.LENGTH_LONG).show();
//finish();
}
}
在代码的以下部分处理用户拒绝案例:
.setNegativeButton("Deny", (dialog, which) -> {
// Put code here for user denial------
finish();
})
推荐阅读
- maxima - 定义一个在计算表达式时计算的变量,但不将其定义替换为表达式
- python - 解析类 csv 格式,同时忽略引号内的分隔符
- c - \a(警报和哔声)转义序列字符在 C 语言中不起作用
- javascript - 分组中的Ag网格显示
- java - Spring 安全主体不适用于 @PostConstruct
- javascript - 显示货币输入表单,无需先点击
- git - 如何重置一些提交和合并(通过从源拉取)以再次从远程拉取?
- git - Google 的基于主干的开发 - 您是否直接推送代码以发布分支而不是主干?
- java - java.lang.IllegalArgumentException:日志标记“okhttp3.mockwebserver.MockWebServer”超过 23 个字符的限制
- javascript - 为什么 window.btoa 不能处理 Javascript 中的“-”字符?