在Android Marshmallow中请求多个权限时遇到了问题

4

我正在开发一个应用程序,需要在运行时请求多个权限。我的代码可以成功请求一个权限,但是当我想要请求多个权限时,代码没有作出任何反应。请问有谁知道我的代码哪里出了问题吗?

package saleskit.orbitsys.com.androidpermissiondemo;

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_INTERNET = 200;
    private static final int REQUEST_CODE_INTERNET = 110;
    private static final int PERMISSION_REQUEST_CODE_GPS = 111;
    public static final int PERMISSION_REQUEST_CODE_CONTACT = 112;
    public static final int PERMISSION_REQUEST_CODE_CAMARA = 113;
    public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 201;
    private WebView htmlWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar
                = getSupportActionBar();
        if (null != actionBar) {
            actionBar.hide();
        }
checkMultiplePermission();

       /* if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.RECORD_AUDIO}, REQUEST_INTERNET);
        }*/


        htmlWebView = (WebView) findViewById(R.id.webView);
        assert htmlWebView != null;
        WebSettings webSetting = htmlWebView.getSettings();
        webSetting.setJavaScriptEnabled(true);
        webSetting.setDisplayZoomControls(true);
        htmlWebView.setWebViewClient(new CustomWebViewClient());
        htmlWebView.loadUrl("https://inducesmile.com/blog");

    }

    public boolean checkMultiplePermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

                int permissionFineLocation = ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.ACCESS_FINE_LOCATION);
                int permissionCorseLocation = ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.ACCESS_COARSE_LOCATION);
                int permissioncamera = ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.CAMERA);
                int permissioncall = ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.CALL_PHONE);
                int permissionSDCARD = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
                int permissionSDCARD2 = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE);
                int readSms = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS);
                List<String> listPermissionsNeeded = new ArrayList<>();
                if (permissioncall != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.CALL_PHONE);
                }
                if (permissionCorseLocation != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.ACCESS_COARSE_LOCATION);
                }
                if (permissionFineLocation != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
                }
                if (permissioncamera != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.CAMERA);
                }
                if (permissionSDCARD != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
                if (permissionSDCARD2 != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
                }
                if (readSms != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.READ_SMS);
                }

                if (!listPermissionsNeeded.isEmpty()) {
                    ActivityCompat.requestPermissions(MainActivity.this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
                    return false;
                }

                return true;
            } else {
                return true;
            }
        }





    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] listPermissionsNeeded, @NonNull int[] grantResults) {
        if(listPermissionsNeeded.length == 0){
            return;
        }
        boolean allPermissionsGranted = true;
        if(grantResults.length>0){
            for(int grantResult: grantResults){
                if(grantResult != PackageManager.PERMISSION_GRANTED){
                    allPermissionsGranted = false;
                    break;
                }
            }
        }
        if(!allPermissionsGranted){
            boolean somePermissionsForeverDenied = false;
            for(String permission: listPermissionsNeeded){
                if(ActivityCompat.shouldShowRequestPermissionRationale(this, permission)){
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{ permission}, requestCode);
                    //denied
                    Log.e("denied", permission);
                }else{
                    if(ActivityCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED){
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{ permission}, requestCode);

                        //allowed
                        Log.e("allowed", permission);
                    } else{


                        somePermissionsForeverDenied = true;
                    }
                }
            }
            if(somePermissionsForeverDenied){
                 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
                alertDialogBuilder.setTitle("Permissions Required")
                        .setMessage("You have forcefully denied some of the required permissions " +
                                "for this action. Please open settings, go to permissions and allow them.")
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                                        Uri.fromParts("package", getPackageName(), null));
                                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                startActivity(intent);
                            }
                        })


                        .show();
            }
        } else {
            switch (requestCode) {
                //act according to the request code used while requesting the permission(s).
            }
        }
    }
    private class CustomWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }
}

我很感激任何形式的帮助,谢谢。


https://developer.android.com/training/permissions/requesting.html - Suhayl SH
为了消除我的疑惑,请尝试使用String arr[]=listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]);并将arr传递给ActivityCompat.requestPermissions,而不是在现场将列表转换为数组,并在activityresult中放置一个日志或Toast以确认是否被调用。 - Pavneet_Singh
同样的问题。对于这个Android已经感到疲倦了..我已经为小错误闲置了几天。每次问问题似乎都有些不好意思。抱歉,伙计,你解决了你的问题吗? - user834850
是的,我解决了这个问题。@Vitali Petrov - Abhishek Bhardwaj
7个回答

1

首先检查权限是否已经被授予。

在这里,您可以检查多个权限。

if (checkForPermission(getActivity(), CAMERA_PERMISSION) && checkForPermission(getActivity(), GALLERY_PERMISSION)) {
      //Permission granted here
      //TODO

    } else {
        requestPermissions(new String[]{CAMERA_PERMISSION, GALLERY_PERMISSION}, 1);
}

检查权限的方法。

/***
 * Method is checking permission for Marshmallow
 *
 * @param context
 * @param permission
 * @return
 */
private static boolean checkForPermission(final Context context, String permission) {
    int result = ContextCompat.checkSelfPermission(context, permission);
    //If permission is granted then it returns 0 as result
    if (result == PackageManager.PERMISSION_GRANTED) {
        return true;
    } else {
        return false;
    }
}

onRequestPermissionsResult方法类似于onActivityResult。

/***
 * This is call when user allow or deny permissions in the Marshmallow
 *
 * @param requestCode
 * @param permissions
 * @param grantResults
 */
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
               //Permission granted here
               //TODO

            }
            break;
    }
}

1
在您的活动中:activity:

private static final int MY_PERMISSIONS = 111;

onCreate方法中:
String[] mPermissionToRequest = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CAMERA,Manifest.permission.CALL_PHONE};

ActivityCompat.requestPermissions(this, mPermissionsToRequest, MY_PERMISSIONS);

@Override

public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

}

检查您的 AndroidManifest.xml 文件:

<uses-permission android:name="android.permission.CALL_PHONE" />

<uses-permission android:name="android.permission.CAMERA" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

0
我的代码在请求一个权限时可以正常工作。但是当我想要请求多个权限时,我的代码就没有反应了。
撇开你的代码过于冗长,使得阅读变得更加困难这一点不谈,checkMultiplePermission()方法是可以正常工作的。我已经将它复制到了一个测试项目中,当我启动应用程序时,我被要求授予5个权限。
(5个权限是因为WRITE_EXTERNAL_STORAGE/READ_EXTERNAL_STORAGEACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION被合并成一个单独的权限请求)
请仔细检查您的AndroidManifest.xml文件是否更新了新的权限。可能之前当您只使用一个权限测试代码时,您接受了它,然后在请求逻辑中添加了更多的权限,但忘记在AndroidManifest.xml中列出。在这种情况下,Android将忽略您的请求,也不会抛出异常,它只会什么都不做。

0

on create上执行以下操作...

 int PERMISSION_ALL = 1;
    String[] PERMISSIONS = {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE};
    if(!hasPermissions(this, PERMISSIONS)){
        //ask user for granting permissions on api22+
        ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
    }

检查是否已授权...

public static boolean hasPermissions(Context context, String... permissions) {
    //checaking if the application has permission
    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;
}

这是用于相机和读取存储的,你可以添加任何你想要的...


0

针对多个权限:

public abstract class AbsRuntimePermission extends Activity {

private SparseIntArray mErrorString;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mErrorString = new SparseIntArray();

}

public abstract void onPermissionsGranted(int requestCode);

public void requestAppPermissions(final String[]requestedPermissions, final int stringId, final int requestCode) {
    mErrorString.put(requestCode, stringId);

    int permissionCheck = PackageManager.PERMISSION_GRANTED;
    boolean showRequestPermissions = false;
    for(String permission: requestedPermissions) {
        permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission);
        showRequestPermissions = showRequestPermissions || ActivityCompat.shouldShowRequestPermissionRationale(this, permission);
    }

    if (permissionCheck!=PackageManager.PERMISSION_GRANTED) {
        if(showRequestPermissions) {
            Snackbar.make(findViewById(android.R.id.content), stringId, Snackbar.LENGTH_INDEFINITE).setAction("GRANT", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ActivityCompat.requestPermissions(AbsRuntimePermission.this, requestedPermissions, requestCode);
                }
            }).show();
        } else {
            ActivityCompat.requestPermissions(this, requestedPermissions, requestCode);
        }
    } else {
        onPermissionsGranted(requestCode);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    int permissionCheck = PackageManager.PERMISSION_GRANTED;
    for(int permisson : grantResults) {
        permissionCheck = permissionCheck + permisson;
    }

    if( (grantResults.length > 0) && PackageManager.PERMISSION_GRANTED == permissionCheck) {
        onPermissionsGranted(requestCode);
    } else {
        //Display message when contain some Dangerous permisson not accept

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(new ContextThemeWrapper(this, android.R.style.Theme_Holo_Light_Dialog));
        alertDialogBuilder
                .setMessage("Please enble permisions")
                .setTitle("Please enble permisions")
                .setCancelable(false)
                .setPositiveButton(" Enable",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Intent i = new Intent();
                                i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                i.setData(Uri.parse("package:" + getPackageName()));
                                i.addCategory(Intent.CATEGORY_DEFAULT);
                                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                                i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                                startActivity(i);

                            }
                        });



                        alertDialogBuilder.setNegativeButton(" Cancel ", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });

        AlertDialog alert = alertDialogBuilder.create();
        alert.show();

    }

            }

    }

在你的主活动中:

public class MainActivity extends AbsRuntimePermission {

private static final int REQUEST_PERMISSION = 10;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    requestAppPermissions(new String[]{
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_CONTACTS},
            R.string.msg,REQUEST_PERMISSION);
}

@Override
public void onPermissionsGranted(int requestCode) {
    //Do anything when permisson granted
    Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_LONG).show();
}
}

谢谢您的回复,但这是我的自定义代码,请问您能否告诉我代码有什么问题吗? - Abhishek Bhardwaj

0

试试这个:

final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;

public boolean checkMultiplePermission() {
    List<String> permissionsNeeded = new ArrayList<String>();

    final List<String> permissionsList = new ArrayList<String>();
    if (!addPermission(permissionsList, Manifest.permission.ACCESS_FINE_LOCATION))
        permissionsNeeded.add("GPS");
    if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS))
        permissionsNeeded.add("Read Contacts");
    if (!addPermission(permissionsList, Manifest.permission.WRITE_CONTACTS))
        permissionsNeeded.add("Write Contacts");

    if (permissionsList.size() > 0) {
        if (permissionsNeeded.size() > 0) {
            // Need Rationale
            String message = "You need to grant access to " + permissionsNeeded.get(0);
            for (int i = 1; i < permissionsNeeded.size(); i++)
                message = message + ", " + permissionsNeeded.get(i);
            showMessageOKCancel(message,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                                    REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
                        }
                    });
            return;
        }
        requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
        return;
    }

    insertDummyContact();
}

private boolean addPermission(List<String> permissionsList, String permission) {
    if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
        permissionsList.add(permission);
        // Check for Rationale Option
        if (!shouldShowRequestPermissionRationale(permission))
            return false;
    }
    return true;
}


 private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
    new AlertDialog.Builder(MainActivity.this)
            .setMessage(message)
            .setPositiveButton("OK", okListener)
            .setNegativeButton("Cancel", null)
            .create()
            .show();
}

当每个权限都有了授权结果后,结果将被发送到同一个回调方法onRequestPermissionsResult()
 @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS:
            {
            Map<String, Integer> perms = new HashMap<String, Integer>();
            // Initial
            perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
            perms.put(Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED);
            perms.put(Manifest.permission.WRITE_CONTACTS, PackageManager.PERMISSION_GRANTED);
            // Fill with results
            for (int i = 0; i < permissions.length; i++)
                perms.put(permissions[i], grantResults[i]);
            // Check for ACCESS_FINE_LOCATION
            if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                    && perms.get(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED
                    && perms.get(Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
                // All Permissions Granted
                //do your task..
            } else {
                // Permission Denied
                Toast.makeText(MainActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT)
                        .show();
            }
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

希望这能对你有所帮助。

0

你可以通过这种方式实现

    private static final int MY_PERMISSIONS_REQUEST_CALL = 7;
    private static String[] PERMISSIONS = {
        Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};

现在创建一个方法

 public void checkSmsPermission() {
    try {
        if (Build.VERSION.SDK_INT >= 23) {
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED
                    || ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED ||
                    ActivityCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE)
                            != PackageManager.PERMISSION_GRANTED

                    ) {
                requestPermission();
            } else
                checkLogin();
        } else {
            checkLogin();


        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}



you can check grants result array for checking which permission is granted



  @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    try {
        boolean flagDenied = false;
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_CALL:


                if (grantResults.length > 0
                        ) {
                    for (int i : grantResults)
                        if (i == -1) {
                            flagDenied = true;
                            break;
                        }
                    if (!flagDenied)
                        doJob();
                    else showPermissionDialog();
                }


                break;


        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我只希望在用户检查权限之前,他无法访问我的应用程序。并且想将用户引导到应用程序权限设置中。 - Abhishek Bhardwaj
如果标志“denied”为真,则显示弹出窗口或再次请求权限。下次仅请求被拒绝的权限。 - Rahul Chaudhary
无法工作,请您检查一下我的代码,单个权限的所有事情都正常工作,但是多个权限却不行。 - Abhishek Bhardwaj
你是否正在获取多个权限的弹出窗口? - Rahul Chaudhary
你接受了几个权限并在requestPermissionResult中调用。在那里,你将得到一个grantResults数组,其中包含0表示被拒绝的权限和1表示接受的权限。如果数组的所有元素都不是1,则显示一个弹出窗口,提示您必须接受所有权限并退出或调用相同的方法以检查权限。 - Rahul Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接