AlertDialog意外显示

时间:2018-07-12 16:09:16

标签: android-alertdialog

在我的应用程序中,我有一个权限方法,该方法检查并询问是否构建代码> = 23的权限,我已经实现了AlertDialog来实现这一点并在需要时显示基本原理。问题是,当我在棒棒糖上进行测试时,每次启动应用程序时都会弹出一个带有应用程序名称的对话框窗口,我完全保护了所有涉及的方法,如果构建代码小于23,则该方法不执行任何操作,因此此对话框的方式和原因为何框还在显示吗?这是胭脂对话框的图像:

enter image description here

这是所有相关代码:

public void GMASInit() {
    linkGms = RunnerActivity.CurrentActivity;
    linkGms.startActivity(new Intent(linkGms, AudioSave.class));
}

protected void onStart() {//RunnerJNILib.ms_context
    super.onStart();

    if (Build.VERSION.SDK_INT >= 23) {
        getPerms();
    }
    //other unrelated code.....
}

public void getPerms() {
    if (Build.VERSION.SDK_INT >= 23) {
    try { // Determine weather developer included optional WRITE_SETTINGS permission in the manifest
        PackageInfo info = getPackageManager().getPackageInfo(linkGms.getPackageName(), PackageManager.GET_PERMISSIONS);
        if (info.requestedPermissions != null) {
            for (String p : info.requestedPermissions) {
                if (p.contains("WRITE_SETTINGS")) {
                    perms = 3;
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    final List<String> permissionsList = new ArrayList<String>();
    if(!addPermission(permissionsList, Manifest.permission.RECORD_AUDIO)) {permissionsNeeded.add("Record Audio");}
    if(!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {permissionsNeeded.add("Write storage");}
    Log.i("yoyo","Number of permissions in manifest: " + String.valueOf(perms));
    if (permissionsList.size() > 0) {
        if (permissionsNeeded.size() > 0) {
                if (perms == 2) {
                    message = message + " " + msg1 + " and " + msg2 + " " + "to save and load data and record audio.";
                    }
                if (perms == 3) {
                    message = message + " " + msg1 + ", " + msg2 + " and " + msg3 + " " + "to save and load data, record audio and change ringtone.";
                    }
                Log.i("yoyo","Message to be shown: " + message);
                showMessageOKCancel(message, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    if (Build.VERSION.SDK_INT >= 23) {
                    if (!Settings.System.canWrite(linkGms) && perms == 3) {
                        Intent writeset = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                        writeset.setData(Uri.parse("package:" + linkGms.getPackageName()));
                        linkGms.startActivity(writeset);
                    }
                    linkGms.requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), Get_Permission);
                finish();
                }
            }
        });
        return;
        }
    }
    finish();
}
}

private boolean addPermission(List<String> permissionsList, String permission) {
    if (Build.VERSION.SDK_INT >= 23) {
        if (linkGms.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);
            if (!linkGms.shouldShowRequestPermissionRationale(permission))
                return false;
        }
    }
    return true;
}

private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
    if (Build.VERSION.SDK_INT >= 23) {
        new AlertDialog.Builder(linkGms).setTitle(msg0).setMessage(message).setPositiveButton("OK", okListener).setNegativeButton("Cancel", null).create().show();
    }
}

如您所见,我在尝试防止此问题方面已经过头了,还请注意,仅显示此对话框(图中的一个),不显示权限对话框(这是预期的)。另外,可能有用/相关的更多信息是在测试android os 23及更高版本的对话框时,我显示了您在权限对话框上方显示的内容,并且必须单击其外部以将其关闭,以便可以访问实际的权限对话框。请告诉我我哪里出了问题以及如何解决它,谢谢。

1 个答案:

答案 0 :(得分:0)

我发现了,确实是一种奇怪的情况,它与权限或警报对话框生成器完全没有关系,如果事实上我是通过删除所有这些方法而发现的,并且警报对话框导入仍然存在,因此,问题与我的清单活动级别样式代码语句有关。我的清单中有此活动声明:

<activity android:name=".AudioSave" 
android:theme="@android:style/Theme.Holo.Dialog" >
</activity>

因此,这与我必须调用onStart方法的方式产生了冲突,但是我需要我的应用程序的主题,因此,解决该问题所需要做的就是添加finish();。在onStart方法末尾的最后一个大括号之前。问题解决了,像这样:

protected void onStart() {
    super.onStart();
//bla bla bla...
finish();
}