android调用系统相机实现拍照功能
2014-03-30 22:22
731 查看
在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题。
虽然之前看过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 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;
}
}
[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内,然后读取数据现实,后面之所以加上一个直接获取数据返回的代码,是为了兼容一些手机。测试了几款手机后发现可正常,使用也算解决了目前遇到的问题。记录下来,备忘。
虽然之前看过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 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;
}
}
[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内,然后读取数据现实,后面之所以加上一个直接获取数据返回的代码,是为了兼容一些手机。测试了几款手机后发现可正常,使用也算解决了目前遇到的问题。记录下来,备忘。
相关文章推荐
- Android调用系统相机拍照,并且模仿实现水印相机简单功能
- Android调用系统相机拍照,并且模仿实现水印相机简单功能
- Android学习之调用系统相机实现拍照功能
- Android调用系统相机拍照,并且模仿实现水印相机简单功能
- android调用系统相机实现拍照功能
- Android学习之调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- Android调用系统相机拍照,并且模仿实现水印相机简单功能
- android调用系统相机实现拍照功能
- android调用系统相机实现拍照功能
- Android调用系统相机,相册,并实现图片剪裁功能
- android studio 适配android7.0 android 6.0拍照调用系统裁剪工具实现头像上传功能
- Android使用系统自带的相机实现一键拍照功能
- Android调用系统相机以及拉取本地相册的功能实现以及代码分析
- Android开发学习之调用系统相机完成拍照的实现
- Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题
- Android 实现调用系统照相机拍照和录像的功能
- Android调用系统相机拍照并保存到SD卡的两种实现方式