android7.0以上调用系统相机拍照并显示到ImageView上

news/2024/10/6 3:36:27/文章来源:https://www.cnblogs.com/zuiniub/p/18288366

 

/*
*  第一步:新建文件 res/xml/file_paths.xml<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-path path="." name="camera_photos" /></paths>
*  第二步:AndroidManifest.xml文件的application标签中插入下边<providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.lrogzin.memo.fileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>
*  第三步:在你需要的地方调用startCamera()
*  第四步:在你的onActivityResult()中加入:
*
* */
public class UseSysCameraUtil {public static final int CAMERA_CODE = 110;public static Uri takePictureUri;//拍照图片uriprivate static Uri cropPictureTempUri;//裁剪图片uriprivate static File takePictureFile;//拍照图片Filepublic static void startCamera(Activity activity, String displayName) {takePictureUri = createImagePathUri(activity, displayName);if (takePictureUri != null) {Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);i.putExtra(MediaStore.EXTRA_OUTPUT, takePictureUri);//输出路径(拍照后的保存路径)
            activity.startActivityForResult(i, CAMERA_CODE);} else {Toast.makeText(activity, "打开相机失败", Toast.LENGTH_LONG).show();}}public static Uri createImagePathUri(Activity activity, String displayName) {//适配 Android=Q Android=7 API=29if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {//图片名称//String displayName = String.valueOf(System.currentTimeMillis());//String displayName = "head";ContentValues values = new ContentValues(2);values.put(MediaStore.Images.Media.DISPLAY_NAME, displayName);values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");//SD 卡是否可用,可用则用 SD 卡,否则用内部存储if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {takePictureUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);} else {takePictureUri = activity.getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);}} else {String pathName = new StringBuffer().append(FileUtils.getExtPicturesPath()).append(File.separator).append(System.currentTimeMillis()).append(".jpg").toString();takePictureFile = new File(pathName);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //解决Android 7.0 拍照出现FileUriExposedException的问题String authority = activity.getPackageName() + ".fileProvider";takePictureUri = FileProvider.getUriForFile(activity, authority, takePictureFile);} else {takePictureUri = Uri.fromFile(takePictureFile);}}return takePictureUri;}public static void onCameraRes(int requestCode, int resultCode, Activity activity) {try {if (requestCode == CAMERA_CODE && resultCode == activity.RESULT_OK) {Bitmap headBitmap = BitmapFactory.decodeStream(activity.getContentResolver().openInputStream(takePictureUri));//mainAvatar.setImageBitmap(headBitmap);
}} catch (Exception e) {//throw new RuntimeException(e);
            e.printStackTrace();}}public static Bitmap compressImage(Bitmap image) {ByteArrayOutputStream baos = new ByteArrayOutputStream();//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中image.compress(Bitmap.CompressFormat.JPEG, 100, baos);int options = 100;//循环判断如果压缩后图片是否大于100kb,大于继续压缩while (baos.toByteArray().length / 1024 > 100) {baos.reset();//重置baos即清空baos//第一个参数 :图片格式 ,第二个参数: 图片质量,100为最高,0为最差  ,第三个参数:保存压缩后的数据的流
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options,把压缩后的数据存放到baos中//每次都减少10options -= 10;if (options <= 0)break;}//把压缩后的数据baos存放到ByteArrayInputStream中ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把ByteArrayInputStream数据生成图片Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);return bitmap;}static int CROP_CODE = 3;//调用系统的裁剪功能的实现/**   onActivityResult()*   case CROP_CODE://裁剪返回的if (data != null) {Bundle extras = data.getExtras();headBitmap = extras.getParcelable("data");if (headBitmap != null) {mainAvatar.setImageBitmap(headBitmap);// 用ImageView显示出来dialogAvatar.setImageBitmap(headBitmap);}}*/public static void cropPhoto(Uri uri, Activity activity) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", 150);intent.putExtra("outputY", 150);intent.putExtra("return-data", true);activity.startActivityForResult(intent, CROP_CODE);}int PERMISSIONS_REQUEST_CAMERA = 1111;// 请求相机权限private void requestCameraPermission(Activity activity) {if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, PERMISSIONS_REQUEST_CAMERA);} else {//goCamera();//jumpToTakePhoto();//startCamera();
        }}/*@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == PERMISSIONS_REQUEST_CAMERA) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 权限被授予,执行拍照操作//goCamera();//jumpToTakePhoto();startCamera();} else {// 权限被拒绝Toast.makeText(activity, "Camera permission is required to take a photo.", Toast.LENGTH_SHORT).show();}}}*//*** 获取图片路径** @param context Context* @param uri     图片 Uri* @return 图片路径*/public static String getImagePath(Context context, Uri uri) {Cursor cursor = null;try {String[] proj = {MediaStore.Images.Media.DATA};cursor = context.getContentResolver().query(uri, proj, null, null, null);int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);cursor.moveToFirst();String s = cursor.getString(column_index);return s;} finally {if (cursor != null) {cursor.close();}}}/*** 获取图片 Uri** @param context Context* @param path    图片路径* @return 图片 Uri*/public static Uri getImageUri(Context context, String path) {Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID},MediaStore.Images.Media.DATA + "=? ", new String[]{path}, null);if (cursor != null && cursor.moveToFirst()) {int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));Uri baseUri = Uri.parse("content://media/external/images/media");return Uri.withAppendedPath(baseUri, "" + id);} else {if (new File(path).exists()) {ContentValues values = new ContentValues();values.put(MediaStore.Images.Media.DATA, path);return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);} else {return null;}}}}

 

public final class FileUtils {/*** 得到SD卡根目录,SD卡不可用则获取内部存储的根目录*/public static File getRootPath() {File path = null;if (sdCardIsAvailable()) {path = Environment.getExternalStorageDirectory(); //SD卡根目录    /storage/emulated/0} else {path = Environment.getDataDirectory();//内部存储的根目录    /data
      }return path;}/*** 获取图片目录** @return 图片目录(/storage/emulated/0/Pictures)*/public static File getExtPicturesPath() {File extPicturesPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);if (!extPicturesPath.exists()) {extPicturesPath.mkdir();}return extPicturesPath;}/*** 获取缓存图片的目录** @param context Context* @return 缓存图片的目录*/public static String getImageCacheDir(Context context) {String cachePath;if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {cachePath = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getPath();} else {cachePath = context.getCacheDir().getPath();}return cachePath;}/*** 删除缓存图片目录中的全部图片** @param context*/public static void deleteAllCacheImage(Context context) {String cacheImagePath = getImageCacheDir(context);File cacheImageDir = new File(cacheImagePath);File[] files = cacheImageDir.listFiles();if (files != null) {for (File file : files) {if (file.isFile()) {file.delete();}}}}/*** SD卡是否可用*/public static boolean sdCardIsAvailable() {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {File sd = new File(Environment.getExternalStorageDirectory().getPath());return sd.canWrite();} elsereturn false;}/*** 判断目录是否存在,不存在则判断是否创建成功** @param dirPath 文件路径* @return {@code true}: 存在或创建成功<br>{@code false}: 不存在或创建失败*/public static boolean createOrExistsDir(String dirPath) {return createOrExistsDir(getFileByPath(dirPath));}/*** 判断目录是否存在,不存在则判断是否创建成功** @param file 文件* @return {@code true}: 存在或创建成功<br>{@code false}: 不存在或创建失败*/public static boolean createOrExistsDir(File file) {// 如果存在,是目录则返回true,是文件则返回false,不存在则返回是否创建成功return file != null && (file.exists() ? file.isDirectory() : file.mkdirs());}/*** 根据文件路径获取文件** @param filePath 文件路径* @return 文件*/public static File getFileByPath(String filePath) {return isSpace(filePath) ? null : new File(filePath);}/*** 判断字符串是否为 null 或全为空白字符** @param s* @return*/private static boolean isSpace(final String s) {if (s == null)return true;for (int i = 0, len = s.length(); i < len; ++i) {if (!Character.isWhitespace(s.charAt(i))) {return false;}}return true;}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739730.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-17.其他数据日志

C-17.其他数据日志 在之前的数据库事务的章节中,已经讲过,redo log和undo log。 对于线上数据库应用系统,突然遭遇数据库宕机怎么办?在这种情况下,定位宕机的原因就非常关键。我们可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息,包括了错误,警告和注…

如何恢复SSD NVME固态硬盘的数据恢复

一、使用数据恢复软件 操作步骤(以EaseUS Data Recovery Wizard为例): 安装软件:从EaseUS官网或其他可靠来源下载并安装EaseUS Data Recovery Wizard。 连接固态硬盘:将SSD NVMe固态硬盘连接到电脑上,并确保系统能够识别。 启动软件并选择恢复选项:打开EaseUS Data Reco…

raid5存储池已损毁硬盘数据

RAID 5存储池中的硬盘数据损毁是一个复杂的问题,因为它涉及到数据的冗余、存储方式以及恢复策略。 一、RAID 5的工作原理 RAID 5是一种使用条带化和奇偶校验技术的存储解决方案,它至少需要三个硬盘来构建。在这种配置中,数据和奇偶校验信息被分布在所有硬盘上,以提供数据冗…

SSD NVME固态 硬盘 数据恢复

SSD NVMe固态硬盘数据恢复是一个复杂但并非不可能的任务,以下是一些建议的方法和步骤: 一、了解数据恢复的基本原理 数据恢复的基本原理在于,即使文件在操作系统中被删除或格式化,其实际数据在硬盘的物理介质上可能仍然存在,只是被标记为可覆盖。 SSD NVMe固态硬盘与传统的…

磁盘阵列中raid5坏了一个硬盘数据恢复

RAID5数据恢复步骤包括备份数据、更换故障硬盘、重建RAID阵列和数据恢复注意事项。在恢复过程中,需遵循正确的步骤并保持冷静,不要尝试自行解决复杂的数据恢复问题,以免造成不可逆转的数据损失。完成恢复后,应进行完整性检查和验证。 一、概述 RAID 5是一种存储配置,它将多…

电脑开机检测不到硬盘怎么办 电脑检测不到硬盘问题解决

电脑开机检测不到硬盘,无法进入系统或者显示“Reboot and Select proper Boot device”等错误信息。这种情况可能会导致我们的数据丢失或者无法使用电脑。 一、电脑检测不到硬盘的可能原因 电脑检测不到硬盘的原因主要有以下几种:1、硬盘连接线松动或损坏:硬盘是通过SATA线或…

CentOS 7 下载 网络配置 ssh配置 JDK配置 Python3配置 Git配置 nvm配置 防火墙配置

背景 CentOS 8系统2021年12月31日已停止维护服务,CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 9及后续版本,不再支持新的软件和补丁更新。 所以我们如果要安装服务器操作系统就需要安装centos7。这里我是用虚拟机安装的centos7mini版,mini版本是…

IBM服务器raid1数据恢复

IBM服务器RAID1数据恢复是一个相对复杂的过程,因为RAID1涉及数据的镜像和冗余,但一旦数据丢失,恢复的可能性仍然存在。以下是一些建议的步骤和注意事项,以帮助您进行IBM服务器RAID1数据恢复: 一、停止使用受影响的服务器 一旦发现数据丢失,首要任务是停止使用受影响的服务…

服务器刷新BIOS后死机

服务器刷新BIOS后死机是一个比较常见的问题,可能由多种原因引起。 一、原因分析 BIOS文件问题: 刷新的BIOS文件可能本身就是坏的,或者与服务器硬件不兼容。 BIOS版本选择不当,也可能导致兼容性问题。 刷新过程问题: 刷新过程中突然断电或操作不当,可能导致BIOS损坏。 硬件…

其他计算机系统基础知识

计算机语言计算机语言是指用于人与计算机之间交流的一种语言,是人与计算机之间传递信息的媒介。计算机语言主要由一套指令组成,而这种指令一般包括表达式、流程控制和集合三大部分内容。表达式又包含变量、常量、字面量和运算符。 流程控制有分支、循环、函数和异常。 集合包…

函数,调试,循环,头文件

1.关于函数 作用:避免代码重复 可以方便维护,因为当多个地方需要用到同样的代码时,如果要做出修改只需要改函数就能整体修改。 函数通常都会有返回值,什么类型的函数返回什么样的类型的值 函数通常分为函数声明和函数参数通常声明放在头文件中 函数定义发在C++文件中 这样做…

ENVI无缝镶嵌、拼接栅格数据的方法

本文介绍基于ENVI软件,利用“Seamless Mosaic”工具实现栅格遥感影像无缝镶嵌的操作~本文介绍基于ENVI软件,利用“Seamless Mosaic”工具实现栅格遥感影像无缝镶嵌的操作。在遥感图像镶嵌拼接:ENVI的Pixel Based Mosaicking工具操作方法这篇文章中,我们介绍了在ENVI软件中通…