热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现拍照截取和相册图片截取

这篇文章主要为大家详细介绍了Android实现拍照截取和相册获取图片截取,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

关于拍照截取和相册截取,看了网上很多资料,自己整理了一份比较详细的,供有需要的人参考

1  拍照

原理就是通过intent调用系统的相机,拍完照在回调进行操作,成功获取到拍完照的图片根据uri调用系统的裁剪页面,裁剪完也是在回调中进行处理,显示在页面的imageview中。

2  相册选取图片

原理也是通过intent打开系统的图片,用户选择完成以后在回调中根据图片的uri调用系统的裁剪页面,同上。

首先,定义几个常量

public static final int TAKE_PHOTO = 1; 
public static final int CROP_PHOTO = 2; 
public static final int ACTION_CHOOSE=3; 
private Uri imageUri; //图片路径 
private String filename; //图片名称 

然后在拍照和相册选择的按钮中处理事件

@Override 
  public void onClick(View v) { 
    switch (v.getId()) { 
      case R.id.bt1:  //拍照截取 
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); 
        Date date = new Date(System.currentTimeMillis()); 
        filename = format.format(date); 
        File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
        File outputImage = new File(path, filename +".jpg"); 
        try { 
          if (outputImage.exists()) { 
            outputImage.delete(); 
          } 
          outputImage.createNewFile(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
        //将File对象转换为Uri并启动照相程序 
        imageUri = Uri.fromFile(outputImage); 
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //照相 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //指定图片输出地址 
        startActivityForResult(intent, TAKE_PHOTO); //启动照相 
        break; 
      case R.id.bt2:  //相册选取 
        Intent intent2 = new Intent(Intent.ACTION_PICK); 
        intent2.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*"); 
        startActivityForResult(intent2,ACTION_CHOOSE); 
        break; 
    } 
  } 

最主要的在回调中的执行

// 使用startActivityForResult返回结果时调用的方法 
  @Override 
  protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(resultCode!=RESULT_OK){ 
      Toast.makeText(this, "取消了", Toast.LENGTH_SHORT).show(); 
      return; 
    } 
    switch (requestCode) { 
      case TAKE_PHOTO:  //拍照的回调 
        cropImage(); 
        break; 
      case ACTION_CHOOSE:  //选择照片的回调 
        imageUri = data.getData(); 
        cropImage(); 
        break; 
      case CROP_PHOTO:  //裁剪完照片的回调 
        showPic(); 
        break; 
      default: 
        break; 
    } 
  } 

裁剪图片的方法

/** 
 * 裁剪图片 
 **/ 
private void cropImage() { 
  Intent intent = new Intent("com.android.camera.action.CROP"); //剪裁 
  intent.setDataAndType(imageUri, "image/*"); 
  intent.putExtra("scale", true); 
  //设置宽高比例 
  intent.putExtra("aspectX", 1); 
  intent.putExtra("aspectY", 1); 
  //设置裁剪图片宽高 
  intent.putExtra("outputX", 340); 
  intent.putExtra("outputY", 340); 
  intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
  Toast.makeText(MainActivity.this, "剪裁图片", Toast.LENGTH_SHORT).show(); 
  //广播刷新相册 
  Intent intentBc = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
  intentBc.setData(imageUri); 
  this.sendBroadcast(intentBc); 
  startActivityForResult(intent, CROP_PHOTO); //设置裁剪参数显示图片至ImageView 
} 

过程比较简单,可能会有一些判断的地方没有处理,如果有不对的地方希望有高手可以帮忙改进,谢谢~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文主要解决了在编译CM10.2时出现的关于Samsung Exynos 4 HDMI HAL库中SecHdmiV4L2Utils.cpp文件的编译错误。 ... [详细]
  • 本文详细介绍了一种实现PopupWindow全屏显示且能有效隐藏虚拟按键的技术方案,适用于Android开发。此方法经过实际测试,表现良好,兼容性优秀。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
  • SpringBoot新手入门指南
    本文旨在为初次接触SpringBoot的开发者提供一份详细的入门指导,包括如何快速搭建并运行一个简单的SpringBoot应用。通过本文,读者将了解Maven项目的构建、必要的配置文件设置以及基本的应用开发流程。 ... [详细]
  • 本视频详细介绍了如何利用J2EE、JBPM 3.x/4.3、Flex流程设计器、jQuery以及授权认证机制构建高效的企业普及版贝斯OA及工作流管理系统。 ... [详细]
  • BL550721、特点液晶驱动输出:Common输出4线,Segment输出36线内置显示寄存器364144bit2线串行接口(SCL,SDA)内置震荡电路内置液晶驱动电源电路13 ... [详细]
  • 本文介绍了如何在Windows操作系统中安装FFTW库,并详细说明了使用Visual Studio 2010进行4096点快速傅里叶变换(FFT)的步骤。包括下载预编译文件、生成库文件以及配置环境等关键环节。 ... [详细]
  • javascript——对象的概念——函数 1 (函数对象的属性和方法)
    一、创建函数函数是一种对象:Function类是对象,可以通过Function实例化一个函数,不过最多的还是利用function来创建函数。方式一:利用Function类来实例化函 ... [详细]
  • 在开发H5页面时,为了减少资源请求和简化工作流程,直接使用SVG和CSS3来创建简单的图形元素是一个高效的选择。本文将探讨如何不依赖于第三方图标库,仅通过HTML和CSS技术实现一个‘返回顶部’的图标。 ... [详细]
  • 在Android应用开发中,当在MenuItem中通过app:actionLayout属性使用Switch控件时,可能会遇到空指针异常的问题。本文将探讨该问题的原因及解决方案。 ... [详细]
  • IEC60825激光产品安全标准详解
    随着激光技术在全球范围内的广泛应用,尤其是激光投影显示技术的兴起,了解和遵守相关的安全标准变得尤为重要。本文将详细介绍IEC60825激光产品安全标准及其重要性。 ... [详细]
  • Mysqlcheck作为MySQL提供的一个实用工具,主要用于数据库表的维护工作,包括检查、分析、修复及优化等操作。本文将详细介绍如何使用Mysqlcheck工具,并提供一些实践建议。 ... [详细]
  • LIN总线技术详解
    LIN(Local Interconnect Network)总线是一种基于UART/SCI(通用异步收发器/串行接口)的低成本串行通信协议,主要用于汽车车身网络中智能传感器和执行器之间的通信。 ... [详细]
  • 本文详细介绍了如何在本地环境中安装配置Frida及其服务器组件,以及如何通过Frida进行基本的应用程序动态分析,包括获取应用版本和加载的类信息。 ... [详细]
  • 在使用KVM虚拟化技术通过NAT模式启动虚拟机时,可能会遇到qemu-ifup-nat脚本执行失败的错误。本文将详细介绍如何诊断和解决这一问题。 ... [详细]
author-avatar
qianweirui7058
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有