网站首页 > 资源文章 正文
近期项目中需要用到拍照、相册选取图片的部分,我记得项目中之前是可以用的,怎么现在拍照不能用了?
先看下效果图,(拍照模拟器不能用?真机可以,这个不是问题,毕竟最后都是要真机的):
效果图1
拍照
裁剪
相册选取的就没有截图,后面有源码,可以下载代码看看。
这里我独立写了一个测试demo,用于查看时什么问题导致拍照闪退,运行果然出现错误:
如下图
url异常
开始看到这个错误真的不知道怎么回事,因为没遇到过,后来查了下是android 7.0版本
不允许在代码中直接配置url,如下
mDefaultOutPutUri = Uri.fromFile(tmpFile);
于是找了别的demo发现很少有既兼容6.0又兼容7.0的demo,自己动手开始写,下面就开始贴出代码,简单分析下喽!
对于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!
猜你喜欢
- 2024-10-22 一位安卓程序员入坑Flutter后整理出一份超详细的学习笔记
- 2024-10-22 应用程序与 AMS 的通讯实现——ActivityManager函数
- 2024-10-22 Android系统为什么要提供FileProvider机制
- 2024-10-22 Android 应用安全最佳实践(android软件安全)
- 2024-10-22 在这个要求高级开发的行情下,安卓初级开发怎样在面试中杀出重围
- 2024-10-22 Android 7.0 应用流程的启动分析和研究
- 2024-10-22 毕业就进大厂?必备Android校招面试技巧(含真题)
- 2024-10-22 组件是如何通信的?揭秘ARouter路由机制
- 2024-10-22 浅入浅出 Android 安全(五)Android应用层安全
- 2024-10-22 Android组件化初探「含Demo」(安卓组件化开发步骤)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)