在App中使用Camera的两种方式
- 调用系统相机、或者是具有相机功能的应用
- 自定义相机
调用系统相机
调用系统相机很简单,直接只用Intent就可以了
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
不过这种调用方式,主导权全在系统相机里,也无法获得相机所拍的照片。所以可简单调整下,使用startActivityForResult的方式调用,然后在onActivityResult中接收数据。
public static final int REQ_1 = 1;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQ_1);
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if(requestCode == REQ_1){
//为防止数据溢出,该data返回的是缩略图
Bundle bundle = data.getExtras();//包含相机返回的照片的二进制流
Bitmap bitmap = (Bitmap) bundle.get("data");
img.setImageBitmap(bitmap);
}
}
}
因为Bitmap数据过大,所以Android系统为了防止数据溢出,返回的data是个缩略图。如果想获得原图,可修改照片存放到指定路径,然后直接获取SD下的图片。
public static final int REQ_2 = 2;
private String filePath;
filePath = Environment.getExternalStorageDirectory().getPath();
filePath = filePath + "/" + "temp.png";
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri photoUri = Uri.fromFile(new File(filePath));
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);//将系统拍的照片,存放到自定路径
startActivityForResult(intent, REQ_2);
//在onActivityResult中处理
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
Bitmap bitmap = BitmapFactory.decodeStream(fis);
img.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
使用这种方式获取SD图片时,有可能因为Bitmap过大而出现异常,可以根据需要将Bitmap压缩下。
FileInputStream is = null;Bitmap bitmap = null;
BufferedInputStream bis = null;
try {
is = new FileInputStream(filePath);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;//长宽都调为原来的1/2
bis = new BufferedInputStream(is);
bitmap = BitmapFactory.decodeStream(bis, null, options);
img.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
is.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}