Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有多个对话框的Android权限UI问题_Java_Android_User Interface_Permissions - Fatal编程技术网

Java 具有多个对话框的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

我试图重构一段处理Android权限的代码。它工作得很好,只是有一个恼人的UI错误让我头疼。代码如下:

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;
}
@凌驾
请求许可证上的公共无效