Android开发Camera我认为分为2种,
1. 重写Camera添加自己的元素,之前看过一个重写Camera的资料,是这么说的,根据欧标拍照必须有声音,防止偷拍,然后他就说为了开发一种能够偷拍的Android终端软件,重写Camera后将拍照键设置为截屏的操作就没有声音了,但是现在鱼目混杂的Android终端市场,很多手机拍照都没有声音喽;重写Camera还可以仿照美颜相机开发一款自己的相机;是不是学过数字图像处理 文字识别的我该自己给自己写一个Camera软件,待我有好的idea的时候就是干这件事的时候了;
2. 最简单的方法,使用 MediaStore.ACTION_IMAGE_CAPTURE 动作触发一个Intent:
startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE),TAKE_PICTURE);
这将启动一个Camera应用程序来拍摄照片,不需要重写原声Camera应用程序(方法1),就可为用户提供全套的摄像头功能。用户对拍摄照片满意后,该照片就会通过onActivityResult处理程序收到的Intent返回给应用程序。
默认情况下,拍摄的照片将作为一个缩略图返回,通过返回的Intent的data extra可以访问原始位图。
/**
* 打开相机拍照获取缩略图,不会保存
* */
private void getThumbnail() {
//打开相机拍摄图片选择
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
context.startActivityForResult(intent, CAMERA_REQUEST_CODE);
}
要获得完整图像,必须制定一个用于存储该图像的目标文件,该文件将被编码为一个URI,并在启动Intent中使用MediaStore.EXTRA_OUTPUT extra 传入该URI。
这样摄像头拍摄的完整图像就会被保存到指定位置。Activity结果回调中不会返回缩略图,接收到的Intent的数据将是null;
/**
* 打开相机进行拍照,将拍照得到的图片保存到指定路径,得到原图
* */
protected void getImageSave() {
// create Intent to take a picture and return control to the calling
// application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String fileName = "Temp_camera" + String.valueOf( System.currentTimeMillis()) + ".jpg";
File cropFile = new File( fileDir, fileName);
if(cropFile.exists()){
cropFile.delete();
}
Uri fileUri = Uri.fromFile( cropFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file
// name
mCurrentPhotoPath = fileUri.getPath();
// start the image capture Intent
context.startActivityForResult(intent, CAMERA_REQUEST_CODE);
}
两种情况会在代码中分别体现。
3. 默认情况下,由自己的应用程序创建、并存储在私有应用程序文件中的媒体文件对其他应用程序来说是不可用的。要是这些媒体文件可见,需要把他们插入媒体库中。
Android提供了两种方法:
(1)使用媒体扫描仪来解释文件并将其自动插入。
/**
* 使用媒体扫描仪将文件添加到媒体库中
* */
public static void mediaScan(final String filePath){
MediaScannerConnectionClient mscc = new MediaScannerConnectionClient() {
private MediaScannerConnection msc = null;
{
msc = new MediaScannerConnection(context, this);
msc.connect();
}
@Override
public void onScanCompleted(String arg0, Uri arg1) {
msc.disconnect();
}
@Override
public void onMediaScannerConnected() {
//可以选择指定一个MIME类型,或让 Media Scanner 根据文件名自己假定一种类型
String mimeType = null;
msc.scanFile(filePath, mimeType);
}
};
}
(2)在适当的Content Provider中手动插入一条新纪录。
使用媒体扫描仪几乎总是一种更好的方法。 (摘自Android 4 高级编程(第3版))
注意:如果采用拍照直接保存至本地获取原图,如果打开相机没有拍照而是退出相机,需要删除之前生成的URI。
onActivityResult(int requestCode, int resultCode, Intent data) resultCode=-1 正常拍照,resultCode=0,没拍照直接退出相机。