Java 具有多个对话框的Android权限UI问题
我试图重构一段处理Android权限的代码。它工作得很好,只是有一个恼人的UI错误让我头疼。代码如下:Java 具有多个对话框的Android权限UI问题,java,android,user-interface,permissions,Java,Android,User Interface,Permissions,我试图重构一段处理Android权限的代码。它工作得很好,只是有一个恼人的UI错误让我头疼。代码如下: private void getPermissions() { if (Build.VERSION.SDK_INT >= 23) { List<String> permissionsNeeded = new ArrayList<String>(); final List<String> permission
private void getPermissions() {
if (Build.VERSION.SDK_INT >= 23) {
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
if (!addPermission(permissionsList, android.Manifest.permission.ACCESS_COARSE_LOCATION))
permissionsNeeded.add(accessLocation);
if (!addPermission(permissionsList, Manifest.permission.CAMERA))
permissionsNeeded.add(accessCamera);
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
}
}
}
private void showMessageOK (int message, final String perm) {
if (shouldShowRequestPermissionRationale(perm)) {
new AlertDialog.Builder(CreateSessionActivity.this)
.setMessage(message)
.setTitle("Permission required")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
requestPermissions(new String[] {perm},
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
})
.create()
.show();
}
}
private boolean addPermission(List<String> permissionsList, String permission) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
//check for rationale
if (!shouldShowRequestPermissionRationale(permission))
return false;
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Map<String, Integer> perms = new HashMap<>();
perms.put(android.Manifest.permission.ACCESS_COARSE_LOCATION, PackageManager.PERMISSION_GRANTED);
perms.put(android.Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
// Fill with results
for (int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
if (perms.get(accessLocation) != PackageManager.PERMISSION_GRANTED) {
showMessageOK(R.string.permdesc_access_location,
accessLocation);
}
if (perms.get(accessCamera) != PackageManager.PERMISSION_GRANTED) {
showMessageOK(R.string.permdesc_access_camera,
accessCamera);
}
}
private void getPermissions(){
如果(Build.VERSION.SDK_INT>=23){
List permissions need=new ArrayList();
最终列表权限列表=新的ArrayList();
if(!addPermission(permissionsList,android.Manifest.permission.ACCESS\u位置))
所需权限。添加(访问位置);
if(!addPermission(permissionsList,Manifest.permission.CAMERA))
所需的权限。添加(accessCamera);
如果(permissionsList.size()>0){
如果(PermissionsNeed.size()>0){
requestPermissions(permissionsList.toArray(新字符串[permissionsList.size()),
请求\代码\请求\多个权限);
}
}
}
}
私有void showMessageOK(整型消息,最终字符串perm){
如果(应显示请求许可理由(perm)){
新建AlertDialog.Builder(CreateSessionActivity.this)
.setMessage(消息)
.setTitle(“需要许可”)
.setPositiveButton(“确定”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
dialog.dismise();
requestPermissions(新字符串[]{perm},
请求\代码\请求\多个权限);
}
})
.create()
.show();
}
}
私有布尔添加权限(列表权限列表、字符串权限){
if(checkSelfPermission(permission)!=PackageManager.permission\u已授予){
权限列表。添加(权限);
//检查理由
如果(!shouldshowRequestPermissionRegulation(许可))
返回false;
}
返回true;
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
Map perms=new HashMap();
perms.put(android.Manifest.permission.ACCESS_位置,PackageManager.permission_授予);
perms.put(android.Manifest.permission.CAMERA,PackageManager.permission_-grated);
//满载而归
for(int i=0;i
它基本上获取用户尚未授予的权限列表,循环浏览这些权限,并提示用户授予每个权限。完成后,它会检查是否有剩余的未授予的权限,并再次提示用户为什么需要该权限以及不允许该权限的结果,直到用户接受或选择“不再请求”
我的问题出现在onRequestPermissionResult()中链接的“if”语句中。正如您可能猜到的,如果多个权限条件为真,则每个对话框都会在当前现有对话框下打开。这会在一个对话框关闭和下一个显示之间产生“跳跃”对话框效果。我尝试了case和if/elseif语句来解决这个问题,但它会导致我的其他许可逻辑出现问题
有没有人对此有一个干净的解决方案?我将不胜感激 这可能不是最干净的代码,但是
if (Build.VERSION.SDK_INT >= 23) {
List<String> permissionsNeeded = new ArrayList<String>();
for(int i=0; i<4;i++){
checkAndAsk(i);
}
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
}
}
//out of the get permissions method
public void checkAndAsk(int i){
switch(i){
case 0:
if (!addPermission(permissionsList, android.Manifest.permission.ACCESS_COARSE_LOCATION))
permissionsNeeded.add(accessLocation);
break;
case 1:
if (!addPermission(permissionsList, android.Manifest.permission.READ_CONTACTS))
permissionsNeeded.add(readContacts);
break;
//You get the idea
}
}
if(Build.VERSION.SDK\u INT>=23){
List permissions need=new ArrayList();
对于(int i=0;i 0){
如果(PermissionsNeed.size()>0){
requestPermissions(permissionsList.toArray(新字符串[permissionsList.size()),
请求\代码\请求\多个权限);
}
}
}
//退出获取权限方法
公共无效检查任务(int i){
开关(一){
案例0:
if(!addPermission(permissionsList,android.Manifest.permission.ACCESS\u位置))
所需权限。添加(访问位置);
打破
案例1:
if(!addPermission(permissionsList,android.Manifest.permission.READ_CONTACTS))
所需权限。添加(读取联系人);
打破
//你明白了吗
}
}
基本上,通过传递您将请求的权限的参数来迭代权限。一旦授予/拒绝了某个权限,它就会中断,进入第二个权限,直到完成所有操作
理论上,这应该是可行的。只需使用以下代码:
private void RequestAllPermissions() {
String[] PERMISSIONS = {Manifest.permission.CAMERA, Manifest.permission.RECEIVE_SMS, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET, Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.WRITE_CONTACTS};
if (!hasPermissions(this, PERMISSIONS)) {
ActivityCompat.requestPermissions(this, PERMISSIONS, REQUESTCODE_PERMISSION_ALL);
} else
}
public static boolean hasPermissions(Context context, String... permissions) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUESTCODE_PERMISSION_ALL: {
boolean allpermissiongranted = true;
if (grantResults.length > 0) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
allpermissiongranted = false;
break;
}
}
} else
allpermissiongranted = false;
if (allpermissiongranted) {
//do task
} else {
new SweetAlertDialog(mContext, SweetAlertDialog.WARNING_TYPE)
.setTitleText("Permission Not Granted")
.setContentText("Kindly grant all requested permission to proceed.")
.setConfirmText("Request")
.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
@Override
public void onClick(SweetAlertDialog sDialog) {
sDialog.dismissWithAnimation();
RequestAllPermissions();
}
})
.setCancelText("Exit")
.setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {
@Override
public void onClick(SweetAlertDialog sweetAlertDialog) {
sweetAlertDialog.dismissWithAnimation();
finish();
}
})
.show();
}
}
}
}
private void RequestAllPermissions(){
String[]PERMISSIONS={Manifest.permission.CAMERA,Manifest.permission.RECEIVE_SMS,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.INTERNET,Manifest.permission.CALL_PHONE,Manifest.permission.WRITE_外部_存储,Manifest.permission.WRITE_CONTACTS};
如果(!hasPermissions(此,PERMISSIONS)){
ActivityCompat.requestPermissions(此、权限、REQUESTCODE\u权限\u全部);
}否则
}
公共静态权限(上下文、字符串…权限){
if(android.os.Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.M&&context!=null&&permissions!=null){
用于(字符串权限:权限){
if(ActivityCompat.checkSelfPermission(context,permission)!=PackageManager.permission\u已授予){
返回false;
}
}
}
返回true;
}
@凌驾
请求许可证上的公共无效