package com.example.takepicture;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import com.example.mydemo.R;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.util.Base64;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
/**
* 使用摄像机 或者调用系统自带的图片,给自己的头像设置不同的图片
* 注意:这里启动了3个不同的startActivityForResult
*/
public class TakePic extends Activity {
private static final int CAMERA_REQUEST_CODE = 2;
private static final int IMAGE_REQUEST_CODE = 1;
private static final int RESULT_REQUEST_CODE = 3;
private static final String IMAGE_FILE_NAME = "faceImage.JPEG";
private Bitmap photo;// 暂存图片
private ImageView ivuserImg; // 头像
private File f;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_takepicture);
ivuserImg = (ImageView) findViewById(R.id.iv_userimg);
f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +"hemiy_pic.jpg");
if(f.exists()){
ivuserImg.setImageURI(Uri.fromFile(f));
}else{
ivuserImg.setImageResource(R.drawable.ic_launcher);
}
}
// 使用系统相机进行拍照
public void get(View view) {
Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
try {
File file = new File(Environment.getExternalStorageDirectory()
+ "/DCIM/camera/", IMAGE_FILE_NAME);
Uri imageUri = Uri.fromFile(file);//拍照时,将拍得的照片先保存在本地
intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentFromCapture, CAMERA_REQUEST_CODE);
} catch (Exception e) {
e.printStackTrace();
}
}
// 选择系统里面自带的图片
public void select(View view) {
Intent intentFromGallery = new Intent(Intent.ACTION_GET_CONTENT);
intentFromGallery.addCategory(Intent.CATEGORY_OPENABLE);
intentFromGallery.setType("image/**"); // 设置文件类型
startActivityForResult(intentFromGallery, IMAGE_REQUEST_CODE);
}
//默认情况下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
//照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图。如果想访问原始图片,可以通过data extra能够得到原始图片位置。
//即,如果指定了目标uri,data就没有数据,如果没有指定uri,则data就返回有数据
//http://blog.csdn.net/zimo2013/article/details/16916279
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != 0) {
switch (requestCode) {
// 这个是选择图片的请求码
case IMAGE_REQUEST_CODE:
startPhotoZoom(data.getData());
break;
// 这个是拍照的请求码
case CAMERA_REQUEST_CODE:
// 先查看是否有外存储卡
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File tempFile = new File(
Environment.getExternalStorageDirectory()
+ "/DCIM/camera/" + IMAGE_FILE_NAME);
startPhotoZoom(Uri.fromFile(tempFile));//拍照时,将拍得的照片先保存在本地
} else {
Toast.makeText(getApplicationContext(), "未找到存储卡,无法存储照片!",
Toast.LENGTH_LONG).show();
}
break;
case RESULT_REQUEST_CODE:
if (data != null) {
getImageToView(data);
}
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
// 把裁剪后的图片,展示到控件上
private void getImageToView(Intent data) {
if(data.getDataString()==null){ //这里是拿不到数据的,因为为空
System.out.println("是null");
}else{
System.out.println("不是是null");
}
Bundle extras = data.getExtras();
if (null != extras) {
photo = extras.getParcelable("data");
ivuserImg.setImageBitmap(photo);//给控件添加选择后的图片,而且这个图片是压缩过的
System.out.println("程序执行了");
//这里得到图片的存储路径
//如 path==/mnt/sdcard/DCIM/camera/faceImage.JPEG
FileOutputStream out=null;
//这里以后保存了图片后,要保存到外存中
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
try {
//这个是自己保存一份到外存,方便下次读取图像图片
f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +"hemiy_pic.jpg");
if (!f.exists()) {
f.createNewFile();
}
out=new FileOutputStream(f);
photo.compress(CompressFormat.JPEG, 80, out);
//photo.recycle(); //加上这句图片会变黑
//encodePicToBase64(f);
//还要把图片上传到服务端去保存,保持系统的一致性
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private void encodePicToBase64(File f2) throws IOException {
//把文件变成字符串
InputStream in = new FileInputStream(f2);
byte[] buf =new byte[(int)f2.length()];
in.read(buf);
in.close();
String str= Base64.encodeToString(buf, Base64.DEFAULT);
// System.out.println("base64的编码"+str);
//解析图片,把字符串变成图片
byte[] byt= Base64.decode(str, Base64.DEFAULT);
//下面这个是解码base64后,得到的文件
//也就是说,sd卡下会有2个叫hemiy的图片,注意要加后缀,否则不能查看文件
File newFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +"hemiy_Base84");
OutputStream out=new FileOutputStream(newFile);
out.write(byt);
out.close();
}
/**
* 裁剪图片方法实现
* @param uri
*/
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);
intent.putExtra("outputX", 320);
intent.putExtra("outputY", 320);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
System.out.println("" + uri);
System.out.println("path==" + uri.getPath());//得到图片的文件路径: path==/mnt/sdcard/Share.jp
startActivityForResult(intent, RESULT_REQUEST_CODE);
}
}
上面代码是调用系统图册和相机,获取图片的demo
// 使用系统相机进行拍照
public void get(View view) {
Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
try {
File file = new File(Environment.getExternalStorageDirectory()
+ "/DCIM/camera/", IMAGE_FILE_NAME);
Uri imageUri = Uri.fromFile(file);//然后到时照片就会保存到你指定的那个路径的IMAGE_FILE_NAME文件了.
intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentFromCapture, CAMERA_REQUEST_CODE);
} catch (Exception e) {
e.printStackTrace();
}
}
注意这里,指定了拍照的存储图片路径,所以在onActivityResult(int requestCode, int resultCode, Intent data)代码中得到的dat为null
默认情况下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图。如果想访问原始图片,可以通过data extra能够得到原始图片位置。即,如果指定了目标uri,data就没有数据,如果没有指定uri,则data就返回有数据!数据表明,93%的机型的data 将会是Null,所以如果我们指定了路径,就不要使用data 来获取照片,起码在使用前要做空判断)
所以
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != 0) {
switch (requestCode) {
// 这个是选择图片的请求码
case IMAGE_REQUEST_CODE:
startPhotoZoom(data.getData()); //这里使用data,就是intent获取uri
break;
// 这个是拍照的请求码
case CAMERA_REQUEST_CODE:
// 先查看是否有外存储卡
<span style="white-space:pre"> </span>if (Environment.getExternalStorageState().equals(
<span style="white-space:pre"> </span>Environment.MEDIA_MOUNTED)) {
<span style="white-space:pre"> </span> File tempFile = new File(Environment.getExternalStorageDirectory()+ "/DCIM/camera/" + IMAGE_FILE_NAME);
<span style="white-space:pre"> </span>startPhotoZoom(Uri.fromFile(tempFile));///注意!!!!!!这里直接使用Uri,没有使用intent,因为指定了拍照位置,返回的intent就为空
break;
}
参考文章
http://blog.csdn.net/zimo2013/article/details/16916279