前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android手机拍照

Android手机拍照

作者头像
用户1215536
发布2018-02-05 15:11:10
1.2K0
发布2018-02-05 15:11:10
举报

参考:

视频教程:http://v.youku.com/v_show/id_XNjI5MzkzMjQ4.html

官方API档file:///D:/Android/androidstudio/sdk/docs/guide/topics/media/camera.html

java程序

代码语言:javascript
复制
  1 package com.example.x_yp.system_camera;
  2 
  3 
  4 import java.io.File;
  5 import java.io.FileOutputStream;
  6 
  7 import android.os.Bundle;
  8 import android.util.Log;
  9 import android.view.View;
 10 import android.widget.Button;
 11 import android.widget.FrameLayout;
 12 import android.app.Activity;
 13 import android.content.Context;
 14 import android.content.pm.PackageManager;
 15 import android.hardware.Camera;
 16 import android.hardware.Camera.AutoFocusCallback;
 17 import android.hardware.Camera.PictureCallback;
 18 
 19 public class MainActivity extends Activity {
 20     protected static final String TAG = "main";
 21     private Camera mCamera;
 22     private CameraPreview mPreview;
 23     @Override
 24     protected void onCreate(Bundle savedInstanceState) {
 25         super.onCreate(savedInstanceState);
 26         setContentView(R.layout.activity_main);
 27 
 28         mCamera = getCameraInstance();
 29 
 30         // 创建预览类,并与Camera关联,最后添加到界面布局中
 31         mPreview = new CameraPreview(this, mCamera);
 32         FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
 33         preview.addView(mPreview);
 34 
 35 
 36         Button captureButton = (Button) findViewById(R.id.button_capture);
 37         captureButton.setOnClickListener(new View.OnClickListener() {
 38             @Override
 39             public void onClick(View v) {
 40                 // 在捕获图片前进行自动对焦
 41                 mCamera.autoFocus(new AutoFocusCallback() {
 42                     
 43                     @Override
 44                     public void onAutoFocus(boolean success, Camera camera) {
 45                         // 从Camera捕获图片
 46                         mCamera.takePicture(null, null, mPicture);
 47                     }
 48                 });                
 49             }
 50         });
 51     }
 52 
 53     /** 检测设备是否存在Camera硬件 */
 54     private boolean checkCameraHardware(Context context) {
 55         if (context.getPackageManager().hasSystemFeature(
 56                 PackageManager.FEATURE_CAMERA)) {
 57             // 存在
 58             return true;
 59         } else {
 60             // 不存在
 61             return false;
 62         }
 63     }
 64 
 65     /** 打开一个Camera */
 66     public static Camera getCameraInstance() {
 67         Camera c = null;
 68         try {
 69             c = Camera.open(); 
 70         } catch (Exception e) {
 71             Log.d(TAG, "打开Camera失败失败");
 72         }
 73         return c; 
 74     }
 75 
 76     private PictureCallback mPicture = new PictureCallback() {
 77 
 78         @Override
 79         public void onPictureTaken(byte[] data, Camera camera) {
 80             // 获取Jpeg图片,并保存在sd卡上
 81             File pictureFile = new File("/sdcard/" + System.currentTimeMillis() + ".jpg");
 82             try {
 83                 FileOutputStream fos = new FileOutputStream(pictureFile);
 84                 fos.write(data);
 85                 fos.close();
 86             } catch (Exception e) {
 87                 Log.d(TAG, "保存图片失败");
 88             }
 89         }
 90     };
 91 
 92     @Override
 93     protected void onDestroy() {
 94         // 回收Camera资源
 95         if(mCamera!=null){
 96             mCamera.stopPreview();
 97             mCamera.release();
 98             mCamera=null;
 99         }
100         super.onDestroy();
101     }
102     
103 }
代码语言:javascript
复制
package com.example.x_yp.system_camera;
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * 定义一个预览类
 */
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = "main";
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;

        // 通过SurfaceView获得SurfaceHolder
        mHolder = getHolder();
        // 为SurfaceHolder指定回调
        mHolder.addCallback(this);
        // 设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到界面 在Android3.0之后弃用
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // 当Surface被创建之后,开始Camera的预览
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "预览失败");
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // Surface发生改变的时候将被调用,第一次显示到界面的时候也会被调用
        if (mHolder.getSurface() == null){
          // 如果Surface为空,不继续操作
          return;
        }

        // 停止Camera的预览
        try {
            mCamera.stopPreview();
        } catch (Exception e){
            Log.d(TAG, "当Surface改变后,停止预览出错");
        }

        // 在预览前可以指定Camera的各项参数

        // 重新开始预览
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception e){
            Log.d(TAG, "预览Camera出错");
        }
    }
}

 布局文件

代码语言:javascript
复制
<?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>

权限设置

代码语言:javascript
复制
 <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档