android 拍照和裁剪图片保存并查看系统相册
在Android开发中,实现拍照、裁剪图片以及将其保存到系统相册是常见的功能需求,尤其是在社交应用或者图像处理类应用中。以下将详细介绍如何在Android应用中完成这些操作。 我们需要创建一个用于调用系统相机的Intent。在Android中,我们可以使用`Intent.ACTION_IMAGE_CAPTURE`来启动相机应用。在触发相机前,你需要确保用户具有相应的权限,例如在Android 6.0及以上版本需要动态申请`WRITE_EXTERNAL_STORAGE`权限。 ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); } ``` 当权限检查通过后,你可以创建并启动相机Intent: ```java private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } ``` 这里,`REQUEST_IMAGE_CAPTURE`是你自定义的请求码,用于在`onActivityResult()`中区分不同的操作。 接下来,你需要重写`onActivityResult()`方法,接收相机返回的图片数据: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); // 对图片进行裁剪操作 cropImage(imageBitmap); } } ``` 裁剪图片通常需要启动另一个Intent,使用`Intent.ACTION_PICK`或`Intent.ACTION_GET_CONTENT`配合`MediaStore.Images.Media.EXTERNAL_CONTENT_URI`选择图片,然后设置裁剪参数: ```java private void cropImage(Bitmap imageBitmap) { Intent cropIntent = new Intent("com.android.camera.action.CROP"); Uri uri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); cropIntent.setDataAndType(uri, "image/*"); cropIntent.putExtra("crop", "true"); cropIntent.putExtra("aspectX", 1); cropIntent.putExtra("aspectY", 1); cropIntent.putExtra("outputX", 256); cropIntent.putExtra("outputY", 256); cropIntent.putExtra("return-data", true); startActivityForResult(cropIntent, REQUEST_IMAGE_CROP); } ``` 别忘了创建用于保存裁剪后图片的输出文件Uri: ```java private Uri getOutputMediaFileUri(int type) { File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "MyApp"); if (!mediaStorageDir.exists()) { mediaStorageDir.mkdirs(); } File mediaFile; String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); if (type == MEDIA_TYPE_IMAGE) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); } else { return null; } return Uri.fromFile(mediaFile); } ``` 在裁剪完成后,你需要更新UI显示裁剪后的图片,并将图片保存到系统相册。在`onActivityResult()`中处理裁剪结果: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CROP && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap croppedBitmap = extras.getParcelable("data"); // 更新UI展示裁剪后的图片 imageView.setImageBitmap(croppedBitmap); // 保存图片到系统相册 saveImageToGallery(croppedBitmap); } } private void saveImageToGallery(Bitmap bitmap) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, "My Image"); values.put(MediaStore.Images.Media.DESCRIPTION, "Image from MyApp"); Uri contentUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); try { OutputStream imageOut = getContentResolver().openOutputStream(contentUri); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, imageOut); imageOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri)); } ``` 这样,我们就完成了从调用相机、裁剪图片到保存到系统相册的完整流程。在实际应用中,你可能还需要处理各种异常情况,如用户取消操作、权限未授予等。此外,考虑到Android版本的差异性,对于更早期的Android版本,可能需要使用其他方法来实现相同的功能。
- 1
- wilsonlv892014-03-07还不错,适合初学者
- 长离Yu2014-05-21导入后项目运行不了,不过还是适合初学者参考的
- licaomengRICE2014-02-19有点简单,不过功能还是实现了。
- KallLee2014-03-19可以裁剪,不错的小功能。大体上满足我的需求
- 树kane2014-06-24好用,不过功能似乎有点旧,没有最新版的陌陌那种功能。
- 粉丝: 1
- 资源: 17
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 嵌入式开发概述及其常用编程语言介绍
- 5G模组升级刷模块救砖以及5G模组资料路由器固件
- C183579-123578-c1235789.jpg
- Qt5.14 绘画板 Qt Creator C++项目
- python实现Excel表格合并
- Java实现读取Excel批量发送邮件.zip
- 【java毕业设计】商城后台管理系统源码(springboot+vue+mysql+说明文档).zip
- 【java毕业设计】开发停车位管理系统(调用百度地图API)源码(springboot+vue+mysql+说明文档).zip
- 星耀软件库(升级版).apk.1
- 基于Django后端和Vue前端的多语言购物车项目设计源码