android6.0运行时权限完美封装方法

所属分类: 软件编程 / Android 阅读数: 80
收藏 0 赞 0 分享

前几天看了郭大神的运行时权限的专讲,深受启发,由于现在基于目前项目中的运行时权限封装的还不是那么完美,趁着郭神建议的还是历历在目。于是把它完整的敲了下来。并在此基础上添加上自己的一些见解,封装成一个完整的demo,希望与大家进行交流与。

在这里我进行了简单的在activity中简单进行获取权限和工具类封:

某一个权限被禁止或者是所有的权限被禁止,这里我做了去到烯烃界面去设置的处理:

如果要开启多个权限的话,则可能不同的手机显示的效果不同,有些手机在权限Dialog上显示需要获取权限的个数,但有些手机需要多少个权限显示多少个。

最后一步处理:如果某个权限被禁止的话,则到设置界面去提示用户去打开权限:

部分代码:

/**
 * 类功能描述:在activity中进行检测权限的简单方法 </br>
 * 博客地址:http://blog.csdn.net/androidstarjack
 * @author 老于
 * @version 1.0 </p> 修改时间:</br> 修改备注:</br>
 */
public class CheckPermissionOnActivity extends AppCompatActivity {
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_checkpermission1);
  ButterKnife.bind(this);
 }
 @OnClick({R.id.btn_runtimne_onClick, R.id.btn_runtimne_onClick_multify,R.id.btn_runtimne_onClick_seting})
 public void onMyListener(View v){
  switch (v.getId()){
   case R.id.btn_runtimne_onClick:
    requestToUserPersiom(1);
    break;
   case R.id.btn_runtimne_onClick_multify:
    requestToUserPersiom(2);
    break;
   case R.id.btn_runtimne_onClick_seting:
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    intent.setData(Uri.parse("package:"+ getPackageName()));
    startActivity(intent);
    break;
  }
 }
 public void requestToUserPersiom(int permisionIndexCount){
  switch (permisionIndexCount){
   case 1:
    ActivityCompat.requestPermissions(CheckPermissionOnActivity.this, new String[]{android.Manifest.permission.CALL_PHONE},100);//去请求权限
    break;
   case 2:
   case 3:
   case 4:
    ActivityCompat.requestPermissions(CheckPermissionOnActivity.this, new String[]{android.Manifest.permission.CALL_PHONE,android.Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
    break;
 
  }
 }
 
 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  if(requestCode == 100){
   if(grantResults.length >0 ){
    for (int i = 0; i < grantResults.length; i++) {
     if( grantResults[i] == PackageManager.PERMISSION_DENIED){//拒绝啦
      return ;
     }
    }
    doosmething();
   }
  }
 }
 
 /**
  * 做其他事情
  */
 public void doosmething(){
  GetToast.useString(CheckPermissionOnActivity.this,"开始做其他事情了");
 }
}

封装成BaseActivitgy工具类:

public class BasePermisitionActivity extends Activity {
 
 private static final int REQUESTPERMISSION_CODE = 100;
 private static QuestPermissionListener questPermissionListener;
 private AlertDialog.Builder builder;
 private AlertDialog alertDialog;
 
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ActivityManager.addPermissionActivty(this);
 }
 
 public static void requestRuntimePermission(String [] permissions,QuestPermissionListener questPermissionListener){
  Activity actyivty = ActivityManager.permissionActivilyList.get(ActivityManager.permissionActivilyList.size() -1);
  if(actyivty == null){
   return;
  }
  List<String> neetRequestPermisList = new ArrayList<String>();
  for (String permission : permissions) {
   if(ActivityCompat.checkSelfPermission(actyivty,permission) == PackageManager.PERMISSION_DENIED){
    neetRequestPermisList.add(permission);
   }
  }
  BasePermisitionActivity.questPermissionListener = questPermissionListener;
  if(!neetRequestPermisList.isEmpty()){
   ActivityCompat.requestPermissions(actyivty,neetRequestPermisList.toArray(new String[neetRequestPermisList.size()]),REQUESTPERMISSION_CODE);
  }
 }
 
 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  if(requestCode == REQUESTPERMISSION_CODE){
   for (int i = 0; i < grantResults.length; i++) {
    int granrRequest = grantResults[i];
    if(granrRequest == PackageManager.PERMISSION_DENIED){//权限被拒绝啦
     if(questPermissionListener != null){
      questPermissionListener.denySomePermission();
     }
      return;
    }
   }
   questPermissionListener.doAllPermissionGrant();
  }
 }
 
 @Override
 protected void onResume() {
  super.onResume();
 
 }
 
 
 public void onResumeCheckPermission(String ...permission){
  if(PermisionControl.lackMissPermission(this,permission)){
   showMissPermissionDialog();
  }
 }
 
 
 @Override
 protected void onDestroy() {
  super.onDestroy();
  ActivityManager.removePermissionActiivty(this);
 }
 /**
  * 丢失权限,进行弹框设置
  */
 public void showMissPermissionDialog() {
  if (builder == null) {
   builder = new AlertDialog.Builder(BasePermisitionActivity.this);
   builder.setTitle("帮助");
   String msg = "当前应用缺少必要权限。<br>\r请点击\"设置\"-\"权限\"-打开所需权限。<br>\r\r最后点击两次后退按钮,即可返回。";
   builder.setMessage(Html.fromHtml(msg));
   //materialDialog.setMovementMethod(LinkMovementMethod.getInstance());
   builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
     alertDialog.dismiss();
    }
   });
   builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
     alertDialog.dismiss();
     startAppSettings();
    }
   });
   alertDialog = builder.create();
   alertDialog.show();
  } else {
   alertDialog.show();
  }
 }
 // 启动应用的设置
 public void startAppSettings() {
  try {
   Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
   intent.setData(Uri.parse("package:"+ getPackageName()));
   startActivity(intent);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

与其相关的工具类:

/**
 * 类功能描述:6.0运行时权限 </br>
 * permission权限控制器</br>
 * 博客地址:http://blog.csdn.net/androidstarjack
 * @author 老于
 * Created on 2017/1/3/002
 * @version 1.0 </p> 修改时间:</br> 修改备注:</br>
 */
public class PermisionControl {
 /**
  * 检查所有的权限是否被禁止
  */
 public static boolean lackMissPermission(Context cnt ,String... permission){
  boolean relust = true ;
  for (String per : permission) {
   if(ActivityCompat.checkSelfPermission(cnt,per) == PackageManager.PERMISSION_DENIED){
    relust = false ;
    break;
   }
  }
  return relust;
 }
 
 /**
  * 请求运行时权限
  * eg:
  */
 public void requestRuntimePermission(QuestPermissionListener questPermissionListener, String... permissions){
  BasePermisitionActivity.requestRuntimePermission(permissions,questPermissionListener);
 }
}

以及其他的一些封装:

public class PermissionUsage {
 /**********权限:打电话,写入内存卡,定位********/
 public static String[] LOACATION_CAMERA = { Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE,
   Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_EXTERNAL_STORAGE};
 /**********权限:读取内存卡********/
 public static String[] READ_EXTRASORE = { Manifest.permission.READ_EXTERNAL_STORAGE};
 /**********权限:打电话权限********/
 public static String[] RCALL_PHONE = { Manifest.permission.READ_EXTERNAL_STORAGE};
}

以上这篇android6.0运行时权限完美封装方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多