首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.lang.StackOverflowError in onRequestPermissionsResult (Android)

java.lang.StackOverflowError in onRequestPermissionsResult (Android)
EN

Stack Overflow用户
提问于 2018-07-05 20:39:27
回答 2查看 696关注 0票数 2

在我的代码中,我请求:

代码语言:javascript
运行
复制
        int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE);
        int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
        int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS);

        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 0);
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, 2);

我还包括:

代码语言:javascript
运行
复制
@Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 0: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 0);

                }
                return;
            }
            case 1: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);

                }
                return;
            }
            case 2: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, 2);

                }
                return;
            }



            // other 'case' lines to check for other
            // permissions this app might request.
        }
    }

当我运行y应用程序时,首先得到请求,然后,在没有接触任何东西之后,我的应用程序崩溃时会出现以下错误:

致命异常:主进程: com.example.ortel.tagnet,PID: 28445 java.lang.StackOverflowError:堆栈大小8MB在android.app.Activity.requestPermissions(Activity.java:4455) at android.app.Activity.requestPermissions(Activity.java:4455) at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:507) at com.example.ortel.tagnet.MainActivityOld.onRequestPermissionsResult(MainActivityOld.java:894) at android.app.Activity.requestPermissions(Activity.java:4455)在android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:507) at com.example.ortel.tagnet.MainActivityOld.onRequestPermissionsResult(MainActivityOld.java:894) at android.app.Activity.requestPermissions(Activity.java:4455) at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:507) at com.example.ortel.tagnet.MainActivityOld.onRequestPermissionsResult(MainActivityOld.java:894)

供您参考,(MainActivityOld.java:894)是

String[]{android.Manifest.permission.READ_PHONE_STATE},ActivityCompat.requestPermissions(这是新的ActivityCompat.requestPermissions 0);

这是怎么回事?好像一直在呼唤我的请求。

它不应该等待我的回答吗?

编辑:如果您不知道为什么会发生这种情况,请地址。

EN

回答 2

Stack Overflow用户

发布于 2018-07-05 21:20:27

您可以尝试一次请求所有权限,并输入具有所需的所有3权限的Activity.requestPermissions。在代码中,您实际上是在提示系统使用3种不同的对话作为单独的实体来要求权限,也许在执行第二个权限请求时,它会覆盖第一个权限,并创建一个生成StackOverflowException的循环。

示例:

代码语言:javascript
运行
复制
List <String> str = new ArrayList <> ();
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
    str.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    str.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    str.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    str.add(Manifest.permission.READ_EXTERNAL_STORAGE);
}
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    str.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (str.size() > 0) {
    String[]strings = new String[str.size()];
    str.toArray(strings);
    ActivityCompat.requestPermissions(StartActivity.this,
        strings,
        PERMISSION_CODE_STATE);
}

然后,在接收结果的回调中,检查是否收到了类似于此的所有权限,或者手动检查每个grantResult :布尔值gotPermissions = true;

代码语言:javascript
运行
复制
for (int i : grantResults) {
    if (i != PackageManager.PERMISSION_GRANTED) {
        gotPermissions = false;
        break;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-04-08 18:20:59

this answer

您有一个无限循环,我猜是因为有人拒绝位置许可,并选择“永不问根”复选框。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51199544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档