android 静默拍照功能,Android实现静默拍照功能

本文实例为大家分享了Android实现静默拍照功能的具体代码,供大家参考,具体内容如下

1.申请权限(6.0以后要动态申请)

2.创建相机工具类 CameraPreview:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder mHolder;

private Camera mCamera;

public CameraPreview(Context context, Camera camera) {

super(context);

//初始化Camera对象

mCamera = camera;

//得到SurfaceHolder对象

mHolder = getHolder();

//添加回调,得到Surface的三个声明周期方法

mHolder.addCallback(this);

// deprecated setting, but required on Android versions prior to 3.0

mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

try {

//设置预览方向

mCamera.setDisplayOrientation(90);

//把这个预览效果展示在SurfaceView上面

mCamera.setPreviewDisplay(holder);

//开启预览效果

mCamera.startPreview();

} catch (IOException e) {

// Log.d(TAG, "Error setting camera preview: " + e.getMessage());

}

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

if (holder.getSurface() == null) {

return;

}

//停止预览效果

mCamera.stopPreview();

//重新设置预览效果

try {

mCamera.setPreviewDisplay(mHolder);

} catch (IOException e) {

e.printStackTrace();

}

mCamera.startPreview();

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

}

}

3.创建xml文件 (要想用户无感拍照,可把视图宽高调为0.1dp或者隐藏在别的页面之下):

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/camera_frame"

android:layout_width="match_parent"

android:layout_height="500dp">

4.主类实现静默拍照:

public class CameraActivity extends BaseActivity{

private FrameLayout cameraFrame;

private Camera mCamera;

private TextView cameraTv;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_camera);

cameraFrame = (FrameLayout) findViewById(R.id.camera_frame);

cameraTv = (TextView) findViewById(R.id.camera_tv);

int numberOfCameras = Camera.getNumberOfCameras();// 获取摄像头个数

//遍历摄像头信息

for (int cameraId = 0; cameraId < numberOfCameras; cameraId++) {

Camera.CameraInfo cameraInfo = new Camera.CameraInfo();

Camera.getCameraInfo(cameraId, cameraInfo);

if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//前置摄像头

mCamera = Camera.open(cameraId);//打开摄像头

}

}

CameraPreview mPreview = new CameraPreview(this, mCamera);

cameraFrame.addView(mPreview);

new Thread(new Runnable() {

@Override

public void run() {

try {

Thread.sleep(1000); // 设置1秒后自动拍照,可调节

//得到照相机的参数

Camera.Parameters parameters = mCamera.getParameters();

//图片的格式

parameters.setPictureFormat(ImageFormat.JPEG);

//预览的大小是多少

parameters.setPreviewSize(800, 400);

//设置对焦模式,自动对焦

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

//对焦成功后,自动拍照

mCamera.autoFocus(new Camera.AutoFocusCallback() {

@Override

public void onAutoFocus(boolean success, Camera camera) {

if (success) {

//获取照片

mCamera.takePicture(null, null, mPictureCallback);

}

}

});

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}).start();

});

}

@Override

protected void onStart() {

super.onStart();

}

//获取照片中的接口回调

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {

@Override

public void onPictureTaken(byte[] data, Camera camera) {

FileOutputStream fos = null;

String mFilePath = Environment.getExternalStorageDirectory().getPath() + File.separator + "tt005.png";

//文件

File tempFile = new File(mFilePath);

try {

//

fos = new FileOutputStream(tempFile);

fos.write(data);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

//实现连续拍多张的效果

// mCamera.startPreview();

// if (fos != null) {

// try {

// fos.close();

// } catch (IOException e) {

// e.printStackTrace();

// }

// }

}

}

};

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值