用户改变
应用需要两个权限:用户改变
- 读取手机状态
- 相机
应用有如下界面:
画面A:启动(它根据许可状态处理屏幕导航)
B屏:权限屏幕(如果用户没有授予电话许可)
屏幕C:条款&条件屏幕
当它启动时,应用程序会检查是否电话权限授予与否。如果批准,程序会开屏C,否则它会留在同一个屏幕B.
步骤:
- 打开应用程序 - >开机 - >权限屏幕
- 点击 '授予权限' - >权限对话框 - >拒绝权限
- 点击“打开设置”
- 格兰特相机的许可(不是手机许可)
- 轻按“返回”设备的按钮,返回到应用程序。
- 权限屏幕将显示为否'phone'授予的权限。
- 再次重复步骤#2和#3
- 现在删除'摄像头'权限并授予'手机'权限(因为我们改变了相机权限,应用程序进程将被终止并重新开始)。
- 重复步骤#5,将会显示Splash和Screen C(条款&条件)。
- 上“后退”按钮再次点击,相同画面C将显示(画面C在背面叠层两个实例)
我可以使用“CLEAR_TASK”和“CLEAR_TOP”标志和startActivity目的是了解用户更改时发生的应用程序的变化以及设置的权限。
观察:
当用户同意,我们的应用过程中不会有任何效果。
当用户删除授予权限时,Android应用程序将终止并重新启动应用程序。 (如果发生这种情况,那么为什么两个C屏幕实例?)
我有点困惑在这里!
/**** If user changes, permission from settings it will again ask for permission to
granted.You should always check if user changes permission from settings
using below code ***/
if(checkSelfPermission(Manifest.permission.your_permission_name) == PackageManager.PERMISSION_GRANTED)
@AndiGeeky下面是一些完整的代码,告知用户是否允许或选择拒绝与它要管理选择不再询问其他两个方案的用户或没有用户更改设置它允许不允许后
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
//.... write file into storage ...
System.out.println("SDK > BuildVersion TRUE");
} else {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 666); // Comment 26
System.out.println("go to requestPermissions");
}
}
onLoad();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 666: // Allowed was selected so Permission granted
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Snackbar s = Snackbar.make(findViewById(android.R.id.content),"Permission Granted",Snackbar.LENGTH_LONG);
View snackbarView = s.getView();
TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.RED);
textView.setTextSize(18);
textView.setMaxLines(6);
s.show();
// do your work here
} else if (Build.VERSION.SDK_INT >= 23 && !shouldShowRequestPermissionRationale(permissions[0])) {
// User selected the Never Ask Again Option Change settings in app settings manually
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Change Permissions in Settings");
alertDialogBuilder
.setMessage("" +
"\nClick SETTINGS to Manually Set\n"+"Permissions to use Database Storage")
.setCancelable(false)
.setPositiveButton("SETTINGS", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 1000); // Comment 3.
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
} else {
// User selected Deny Dialog to EXIT App ==> OR <== RETRY to have a second chance to Allow Permissions
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Second Chance");
alertDialogBuilder
.setMessage("Click RETRY to Set Permissions to Allow\n\n"+"Click EXIT to the Close App")
.setCancelable(false)
.setPositiveButton("RETRY", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, Integer.parseInt(WRITE_EXTERNAL_STORAGE));
Intent i = new Intent(MainActivity.this,MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
})
.setNegativeButton("EXIT", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
}
break;
}};
我明白了。问题是当用户删除授予的权限时会发生什么? Android会杀死该应用程序,并重新开始或后台堆栈会一样? – AndiGeeky
@AndiGeeky @AndiGeeky我已经使用这段代码,它处理用户编辑权限的问题,并且拒绝它的权限这是处理所有可能发生的所有可能性的最聪明和设计良好的代码之一用户可以做出的选择 –
我明白了。问题是当用户删除授予的权限时会发生什么? Android会杀死该应用程序,并重新开始或后台堆栈会一样? – AndiGeeky
Android会保持轨道,并将再次要求准许接受,即使您的应用程序在后台或终止 – yash786