安卓开发中,常常需要使用到手机相机拍照、或者相册上传头像等等。通过使用Intent,我们很方便地获得相机、相册里面的图片:

1、相机调用,通过设置File文件路径和文件名,可以将拍照得到的图片保存下来。

 //判断本地内存卡是否可用
String store = Environment.getExternalStorageState();
if(store.equals(Environment.MEDIA_MOUNTED)) {
  picName = FileUtil.createFileName(20, "jpg");
file = new File(FileUtil.createFileDir(ConfigureUtils.IcoFileDir), picName);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file));
startActivityForResult(intent, Camera_Data);
}

2、相册调用

 Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, Album_Data);

3、对Intent获得的数据进行处理:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode != RESULT_CANCELED) {
switch (requestCode) {
case Camera_Data:
if(file.exists()) {
Log.i("MyApplication","获取拍照文件:"+file.getPath());
startPhotoZoom(Uri.fromFile(file));
}
break;
case Album_Data:
//获取相册选取的图片
if(data != null) {
startPhotoZoom(data.getData());
}
break;
case ZoomPhoto:
Bundle bundle = data.getExtras();
bitmap = bundle.getParcelable("data");
picName = FileUtil.createFileName(20, "jpg");
file = new File(FileUtil.createFileDir(ConfigureUtils.IcoFileDir), picName);
//输出最后图片到该文件夹
FileOutputStream out = null;
try {
out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
} }
// //广播通知有图片更新 (最好用绝对路径)
// Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
// intent.setData(Uri.fromFile(file));
// this.sendBroadcast(intent); Map<String,Object> param = new HashMap<String, Object>();
param.put("post_name", ConfigureUtils.getCurrentUser(UserSettingUploadIcoActivity.this));
Map<String, File> fileParams = new HashMap<String, File>();
fileParams.put("file", file);
uploadPic(ConfigureUtils.changeIco, param, fileParams, handler); break;
default:
break;
} }
super.onActivityResult(requestCode, resultCode, data);
}

4、头像上传往往需要调用本地相册,也就是将Intent返回的data(Uri)再一次在相册中打开,裁剪处理后再通过Bundle获取到最后裁剪的小图。

     private void startPhotoZoom(Uri uri) {
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", ConfigureUtils.IcoWidth);
intent.putExtra("outputY", ConfigureUtils.IcoWidth);
intent.putExtra("return-data", true);
startActivityForResult(intent, ZoomPhoto);
}

5、另外,在上面的一些处理中,用到FileUtil工具类(自己定义的),也贴出来。

 public class FileUtil {
/**
* 生成时间和随机数结合的文件名
* @param length 随机数长度
* @param end 文件名后缀,如jpg png
* @return
*/
public static String createFileName(int length,String end) {
String filename = null;
String ranStr = RandomNumberUtils.randomString(length);
filename = new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) +ranStr+"."+ end;
return filename;
} /**
* 创建、获取文件夹
* 默认sd卡根目录+filePath,如/myPicture/
* @return
*/
public static File createFileDir(String filePath) {
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
Log.i("MyApplication",
"SD card is not avaiable/writeable right now.");
return null;
}
File file = new File(Environment.getExternalStorageDirectory().getPath()+filePath);
if(!file.exists()) {
file.mkdirs(); //可以创建多级目录
}
return file;
}
}

下一篇,我们再来说说一些图片的压缩处理。

Android图片处理-相机、相处简单调用的更多相关文章

  1. 【Android进阶】Android程序与JavaScript之间的简单调用

    本篇将讲解一个简单的Android与JavaScript之间的简单调用的小程序 效果图 工程结构 HTMLActivity.java代码 package com.example.javatojs; i ...

  2. Android Camera解析(上) 调用系统相机拍摄照片

    开发中我们常须要通过相机获取照片(拍照上传等).一般通过调用系统提供的相机应用就可以满足需求:有一些复杂需求还须要我们自己定义相机相关属性,下篇我们会涉及到. 首先我们来研究怎样简单调用系统相机应用来 ...

  3. Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

    本文主要介绍一个支持图片自动预取.支持多种缓存算法的图片缓存的使用及功能.图片较大需要SD卡保存情况推荐使用ImageSDCardCache. 与Android LruCache相比主要特性:(1). ...

  4. 【Java/Android性能优 6】Android 图片SD卡缓存 使用简单 支持预取 支持多种缓存算法 支持不同网络类型 支持序列化

    本文转自:http://www.trinea.cn/android/android-imagesdcardcache/ 本文主要介绍一个支持图片自动预取.支持多种缓存算法.支持数据保存和恢复的图片Sd ...

  5. 【Java/Android性能优5】 Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

    本文转自:http://www.trinea.cn/android/android-imagecache/ 主要介绍一个支持图片自动预取.支持多种缓存算法.支持二级缓存.支持数据保存和恢复的图片缓存的 ...

  6. [Android] 图片裁剪总结——调用系统裁剪

    花了两天时间看了下android的图片裁剪功能的实现.其实刚开始做这个我挺虚的,以为整个功能都需要自己写出来,但查了些资料,发现android已经提供了裁剪功能,需要的话自己调用就成了.soga,这下 ...

  7. Android 简单调用摄像头

    IDE: android studio3.1.2 界面: activity_main2.xml

  8. Android显示相册图片和相机拍照

    首先看最重要的MainActive类: public class MainActivity extends AppCompatActivity { private final int FROM_ALB ...

  9. Android 浅谈相机研发

    在android中应用相机功能,一般有两种:一种是直接调用系统相机,一种自己写的相机.        我将分别演示两种方式的使用: 第一种:是使用Intent跳转到系统相机,action为:andro ...

随机推荐

  1. Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据

    用servlet实现一个注册的小功能 ,后台获取数据. 注册页面: 注册页面代码 : <!DOCTYPE html> <html> <head> <meta ...

  2. 管理权限<八>

    权限:如果用户要访问其它方案的对象,则必须为其授予对象的权限.为权限  权限 权限是指执行特定类型 sql 命令或是访问其它方案对象的权利,包括系统权限和对象权限两种. 系统权限  系统权限介绍 ...

  3. VS经常报错的link error 2019

    VS经常报错的link error 2019 原因如下: 可能是找得到头文件,但是相关的dll或者lib找不到,需要在配置里面添加相应的库文件. project=>configuration.. ...

  4. [转]Caffe 深度学习框架上手教程

    Caffe 深度学习框架上手教程 机器学习Caffe caffe 原文地址:http://suanfazu.com/t/caffe/281   blink 15年1月 6   Caffe448是一个清 ...

  5. sqlite中的replace、insert、update之前的区别

    本文转自http://www.ithao123.cn/content-933827.html,在此感谢作者 android数据库操作,有两种方式,一种用android提供给我们的数据库操作函数inse ...

  6. memalign vs malloc - 使用O_DIRECT参数open一个文件并读写

    听说使用odirect参数打开文件时能够以扇区的单位进行读写. 于是open了一个块设备文件/dev/sdo,当然还要带上读写参数O_RDWR 然后进行读写时出错了. 找了一会发现问题根本在于读写的b ...

  7. 用Backbone.js创建一个联系人管理系统(一)

    原文 Build a Contacts Manager Using Backbone.js: Part 1 在这个教程里我们将会使用Backbone.js,Underscore.js,JQuery创建 ...

  8. [MySQL]load data local infile向MySQL数据库中导入数据时,无法导入和字段不分离问题。

    利用load data将文件中的数据导入数据库表中的时候,遇到了两个问题. 首先是load data命令无法执行的问题: 命令行下输入load data local infile "path ...

  9. js控制控件不可编辑

    js 页面加载执行 function Isedit() { //document.getElementById("SyTxtBox23_DataControl").disabled ...

  10. 2006Jam的计数法

    题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用 ...