在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题。
虽然之前看过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);
-
}
-
});
-
@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;
-
}
-
-
}
-
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 static int 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(newFile(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;
-
}
-
}
-
/* 获得图片 图片高度 最大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内,然后读取数据现实,后面之所以加上一个直接获取数据返回的代码,是为了兼容一些手机。测试了几款手机后发现可正常,使用也算解决了目前遇到的问题。记录下来,备忘。