在android7.0以上版本传统的拍照功能代码要作改变,特别是传统的uri被认为是不安全的,要通过FileProvider封装uri
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);File file=new File(TEMP_IMAGE_PATH);
file.createNewFile();
photoUri=Uri.fromFile(file);
if (Build.VERSION.SDK_INT>=24)
photoUri=FileProvider.getUriForFile(this,"com.example.aa.puzzle.fileProvider",file);
intent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);
<provider
android:authorities="com.example.aa.puzzle.fileProvider"
android:name="android.support.v4.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/image_paths"/>
</provider>
android:authorities
是用来标识provider的唯一标识,和前面的代码对应,granUriPermissions用来控制共享文章的访问权限
在res新建文件夹xml,新建文件path.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path=""/>
</paths>
同时由于我的手机没有sd卡,特意去了解了直接存在系统相册的方法
String TEMP_IMAGE_PATH=Environment.getExternalStorageDirectory().getPath()+"/puzzle/";
前面的函数可以获取到手机存储的目录,下面那个文件夹可以新建也可以直接放在已有的文件比如Camera,我这里是放在新建
文件夹puzzle
new File(TEMP_IMAGE_PATH).mkdir();//新建文件夹
TEMP_IMAGE_PATH=TEMP_IMAGE_PATH+"image.png";//补全路径,建议用时间戳或随机函数
File file=new File(TEMP_IMAGE_PATH);
file.createNewFile();
然后通过第一段代码吧file通过FileProvider转为uri,再传给
MediaStore.EXTRA_OUTPUT
还需要添上这句话更新相册
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + TEMP_IMAGE_PATH)));
当然,还有第二种方法可以把照片保存到相册
MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,String.valueOf(Math.random())+"image","image");
不过这种不能修改存放地址,还要加上一句:
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);
防止被压缩。