android6.0的全新的权限管理机制
简介
不知不觉android已经出了android7.0的预览版了。但是android6.0的普及程度不高,比例没有超过2%.
但是Android6.0权限管理比较之前的版本有了很大的改进。android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次。一旦安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西。但是大部分的第三方的系统,很早之前就可以在安装的时候进行权限的管理了。终于在在android6.0棉花糖,app将不会在安装的时候授予权限。取而代之的是,app不得不在运行时一个一个询问用户授予权限。
即使用户在安装的时候,赋予了应用程序全部的使用权限 ,但是用户依旧可以在设置里面 取消相关的权限设置。
版本问题
在应用程序设置targetSdkVersion为23是需要适配Android6.0最新的权限管理机制。如果不对于权限管理做任何的操作如果用户禁止了相关权限,就会出现程序停止运行的状况。
配置targetSdkVersion:
程序异常日志:
代码实现
1.检查相关权限是否被允许。
/**
*适用于最小SDK 23(android m)
* @param permission 对应的权限.格式:Manifest.permission.ACCOUNT_MANAGER
* @return true:权限已经分配 false: 需要弹出对话框来设置权限:
* codeing : requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
*/
public static List<String> isThatPermissionGranted(Context context,String... permission)
{
List<String> list = new ArrayList<>();
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
{
return list;
}
for(String str : permission)
{
if (GlobalApplication.getInstance().checkSelfPermission(str)
!= PackageManager.PERMISSION_GRANTED)
{
list.add(str);
}
}
return list;
}
2.
/**
*是否應該顯示對話框
* @param permissions
*/
public static List<String> shouldShowDialog(Activity context,String... permissions)
{
List<String> list = new ArrayList<>();
if(permissions.length < 0 || Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
{
return list;
}
else
{
for (String str : permissions)
{
if(!context.shouldShowRequestPermissionRationale(str))
{
list.add(str);
}
}
}
return list;
}
3.
List<String> list =
PermissionManager.PermissionV4.isThatPermissionGranted(this,
Manifest.permission.RECEIVE_SMS,Manifest.permission.READ_SMS);
LogUtils.i(TAG, "list size " + list.size());
if(list != null && list.size() > 0)
{
final List<String> list1 =
PermissionManager.PermissionV4.shouldShowDialog(this,
Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS);
if(list1 != null && list1.size() > 0)
{
showMessageOKCancel("You need to allow access to Contacts",
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
ActivityCompat.requestPermissions(BossLoginActivity.this,
list1.toArray(new String[list1.size()]),
REQUEST_CODE_SOME_FEATURES_PERMISSIONS);
}
});
return;
}
ActivityCompat.requestPermissions(BossLoginActivity.this, list.toArray(new String[list.size()]),
REQUEST_CODE_SOME_FEATURES_PERMISSIONS);
}
else
{
LogUtils.i(TAG," register broad cast ");
SmsBroadcast smsBroadcast = new SmsBroadcast();
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(smsBroadcast, filter);
}
4.
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
switch (requestCode)
{
case REQUEST_CODE_SOME_FEATURES_PERMISSIONS:
for(int i=0;i<permissions.length;i++)
{
if(grantResults[i] == PackageManager.PERMISSION_GRANTED)
{
LogUtils.i(TAG,"permisssion granted "+permissions[i]);
SmsBroadcast smsBroadcast = new SmsBroadcast();
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(smsBroadcast, filter);
}
else
{
LogUtils.i(TAG,"permisssion deny "+permissions[i]);
}
}
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
5.兼容其他版本。
public static class PermissionV4
{
/**
*适用于最小SDK 23(android m)
* @param permission 对应的权限.格式:Manifest.permission.ACCOUNT_MANAGER
* @return true:权限已经分配 false: 需要弹出对话框来设置权限:
* codeing : requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
*/
public static List<String> isThatPermissionGranted(Context context,String... permission)
{
List<String> list = new ArrayList<>();
if(permission.length <= 0)
{
return list;
}
for(String str : permission)
{
if (ContextCompat.checkSelfPermission(context,str)
!= PackageManager.PERMISSION_GRANTED)
{
list.add(str);
}
}
return list;
}
/**
*是否應該顯示對話框
* @param permissions
*/
public static List<String> shouldShowDialog(Activity context,String... permissions)
{
List<String> list = new ArrayList<>();
if(permissions.length < 0 || Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
{
return list;
}
else
{
for (String str : permissions)
{
if(!ActivityCompat.shouldShowRequestPermissionRationale(context,str))
{
list.add(str);
}
}
}
return list;
}
}