这个部分是上学期做项目时遇到的一个问题,项目中需要用相机拍摄图片,当时在网上找的调用系统相机的方法都没有主动申请权限,而在安卓6.0以后版本这是十分必要的部分,不申请权限程序会崩溃。后来看了郭霖大佬的书,完美的解决了这个问题,所以还是很推荐这本安卓入门的书。
另外本人是刚学习安卓的小白,本片博客其实算是一个笔记,希望写的有不对的地方大佬们可以指出来。
本部分来源于《第一行代码》。
1、在AndroidManifest.xml中添加如下代码:
<uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
分别为相机权限和读写权限。
2、初始化writeflag:
int writeflag = 0;//判断储存权限是否获取
3、在onCreate()函数里添加如下代码:
if(ContextCompat.checkSelfPermission(BCH.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(BCH.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2);}else{writeflag = 1;}
如果没有读写权限,将会向用户申请权限;如果有则将writeflag设为1.即在APP第一次启动时向用户申请读写权限。为了要在用户首次打开APP时向用户申请必要权限,在onCreate()函数里写上述代码。
4、在打开相机的按钮函数里加上如下代码:
if(writeflag == 0){Toast.makeText(this, "没有存储权限!\n请接收权限申请或前往设置添加权限!", Toast.LENGTH_SHORT).show();ActivityCompat.requestPermissions(BCH.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2);}else{//进行相机权限的检测,如果没有授权,申请权限。if(ContextCompat.checkSelfPermission(BCH.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(BCH.this, new String[]{Manifest.permission.CAMERA}, 1);}else{startCamera();}}
如果没有读写权限则对用户进行提示并申请权限;有则检查是与否有相机权限,没有则申请,有则执行startCamera()函数,打开相机。
5、申请权限的回调函数:
@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){switch (requestCode){case 1:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){startCamera();}else{Toast.makeText(this, "没有相机权限!\n请接收权限申请或前往设置添加权限!", Toast.LENGTH_SHORT).show();}break;case 2:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){writeflag = 1;}else{Toast.makeText(this, "没有存储权限!\n请接收权限申请或前往设置添加权限!", Toast.LENGTH_SHORT).show();}break;default:}}
小结:申请权限的逻辑即在执行某功能或函数前判断是否具有相应的权限,如果没有则向用户申请权限,转入权限申请回调函数,如果有则执行该功能或函数。