通过Camera进行拍照
16lz
2021-01-24
Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可:
下面用一个示例来演示:
Activity:
package com.home.activity;import java.io.File;import java.io.FileOutputStream;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.res.Configuration;import android.graphics.Bitmap;import android.graphics.Bitmap.CompressFormat;import android.graphics.BitmapFactory;import android.graphics.PixelFormat;import android.hardware.Camera;import android.hardware.Camera.Parameters;import android.hardware.Camera.PictureCallback;import android.os.Bundle;import android.os.Environment;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.view.WindowManager;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import com.home.camera.R;public class TestCameraActivity extends Activity {private SurfaceView sView;private SurfaceHolder sHolder;// 屏幕宽和高private int screenWidth, screenHeight;// 定义系统所用的照相机private Camera camera;// 摄像头是否已经在预览状态. true:预览状态 ;false:没有预览状态private boolean isPreview;private Button playBtn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 设置全屏requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentView(R.layout.main);WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);// 获取屏幕的宽和高screenWidth = wm.getDefaultDisplay().getWidth();screenHeight = wm.getDefaultDisplay().getHeight();playBtn = (Button) findViewById(R.id.main_btn);// 获取界面中的SurfaceView组件sView = (SurfaceView) findViewById(R.id.main_sView);// 获取SurfaceView的SurfaceHoldersHolder = sView.getHolder();// 为sHolder添加一个回调监听器sHolder.addCallback(new Callback() {@Overridepublic void surfaceChanged(SurfaceHolder holder, int format,int width, int height) {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// 打开并初始化摄像头initCamera();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// 如果camera不为null,释放摄像头if (camera != null) {if (isPreview) {camera.stopPreview();camera.release();camera = null;}}}});// 设置SurfaceView自己不维护缓冲区sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}/** * 初始化摄像头 */private void initCamera() {if (!isPreview) {camera = Camera.open();}if (camera != null && !isPreview) {try {Parameters parameters = camera.getParameters();// 设置闪光灯为自动状态parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);camera.setParameters(parameters);// 设置预览照片的大小parameters.setPreviewSize(screenWidth, screenHeight);// 设置每秒显示4帧parameters.setPreviewFrameRate(4);// 设置图片格式parameters.setPictureFormat(PixelFormat.JPEG);// 设置JPG照片的质量parameters.set("jpeg-quality", 85);// 设置照片大小parameters.setPictureSize(screenWidth, screenHeight);// 通过SurfaceView显示取景画面camera.setPreviewDisplay(sHolder);// 如果是竖屏if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {camera.setDisplayOrientation(90);} else {camera.setDisplayOrientation(0);}// 开始预览camera.startPreview();// 自动对焦camera.autoFocus(null);isPreview = true;} catch (Exception e) {e.printStackTrace();}}playBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (camera != null) {// 拍照camera.takePicture(null, null, myjpegCallback);}}});}PictureCallback myjpegCallback = new PictureCallback() {@Overridepublic void onPictureTaken(final byte[] data, Camera camera) {// 根据拍照所得的数据创建位图final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,data.length);// 加载save.xml文件对应的布局资源View saveDialog = getLayoutInflater().inflate(R.layout.save, null);final EditText photoName = (EditText) saveDialog.findViewById(R.id.save_et_name);ImageView showView = (ImageView) saveDialog.findViewById(R.id.save_image);// 显示刚刚拍得的照片showView.setImageBitmap(bitmap);// 使用对话框显示saveDialog组件new AlertDialog.Builder(TestCameraActivity.this).setView(saveDialog).setPositiveButton("保存",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {// 创建一个位于SD卡上的文件File file = new File(Environment.getExternalStorageDirectory(),photoName.getText().toString()+ ".jpg");FileOutputStream outStream = null;try {// 打开指定文件对应的输出流outStream = new FileOutputStream(file);// 把位图输出到指定文件中bitmap.compress(CompressFormat.JPEG,100, outStream);outStream.close();} catch (Exception e) {e.printStackTrace();}}}).setNegativeButton("取消", null).show();// 重新预览camera.stopPreview();camera.startPreview();isPreview = true;}};}
Activity的布局XML就一个拍照按钮和SurfaceView组件,就此省略
对话框的布局XML:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="输入照片名称" /> <EditText android:id="@+id/save_et_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:singleLine="true" /> </LinearLayout> <ImageView android:id="@+id/save_image" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
加上如下权限:
<!-- 写入外部存储卡的权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 加入拍照权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 加入摄像头的附加功能 --> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <!-- 加入闪光灯权限 --> <uses-permission android:name="android.permission.FLASHLIGHT" />
另外,拍照按钮也可以使用手机上的快捷键,回调OnKeyDown()方法既可。
更多相关文章
- 超简单实现Android(安卓)屏幕截屏(需要系统级权限)
- My Android(安卓)Camera Notes
- Android(安卓)的权限设置大全
- Android(安卓)蓝牙操作--读取远程已配对的蓝牙设备
- android 定时熄屏
- Android(安卓)程序的安装、卸载和更新
- Android(安卓)NotificationListenerService监听获取通知栏通知和
- 使用ContentProvider管理照片
- Android7.0调用系统相机和裁剪