您的位置:首页 > 移动开发 > Android开发

android调用系统相机实现拍照功能

2013-10-16 11:25 831 查看

android调用系统相机实现拍照功能

在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题,缩略图照片太小,选择用路径去保存照片。
虽然之前看过android开发的书,但是没有做过东西,这次也是临时决定让我做一个android采集系统的演示程序。拍照是其中一个功能,让网搜索了下拍照有两种方式,其中一种就是调用系统相机实现拍照功能。
启动照相机进行拍照,代码如下:
[java]
view plain
copy

btnCamera.setOnClickListener(new Button.OnClickListener()

{

public void onClick(View v)

{

Intent i = new Intent("android.media.action.IMAGE_CAPTURE");

startActivityForResult(i, Activity.DEFAULT_KEYS_DIALER);

}

});

获取拍照后图片数据,代码如下: [java]
view plain
copy

@Override

protected void onActivityResult(int requestCode,int resultCode,Intent data)

{

switch(resultCode)

{

case RESULT_OK:

super.onActivityResult(requestCode, resultCode, data);

if(data!=null){

Bundle extras = data.getExtras();

Bitmap bmp = (Bitmap) extras.get("data");

ivstorepic.setImageBitmap(bmp); //设置照片现实在界面上

hasShootPic = true;//此变量是在提交数据时,验证是否有图片用

}

else

{

hasShootPic = false;

}

break;

default:

break;

}

}

此时,遇到第一个问题,使用miui系统手机拍照时,无法获取到照片数据,使用Log打印数据之后发现Bitmap bmp = (Bitmap) extras.get("data"); 处出现异常。然后搜索了很多资料,问了很多人,都说这个代码没有问题。但是问题还是要解决,后来想是不是可以把数据存放在SDcard上,然后读取SDcard上数据显示在图形空间上。测试之后发现这样可以实现。其中涉及到的变量定义如下:[java]

view plain
copy

public static final String SDCARD_ROOT_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();//路径

public static final String SAVE_PATH_IN_SDCARD ="/bi.data/";
//图片及其他数据保存文件夹

public static final String IMAGE_CAPTURE_NAME ="cameraTmp.png";
//照片名称

public final staticint REQUEST_CODE_TAKE_PICTURE =
12;//设置拍照操作的标志

启动相机进行拍照,代码如下: [java]
view plain
copy

btnCamera.setOnClickListener(new Button.OnClickListener(){

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

// 存储卡可用 将照片存储在 sdcard

if(SimpleFileTool.isHasSdcard()){

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(SDCARD_ROOT_PATH+

SAVE_PATH_IN_SDCARD,IMAGE_CAPTURE_NAME)));

}

startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);

}

});

获取拍照后图片数据,代码如下:

[java]
view plain
copy

@Override

protected void onActivityResult(int requestCode,int resultCode, Intent data) {

if (resultCode == RESULT_OK) {

if(requestCode == REQUEST_CODE_TAKE_PICTURE){//拍照返回

//存储卡可用

if(isHasSdcard()){

getImage(SDCARD_ROOT_PATH+SAVE_PATH_IN_SDCARD+IMAGE_CAPTURE_NAME);

}

else{

//存储卡不可用直接返回缩略图

Bundle extras = data.getExtras();

bitmap = (Bitmap) extras.get("data");

img.setImageBitmap(bitmap);

img.setVisibility(View.VISIBLE);

hasShootPic = false;

}

}

}

super.onActivityResult(requestCode, resultCode, data);

[java]
view plain
copy

/**

* 检查存储卡是否插入

* @return

*/

public static boolean isHasSdcard()

{

String status = Environment.getExternalStorageState();

if (status.equals(Environment.MEDIA_MOUNTED)){

return true;

} else {

return false;

}

}

[java]
view plain
copy

/* 获得图片 图片高度 最大maxH

* @param imagePath

*/

Bitmap bitmap;

int maxH = 200;//

private void getImage(String imagePath){

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

// 获取这个图片的宽和高

bitmap = BitmapFactory.decodeFile(imagePath, options);
//此时返回bm为空

//计算缩放比

int be = (int)(options.outHeight / (float)maxH);

int ys = options.outHeight % maxH;//求余数

float fe = ys / (float)maxH;

if(fe>=0.5)be = be +1;

if (be <= 0)

be = 1;

options.inSampleSize = be;

//重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false

options.inJustDecodeBounds = false;

bitmap=BitmapFactory.decodeFile(imagePath,options);

img.setImageBitmap(bitmap);

img.setVisibility(View.VISIBLE);

}

以上代码,实现功能实际上是直接把图片存储在SDcard内,然后读取数据现实,后面之所以加上一个直接获取数据返回的代码,是为了兼容一些手机。测试了几款手机后发现可正常,使用也算解决了目前遇到的问题。记录下来,备忘。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: