功能描述:學(xué)校刷卡終端采用android系統(tǒng)啤它,學(xué)生在進(jìn)出學(xué)校時(shí)需要刷卡,刷卡同時(shí)系統(tǒng)自動(dòng)拍照并保存照片舱痘,而拍照保存照片這個(gè)過程學(xué)生并不知曉变骡,也就是后臺(tái)自動(dòng)拍照。
實(shí)現(xiàn)方式:自動(dòng)拍照功能使用系統(tǒng)相機(jī)Camera即可實(shí)現(xiàn)芭逝,但是注意:Android 5.0以下版本和Android 5.0及以上版本的實(shí)現(xiàn)方式不同塌碌,因系統(tǒng)版本為Android 4.4 故采用Android 5.0以下版本的方式實(shí)現(xiàn)。
1. 添加系統(tǒng)權(quán)限旬盯。
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2. 在布局文件中添加SurfaceView, SurfaceView的width和height均設(shè)置為0.1dp,這樣用戶就不能看見相機(jī)了台妆,但是注意一定不能設(shè)置為0dp。
<SurfaceView
android:id="@+id/texture"
android:layout_width="0.1dp"
android:layout_height="0.1dp"
android:layout_alignParentTop="true" />
3. Activity中初始化Camera胖翰,同時(shí)實(shí)現(xiàn)SurfaceHolder.Callback,Camera.PictureCallback兩個(gè)接口接剩。
@Bind(R.id.texture)
SurfaceView texture;
private SurfaceHolder surfaceHolder;
private Camera camera;
private void initCamera() {
surfaceHolder = texture.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.addCallback(this);
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {
if (data != null) {
Bitmap bitmap = Bytes2Bitmap(data);
saveImageToGallery(getApplicationContext(), bitmap);
}
camera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
int cameraNums = Camera.getNumberOfCameras();
L.e("CAMERA_CONTROLL", cameraNums + "");
try {
//我的設(shè)備只有一個(gè)攝像頭,故而直接使用萨咳,若為雙攝像頭懊缺,則需要設(shè)置使用的是前攝像頭還是后攝像頭
camera = Camera.open(0);
} catch (Exception e) {
L.e("CAMERA_CONTROLL", e.getMessage());
}
try {
camera.setPreviewDisplay(holder);
Camera.Parameters parameters = camera.getParameters();
parameters.set("orientation", "portrait");
camera.setDisplayOrientation(90);
parameters.setRotation(90);
camera.setParameters(parameters);
} catch (Exception e) {
// TODO Auto-generated catch block
if (camera != null) {
camera.release();
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if (camera != null) {
camera.stopPreview();
camera.release();
}
}
4. 刷卡事件觸發(fā)立即拍照。
camera.takePicture(null, null, StudentAttendanceActivity.this);
5. Bytes轉(zhuǎn)Bitmap方法某弦。
public Bitmap Bytes2Bitmap(byte[] b) {
L.e("byte length", b.length + "");
if (b.length != 0) {
return BitmapFactory.decodeByteArray(b, 0, b.length);
} else {
return null;
}
}
5. 將拍照的照片命名后保存到系統(tǒng)相冊(cè)目錄下桐汤。
/**
* 保存圖片到本地
*
* @param context
* @param bmp
*/
public void saveImageToGallery(Context context, Bitmap bmp) {
// 首先保存圖片
File appDir = new File(Environment.getExternalStorageDirectory(), AppConstants.FILEDIR);
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = dateStr + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 其次把文件插入到系統(tǒng)圖庫
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
7. Activity退出后釋放資源。
@Override
protected void onDestroy() {
super.onDestroy();
ButterKnife.unbind(this);
if (camera!=null) {
camera.release();
camera = null;
}
}
8. 總結(jié):
后臺(tái)自動(dòng)拍照保存照片功能靶壮,主要在于設(shè)置SurfaceView的width和height均設(shè)置為0.1dp怔毛,則假裝對(duì)用戶不可見,然后設(shè)置拍照觸發(fā)事件腾降,在事件中調(diào)用camera.takePicture方法即可拣度。至于照片保存及照片處理可根據(jù)業(yè)務(wù)需求來確定,由于系統(tǒng)拍照拍出的照片很大,一般都要進(jìn)行壓縮處理抗果。
注: 圖片壓縮工具見我的github項(xiàng)目AndroidUtils 的BitmapCompressor.java 筋帖。同時(shí)AndroidUtils里還有一些其它常用的工具類哦。