Android调用系统相机拍照并保存图片文件

调用系统相机拍照并保存图片文件,首先我们需要在配置文件中声明权限如下:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.CAMERA"/>

然后是调用相机拍照,下面给出了两种获取拍照后的图片的方法,主要代码如下:

package com.example.textcamera;

import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
	// 调用相机拍照的请求码
	public static final int REQUEST_TAKE_PHOTO_CODE = 1;
	public static final int REQUEST_TAKE_PHOTO_CODE2 = 2;
	// 拍照后显示图片的ImageView
	private ImageView imageView;
	// 保存图片的文件
	private File imageFile;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		imageView = (ImageView) findViewById(R.id.imageview);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		// 拍照后获取返回值,这里获取到的是原始图片
		if (requestCode == REQUEST_TAKE_PHOTO_CODE
				&& resultCode == Activity.RESULT_OK) {
			// 获取到了拍照后的图片文件,从文件解码出Bitmap对象
			if (imageFile.exists()) {
				// 这里直接decode了图片,没有判断图片大小,没有对可能出现的OOM做处理
				Bitmap bm = BitmapFactory.decodeFile(imageFile
						.getAbsolutePath());
				// 显示图片
				imageView.setImageBitmap(bm);
			} else {
				Toast.makeText(this, "图片文件不存在", Toast.LENGTH_SHORT).show();
			}
		}else if(requestCode == REQUEST_TAKE_PHOTO_CODE2
				&& resultCode == Activity.RESULT_OK){
			//这里获取到的是缩放后的图片,不是原始图片
			Bundle b = data.getExtras();
			if(b != null){
				Bitmap bm = (Bitmap) b.get("data");
				if(bm != null){
					imageView.setImageBitmap(bm);
				}
			}else{
				Toast.makeText(this, "没有获取数据", Toast.LENGTH_SHORT).show();
			}
		}
	}

	/**
	 * 判断是否有SD卡
	 * 
	 * @return 有SD卡返回true,否则false
	 */
	private boolean hasSDCard() {
		// 获取外部存储的状态
		String state = Environment.getExternalStorageState();
		if (Environment.MEDIA_MOUNTED.equals(state)) {
			// 有SD卡
			return true;
		}
		return false;
	}

	/**
	 * 初始化存储图片的文件
	 * 
	 * @return 初始化成功返回true,否则false
	 */
	private boolean initImageFile() {
		// 有SD卡时才初始化文件
		if (hasSDCard()) {
			// 构造存储图片的文件的路径,文件名为当前时间
			String filePath = Environment.getExternalStorageDirectory()
					.getAbsolutePath()
					+ "/"
					+ System.currentTimeMillis()
					+ ".png";
			imageFile = new File(filePath);
			if (!imageFile.exists()) {// 如果文件不存在,就创建文件
				try {
					imageFile.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			return true;
		}
		return false;
	}

	/**
	 * 跳转到系统相机拍照
	 */
	private void startTakePhoto() {
		// 启动系统相机
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		// 设置拍照后保存的图片存储在文件中
		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
		// 启动activity并获取返回数据
		startActivityForResult(intent, REQUEST_TAKE_PHOTO_CODE);
	}

	private void startTakePhoto2() {
		// 启动系统相机
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		// 启动activity并获取返回数据
		startActivityForResult(intent, REQUEST_TAKE_PHOTO_CODE2);
	}

	// 点击按钮后调用相机拍照
	public void btnclick(View view) {
		// 如果初始化文件成功,则调用相机
		if (initImageFile()) {
			//下面用第一种方式获取图片,还可以调用startTakePhoto2()方法获取图片
			startTakePhoto();
//			startTakePhoto2();
		} else {
			Toast.makeText(this, "初始化文件失败,无法调用相机拍照!", Toast.LENGTH_SHORT)
					.show();
		}
	}

}

上面的代码比较少,详细注释都写了,就不做更多的解释了。

另外,布局文件比较简单,就是一个Button和一个ImageView,这里就不上布局文件了,直接上运行截图(这里是使用第一种方法获取图片的截图,使用第二种方法获取的图片比这种要小):



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yubo_725

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值