本文详细介绍了在Android 11中因文件权限变化导致调用相机保存图片的方法需要更新,包括如何使用FileProvider、配置XML文件路径以及处理活动结果来正确保存和显示图片到ImageView。通过这些步骤,开发者可以解决在新版本Android上保存和显示相机拍摄图片的问题。
摘要由CSDN通过智能技术生成
原文链接:
Android11调用相机保存并显示图片到imageview_Cingke是真的的博客-CSDN博客
android11版本因为加强了创建文件的限制,所以用以前保存图片的方法就行不通了。
1、在获取相关权限后,调用相机
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//确保有相机来处理Intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File photoFile = saveFileName1();
tempFile1 = photoFile;
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".fileprovider", photoFile);
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, 1);
2、配置FileProvider,用于app之间的文件共享
//在application标签里
<provider
android:authorities="com.xxxxx.xxxxx.fileprovider"//唯一标识,可以自定义,一般用包名
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths">
</meta-data>
</provider>
之后配置对应路径的xml文件
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="." />
</paths>
3、保存位置
private String currentPath;//配置全局变量
private File saveFileName1() {
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;
4、处理返回结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
FileOutputStream o=null;
Bitmap bitmap=BitmapFactory.decodeFile(currentPath);
//显示
image.setImageBitmap(bitmap);
//图片在文件管理器打不开,需要移出应用私有目录才可查看
}
}
在项目中,我们拿到的网络图可能是透明的,但又要求我们显示白色背景。
当然处理的
方法很多,如给控件添加背景色,或者通过两个控件叠加来显示等等,这里我记录我使用的别的
方法。
方法1(此
方法仅适用于纯色图片。相信我,不是纯色图片不要使用,不然上线后你可能要卷铺盖走人了):
变量每一个像素点,把对应的旧颜色替换为新的颜色
* 建议只能是纯色png图片,不然会造成图片像素或显示极度模糊
* 将bitmap中的某种颜色值替换成新的颜色
* @param oldBitmap
1请求以下权限
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
manifest中注册
app动态请求两步都需要
2调起相机
Intent takePictureIntent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//确保有相机来处理Inten
由于是
调用系统功能,因此不需权限
PhotoUtils.camera(activity,你定义的FileProvider的authority){
uri, success, msg ->
if(success)
Glide.with(this).load(uri).into(binding.ivImage)
//
调用相册
PhotoUtils.select(fragment){
uri, success, msg ->
完成毕业设计的需要,Android11要求实现图片拍照并裁剪,例如头像的选取。真机redmi k20;Android studio2021.1.1 java编程。
1. 文件权限问题
这是Android11在拍照裁剪最大的问题。Android11对app存储权限设置了分区,app默认只能访问自己app内的文件,而公共区域的文件则需要添加provider来支持访问,而其他app内部的文件访问权限则需要目的app开启权限,一般情况下都无法访问其他app的私有文件。
我当前实现的拍照及裁剪都是Android
近期使用使用的时候发现,一些Android11版本及以上的手机拍照的时候无法将图片保存到应用程序的是有目录中。也就是文件的大小为0KB。这个问题会导致应用中一些更换图片的逻辑失效比如用户头像替换。意见反馈图片