CheckSelfPermission方法没有按预期工作,它总是在android 6.0(Marshmallow)中返回零.因为目标sdk是22,我正在使用http Client进行网络连接.以下是代码段.

private void insertDummyContactWrapper() {

List permissionsNeeded = new ArrayList();

final List permissionsList = new ArrayList();

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();

}

@TargetApi(Build.VERSION_CODES.M)

private boolean addPermission(List 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();

}

@Override

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

switch (requestCode) {

case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {

Map perms = new HashMap();

// 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

insertDummyContact();

} else {

// Permission Denied

Toast.makeText(MainActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT)

.show();

}

}

break;

default:

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

}

}"

最佳答案

Context#checkSelfPermission(String)方法已添加到API 23.同样在API 23之下,由于始终授予权限,因此它毫无意义.在处理权限之前检查API版本

private void insertDummyContactWrapper() {

// the only way we insert the dummy contact if if we are below M.

// Else we continue on and prompt the user for permissions

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {

insertDummyContact();

return;

}

List permissionsNeeded = new ArrayList();

final List permissionsList = new ArrayList();

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);

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐