Android7.0新特性,及Android N适配( 五 )


心得::要求必须为false , 为true则会报安全异常 。:true , 表示授予 URI 临时访问权限 。
第二步:指定共享的目录
为了指定共享的目录我们需要在资源(res)目录下创建一个xml目录 , 然后创建一个名为“”(名字可以随便起 , 只要和在注册的所引用的保持一致即可)的资源文件 , 内容如下:

代表的根目录: .()
代表的根目录: .()
代表的根目录: ()
心得:上述代码中path=”“ , 是有特殊意义的 , 它代码根目录 , 也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了 , 如果你将path设为path=”” , 
那么它代表着根目录下的目录(eg:///0/) , 如果你向其它应用分享目录范围之外的文件是不行的 。
第三步:使用
上述准备工作做完之后 , 现在我们就可以使用了 。
还是以调用系统相机拍照为例 , 我们需要将上述拍照代码修改为如下:
File file=new File(Environment.getExternalStorageDirectory(), "/temp/"+System.currentTimeMillis() + ".jpg");if (!file.getParentFile().exists())file.getParentFile().mkdirs();Uri imageUri = FileProvider.getUriForFile(context, "com.jph.takephoto.fileprovider", file);//通过FileProvider创建一个content类型的UriIntent intent = new Intent();intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URIstartActivityForResult(intent,1006);
上述代码中主要有两处改变:
1、将之前Uri的类型为file的Uri改成了有创建一个类型的Uri 。
2、添加了.(.);来对目标应用临时授权该Uri所代表的文件 。
心得:上述代码通过的Uri( ,, File file)
静态方法来获取Uri , 该方法中参数就是清单文件中注册的:=”com.jph..” 。
对Web服务器如 , IIS比较熟悉的小伙伴 , 都只知道为了网站内容的安全和高效 , Web服务器都支持为网站内容设置一个虚拟目录 , 其实也有异曲同工之处 。
将方法获取的Uri打印出来如下:
content://com.jph.takephoto.fileprovider/camera_photos/temp/1474960080319.jpg 。
其中就是.xml中paths的name 。
因为上述指定的path为path=”“ , 所以://com.jph..//代表的真实路径就是根目录 , 即:///0/ 。
://com.jph..//temp/19.jpg代表的真实路径是:///0/temp/19.jpg 。
裁切照片代码:
File file=new File(Environment.getExternalStorageDirectory(), "/temp/"+System.currentTimeMillis() + ".jpg");if (!file.getParentFile().exists())file.getParentFile().mkdirs();Uri outputUri = Uri.fromFile(file);Uri imageUri=Uri.fromFile(new File("/storage/emulated/0/temp/1474960080319.jpg"));Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(imageUri, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("scale", true);intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true); // no face detectionstartActivityForResult(intent,1008);
和拍照一样 , 上述代码在.0上同样会引起.os.ion异常 , 解决办法就是上文说说的使用 。