Android开发: 调用Camera API 创建Camera
16lz
2021-01-23
steps to follow to create your own camera using camera API, 1. add permission to AndroidManifest.xml to get the camera hardware resource and save picture into SD card, < uses-permission android:name = "android.permission.CAMERA" /> < uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" /> AndroidManifest.xml
- <? xml version= "1.0" encoding = "utf-8"?>
- < manifest xmlns:android ="http://schemas.android.com/apk/res/android"
- package= "android.study.sample"
- android:versionCode= "1"
- android:versionName= "1.0" >
- <uses-sdk android:minSdkVersion= "15" />
- <uses-permission android:name= "android.permission.CAMERA" />
- <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" />
- <application
- android:icon ="@drawable/ic_launcher"
- android:label ="@string/app_name" >
- < activity android:name =".CameraActivity"
- android:label ="@string/app_name"
- android:screenOrientation ="landscape" >
- < intent-filter>
- < action android:name ="android.intent.action.MAIN" />
- < category android:name ="android.intent.category.LAUNCHER" />
- intent-filter>
- activity>
- application >
- manifest>
2. set a preview layout and button in your camera UI to control camera res/layout/main.xml
- <? xml version= "1.0" encoding = "utf-8"?>
- < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
- android:orientation= "horizontal"
- android:layout_width= "fill_parent"
- android:layout_height= "fill_parent"
- >
- <FrameLayout
- android:id= "@+id/camera_preview"
- android:layout_width= "fill_parent"
- android:layout_height= "fill_parent"
- android:layout_weight= "1"
- />
- <Button
- android:id= "@+id/button_capture"
- android:text= "Capture"
- android:layout_width= "wrap_content"
- android:layout_height= "wrap_content"
- android:layout_gravity= "center"
- />
- LinearLayout>
3.implement your a surfaceView for your own camera to preview the live p_w_picpath before taking a picture android.study.sample.CameraPreview.java
- package android.study.sample;
- import java.io.IOException;
- import android.content.Context;
- import android.hardware.Camera;
- import android.util.Log;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- /** A basic Camera preview class */
- public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
- private SurfaceHolder mHolder;
- private Camera mCamera;
- String TAG= "CAMERAAPI";
- public CameraPreview(Context context, Camera camera) {
- super (context);
- mCamera = camera;
- // Install a SurfaceHolder.Callback so we get notified when the
- // underlying surface is created and destroyed.
- mHolder = getHolder();
- mHolder.addCallback( this );
- // deprecated setting, but required on Android versions prior to 3.0
- mHolder. setType(SurfaceHolder. SURFACE_TYPE_PUSH_BUFFERS);
- }
- public void surfaceCreated(SurfaceHolder holder) {
- // The Surface has been created, now tell the camera where to draw the preview.
- try {
- mCamera.setPreviewDisplay(holder);
- mCamera.startPreview();
- } catch (IOException e) {
- Log. d( TAG, "Error setting camera preview: " + e.getMessage());
- }
- }
- public void surfaceDestroyed(SurfaceHolder holder) {
- // empty. Take care of releasing the Camera preview in your activity.
- }
- public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
- // If your preview can change or rotate, take care of those events here.
- // Make sure to stop the preview before resizing or reformatting it.
- if (mHolder .getSurface() == null){
- // preview surface does not exist
- return ;
- }
- // stop preview before making changes
- try {
- mCamera.stopPreview();
- } catch (Exception e){
- // ignore: tried to stop a non-existent preview
- }
- // set preview size and make any resize, rotate or
- // reformatting changes here
- // start preview with new settings
- try {
- mCamera.setPreviewDisplay( mHolder);
- mCamera.startPreview();
- } catch (Exception e){
- Log. d( TAG, "Error starting camera preview: " + e.getMessage());
- }
- }
- }
4.build your CameraActivity to start the camera app
get an camera available , add this camera to the surfaceview of the screen layout, listen for the User action, If user click to Copture button, call camera to take a picture, and save p_w_picpath into the SD card, this is implemented by th e PictureCallback method set to Camera.takePicture()android.study.sample.CameraActivity.java
5. when open the app, UI display like below ,
- package android.study.sample;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import android.app.Activity;
- import android.hardware.Camera;
- import android.hardware.Camera.PictureCallback;
- import android.os.Bundle;
- import android.os.Environment;
- import android.study.sample.R.id;
- import android.util.Log;
- import android.view.View;
- import android.widget.Button;
- import android.widget.FrameLayout;
- public class CameraActivity extends Activity {
- public static final int MEDIA_TYPE_IMAGE = 1;
- public static final int MEDIA_TYPE_VIDEO = 2;
- private Camera mCamera;
- private CameraPreview mPreview;
- String TAG= "CAMERAAPI";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super .onCreate(savedInstanceState);
- setContentView(R.layout. main );
- // Create an instance of Camera
- mCamera = getCameraInstance();
- // Create our Preview view and set it as the content of our activity.
- mPreview = new CameraPreview( this, mCamera);
- FrameLayout preview = (FrameLayout) findViewById(R.id. camera_preview );
- preview.addView( mPreview);
- Button captureButton = (Button) findViewById(id. button_capture );
- captureButton.setOnClickListener( new CaptureButtonOnClickListener());
- }
- public class CaptureButtonOnClickListener implements View.OnClickListener{
- public void onClick(View v) {
- PictureCallback mPicture = new CameraPictureCallBack();
- mCamera.takePicture( null , null , mPicture);
- }
- }
- /** A safe way to get an instance of the Camera object. */
- public static Camera getCameraInstance(){
- Camera c = null ;
- try {
- c = Camera. open(); // attempt to get a Camera instance
- }
- catch (Exception e){
- // Camera is not available (in use or does not exist)
- }
- return c; // returns null if camera is unavailable
- }
- public class CameraPictureCallBack implements PictureCallback{
- public void onPictureTaken( byte[] data, Camera camera) {
- File pictureFile = getOutputMediaFile( MEDIA_TYPE_IMAGE);
- if (pictureFile == null){
- Log. d( TAG, "Error creating media file, check storage permissions!");
- return ;
- }
- try {
- FileOutputStream fos = new FileOutputStream(pictureFile);
- fos.write(data);
- fos.close();
- } catch (FileNotFoundException e) {
- Log. d( TAG, "File not found: " + e.getMessage());
- } catch (IOException e) {
- Log. d( TAG, "Error accessing file: " + e.getMessage());
- }
- }
- }
- /** Create a File for saving an p_w_picpath or video */
- private static File getOutputMediaFile( int type){
- // To be safe, you should check that the SDCard is mounted
- // using Environment.getExternalStorageState() before doing this.
- File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
- Environment. DIRECTORY_PICTURES ), "MyCameraApp" );
- // This location works best if you want the created p_w_picpaths to be shared
- // between applications and persist after your app has been uninstalled.
- // Create the storage directory if it does not exist
- if (! mediaStorageDir.exists()){
- if (! mediaStorageDir.mkdirs()){
- Log. d( "MyCameraApp", "failed to create directory" );
- return null ;
- }
- }
- // Create a media file name
- String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss" ).format( new Date());
- File mediaFile;
- if (type == MEDIA_TYPE_IMAGE){
- mediaFile = new File(mediaStorageDir.getPath() + File. separator +
- "IMG_" + timeStamp + ".jpg" );
- } else if (type == MEDIA_TYPE_VIDEO) {
- mediaFile = new File(mediaStorageDir.getPath() + File. separator +
- "VID_" + timeStamp + ".mp4" );
- } else {
- return null ;
- }
- return mediaFile;
- }
- @Override
- protected void onPause() {
- super .onPause();
- releaseCamera(); // release the camera immediately on pause event
- }
- private void releaseCamera(){
- if (mCamera != null){
- mCamera.release(); // release the camera for other applications
- mCamera = null ;
- }
- }
- }
更多相关文章
- android checkbox 定制(修改checkbox 的图片)
- 【Android】简单图片浏览器
- android图像处理系列之三--图片色调饱和度、色相、亮度处理
- Android使用xml自定义图片
- Android 图片缩放与旋转
- android 获取图片
- android 读取,写入图片到sd卡源码
- Android 图片缩放