7.0以上版本(包括7.0)实现拍照功能有两个需要注意的地方
- 拍照权限的动态获取
- 内容提供器的使用
注意⚠️:如果是调用系统相机,是不用动态申请相机权限的!但是如果AndroidManifest.xml里面写了相机权限声明,那么就需要动态申请权限了
动态权限获取
在6.0系统之前,需要指定的权限可以在AndroidManifest.xml文件中进行权限声明
例如:
<user-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
但是这样会涉及到一个安全性问题,在6.0系统之前通过此方法声明的权限会在安装app的时候告诉用户该app需要的所有权限,一旦安装就表示授权,用户没有选择的余地。因此6.0后android将权限分级,不重要的权限可以在AndroidManifest.xml文件中
声明,等级较高(比如涉及到相机,电话等权限)权限则需要动态授权,并且用户可以随时在设置中取消授权。
重要权限可以查阅相关文档
官方说明
获取权限
调用ActivityComapt的requestPermissions的方法
public static void requestPermissions(@NonNull final Activity activity, @NonNull final String[] permissions, @IntRange(from = 0L) final int requestCode)
实例
ActivityCompat.requestPermissions(MainActivity.this,new String [] {
permission},1);
调用这个方法获取权限后,将会回调MainActivity中的onRequestPermissionsResult()方法,在此方法中可以通过requestCode来判断是否获得到了权限进而进行下一步操作。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
swich(requestCode){
case 1:
if(grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
// to do
}else{
Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
检测系统版本
在实际开发中,为了程序能适应多个版本的系统,需要对系统版本进行检测,从而来执行不同的操作
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// 7.0 以上
}else {
// 7.0 以下
}
检测是否某拥有权限
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){
//to do
}
PackageManager.PERMISSION_DENIED 表示没有权限
PackageManager.PERMISSION_GRANTED 有权限
通过内容提供器显示图片
获取权限
- 在androidManifest.XML 文件申请相关权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"