兼容android 11 唤起系统相机拍照并显示(建议大家从android 10开始适配,我就遇到了部分android 10手机也出现这个问题)
本文是记录兼容android 11的唤起系统相机拍照并正常显示,此处我默认已经获取到相机和读写的权限。
打开相机
/**
* 保存 photoUri
*/
private Uri photoUri;
/**
* 打开相机
*/
private void openCamera() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//确保有相机来处理Intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File photoFile = saveFileName();
if (photoFile != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
photoUri = FileProvider.getUriForFile(getApplicationContext(), "com.stg.rouge.activity.fileprovider", photoFile);
} else {
photoUri = getDestinationUri();
}
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(takePictureIntent, 10086);
}
}
}
/**
* 获取 Uri
* @return
*/
private Uri getDestinationUri(){
String fileName = String.format("winetalk_%s.jpg", System.currentTimeMillis());
File cropFile = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), fileName);
return Uri.fromFile(cropFile);
}
//当前路径,拍照回调后需要使用
private String currentPath=null;
/**
* 保存照片路径
* @return
*/
private File saveFileName(){
File newFolder = this.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date(System.currentTimeMillis());
String name =format.format(date)+".jpg" ;
File ji=null;
try {
ji=new File(newFolder+"/"+name);
ji.createNewFile();
currentPath = ji.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
}
return ji;
}
记住,配置文件的写法:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.stg.rouge.activity.fileprovider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths_public"
tools:replace="android:resource" />
</provider>
而res/xml/file_paths_public文件中要添加如下路径:
<external-path name="external_files" path="." />
拍照后的回调
@SuppressWarnings("unchecked")
@Override
protected void onActivityResult(int requestCode, int resultCode