前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

关于Android 7.0(兼容6.0)拍照、裁剪的知识!

qiguaw 2024-10-22 14:20:09 资源文章 14 ℃ 0 评论

近期项目中需要用到拍照、相册选取图片的部分,我记得项目中之前是可以用的,怎么现在拍照不能用了?

先看下效果图,(拍照模拟器不能用?真机可以,这个不是问题,毕竟最后都是要真机的):

效果图1

拍照

裁剪

相册选取的就没有截图,后面有源码,可以下载代码看看。

这里我独立写了一个测试demo,用于查看时什么问题导致拍照闪退,运行果然出现错误:

如下图

url异常

开始看到这个错误真的不知道怎么回事,因为没遇到过,后来查了下是android 7.0版本

不允许在代码中直接配置url,如下

mDefaultOutPutUri = Uri.fromFile(tmpFile);

于是找了别的demo发现很少有既兼容6.0又兼容7.0的demo,自己动手开始写,下面就开始贴出代码,简单分析下喽!

  1. 对于android7.0,首先需要在清单文件配置下FileProvider,

<!-- 适配android 7.0 拍照闪退的处理 ,其中authorities的值要和等下代码中使用的一致就行,
其中resource内的文件就是拍照后的共享文件 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.jh.camerademo.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>

authorities = "xxxx",这里替换成你自己的demo的包名+"fileprovider"即可。

创建xml文件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<paths>
<external-path path="" name="camera_photos" />
<external-path path="photo" name="photos" />
</paths>
</resources>

2.上面配置好后,既然是url的问题,代码中怎么体现呢?

// 判断是否为 andriod 7.0版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 这里用这种传统的方法无法调起相机
mDefaultOutPutUri = FileProvider.getUriForFile(getApplicationContext(), AUTHORITIES, tmpFile);
Log.e(TAG, "imageUri = " + mDefaultOutPutUri);
} else {
mDefaultOutPutUri = Uri.fromFile(tmpFile);
}

可以看到这里是添加了版本的选择判断,就这么几行代码就好,当然这是拍照时要做的判断,因为裁剪的时候也要做版本的判断需要添加下面一行代码才不会出错,

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

不加会报下面的异常

SecurityException: Permission Denial

只要主要上面几个问题就可以避免拍照打不开的问题。

3. 相册获取照片的代码:

Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, IMAGE_REQUEST_CODE);

4.裁剪图片的代码:

Intent intent = new Intent("com.android.camera.action.CROP"); // act=com.android.camera.action.CROP
// 裁剪时,7.0版本需要加上这一句
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
intent.setDataAndType(uri, "image/*"); // dat=file:///storage/emulated/0/head.png // typ=image/* (has extras)
// 设置裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
return intent;

以上就是android 拍照、相册选取、裁剪图片的主要代码以及需要注意的点,只要把上面几点弄清楚,但凡是涉及相机拍照的问题就都不是问题了!

代码地址:https://github.com/jinhuizxc/CameraDemo,如果您觉得还不错,欢迎在github上给个star!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表