Android学习笔记-Android6.0运行时权限(续)
来源:互联网 发布:约拿情结 知乎 编辑:程序博客网 时间:2024/06/15 19:45
如果在项目开发中,像上篇blog那样,每次需要权限的时候,就申请一下,那未免也太麻烦了,运行时权限依附于Activity,所以,我们尝试着封装一下。
首先来看看之前的代码:
public class MainActivity extends AppCompatActivity { private Button buttonCall; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonCall = (Button) findViewById(R.id.ButtonCall); buttonCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //判断时候是否有“打电话权限” if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { //没有权限,就申请权限 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1); } else { //有权限,调用打电话方法 MakeCall(); } } }); } public void MakeCall(){ try { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:0123456789")); startActivity(intent); }catch (SecurityException e){ e.printStackTrace(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode){ case 1: //判断时候是否有“打电话权限” if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ //有权限,调用打电话方法 MakeCall(); }else{ //没有权限,给一个Toast提示 Toast.makeText(this,"您拒绝了权限",Toast.LENGTH_SHORT).show(); } break; default: break; } }}
前面的好封装,但是,onRequestPermissionsResult()就很难搞定了,因为它是重写了Activity的方法,(AppCompatActivity是Activity的子类),它必须依附于Activity。那么怎么搞定呢?
这里,有三种途径:
1. 弄一个透明的Activity,它覆盖于当前Activity之上,专门用于权限申请
2. 通过Fragment,我们都知道,碎片依附于Activity,在Fragment中也有onRequestPermissionsResult()的方法
3. 写一个BaseActivity,所有的Activity都继承这个父类
今天要重点说的,就是第三种方法:
首先,BaseActivity中写一个申请权限的Requrst方法,然后重写onRequestPermissionsResult()
其次,写一个接口,用来实现回调机制,是否授权
最后,在需要授权的地方调用前面写的Requrst方法。
PermissionListener接口:
public interface PermissionListener { void onGranted(); void onDenied(List<String> DeniedPermissionList);}
BaseActivity:
public class BaseActivity extends AppCompatActivity { private PermissionListener mlistener; public void RequestPermission(String [] permissions,PermissionListener listener){ mlistener = listener; List<String> ListPermission = new ArrayList<>(); for (String permission: permissions) { if (ContextCompat.checkSelfPermission(this,permission) != PackageManager.PERMISSION_GRANTED){ ListPermission.add(permission); } } if (!ListPermission.isEmpty()){ ActivityCompat.requestPermissions(this,ListPermission.toArray(new String[ListPermission.size()]),1); }else{ listener.onGranted(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode){ case 1: if (grantResults.length>0){ List<String> deniedPermission = new ArrayList<>(); for (int i = 0; i <grantResults.length ; i++) { int grantResult = grantResults[i]; String permissoin = permissions[i]; if (grantResult != PackageManager.PERMISSION_GRANTED){ deniedPermission.add(permissoin); } } if (deniedPermission.isEmpty()){ mlistener.onGranted(); }else{ mlistener.onDenied(deniedPermission); } } break; default: break; } }}
最后,调用的时候,干净利落
public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.buttonOnClick).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { RequestPermission(new String[]{Manifest.permission.CALL_PHONE,Manifest.permission.ACCESS_FINE_LOCATION}, new PermissionListener() { @Override public void onGranted() { makeCall(); } @Override public void onDenied(List<String> DeniedPermissionList) { for (String permission:DeniedPermissionList) { Toast.makeText(MainActivity.this,"拒绝了权限:"+permission,Toast.LENGTH_SHORT).show(); } } }); } }); } private void makeCall(){ try { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:123456789")); startActivity(intent); } catch (SecurityException e) { e.printStackTrace(); } }}
到这里,封装就结束了。
后记:
其实,把BaseActivity中的RequestPermission()方法设置成静态,在其他非Activity中也能调用,只是获取当前Activity有点困难,解决方法就是写一个ActivityCollector,作为活动管理器,当CreateActivity时候,添加到这个活动管理器中,然后回事随地就可以知道当前活动的Activity。
- Android学习笔记-Android6.0运行时权限(续)
- Android学习笔记-Android6.0运行时权限
- Android6.0运行时权限笔记。
- Android6.0运行时权限学习总结
- Android6.0运行时权限学习
- Android6.0运行时权限学习见解
- Android6.0运行时权限(一)
- Android6.0 运行时权限
- Android6.0 运行时权限
- Android6.0运行时权限
- 【Android6.0】运行时权限
- Android6.0 运行时权限
- Android6.0 运行时权限
- Android6.0 运行时权限
- Android6.0运行时权限
- Android6.0运行时权限
- Android6.0---运行时权限
- Android6.0运行时权限
- 单例设计模模式——懒汉式为什么线程不安全
- layout、values和drawable屏幕自适应
- Mysql免安装版配置【图文版和文字版】
- WPF教程(三十六)UpdateSourceTrigger属性
- 多表查询数据库
- Android学习笔记-Android6.0运行时权限(续)
- 解决Android 7.0 (Android N)中 Android Device Monitor(DDMS)的 File Explorer不显示目录树的问题
- 哈理工OJ 1150 相识(排序后枚举)
- 炉石传说爆牌鱼斩杀算法C语言实现
- bash环境GIT仓库基本操作(1)
- Linux驱动中module_init宏的解析
- html列表
- Linux Shell 函数返回值
- HibernateUtils