调用系统相机和图库册得到图片的例子

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值