在我的应用程序中,我有一个权限方法,该方法检查并询问是否构建代码> = 23的权限,我已经实现了AlertDialog来实现这一点并在需要时显示基本原理。问题是,当我在棒棒糖上进行测试时,每次启动应用程序时都会弹出一个带有应用程序名称的对话框窗口,我完全保护了所有涉及的方法,如果构建代码小于23,则该方法不执行任何操作,因此此对话框的方式和原因为何框还在显示吗?这是胭脂对话框的图像:
这是所有相关代码:
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及更高版本的对话框时,我显示了您在权限对话框上方显示的内容,并且必须单击其外部以将其关闭,以便可以访问实际的权限对话框。请告诉我我哪里出了问题以及如何解决它,谢谢。
答案 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();
}