zoukankan      html  css  js  c++  java
  • Android下相机的调用

    Android下相机的调用

          Android下相机的调用分别为调用系统相机和Building a Camera App两种用法;

    一、调用系统相机

    1.MainActivity.java文件

     1 package com.example.takephoto;
     2 
     3 import java.io.File;
     4 
     5 import android.net.Uri;
     6 import android.os.Bundle;
     7 import android.provider.MediaStore;
     8 import android.app.Activity;
     9 import android.content.Intent;
    10 import android.view.Menu;
    11 import android.view.View;
    12 import android.view.View.OnClickListener;
    13 import android.widget.Button;
    14 import android.media.*;
    15 
    16 public class MainActivity extends Activity {
    17     private Button button;
    18     
    19 
    20     @Override
    21     protected void onCreate(Bundle savedInstanceState) {
    22         super.onCreate(savedInstanceState);
    23         setContentView(R.layout.activity_main);
    24         
    25         button=(Button)findViewById(R.id.button1);
    26         button.setOnClickListener(new View.OnClickListener() {
    27             
    28             @Override
    29             public void onClick(View v) {
    30                 // TODO 自动生成的方法存根
    31                 Intent intent=new Intent();
    32                 intent.setAction("android.media.action.IMAGE_CAPTURE");
    33                 intent.addCategory("android.intent.category.DEFAULT");
    34                 File file=new File("/sdcard/0000image.jpg");
    35                 Uri uri=Uri.fromFile(file);
    36                 intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
    37                 startActivity(intent);
    38             }
    39         });
    40         
    41     }
    42 
    43     @Override
    44     public boolean onCreateOptionsMenu(Menu menu) {
    45         // Inflate the menu; this adds items to the action bar if it is present.
    46         getMenuInflater().inflate(R.menu.main, menu);
    47         return true;
    48     }
    49 }

    2.activity_main.xml布局文件

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="wrap_content"
     5     android:paddingBottom="@dimen/activity_vertical_margin"
     6     android:paddingLeft="@dimen/activity_horizontal_margin"
     7     android:paddingRight="@dimen/activity_horizontal_margin"
     8     android:paddingTop="@dimen/activity_vertical_margin"
     9     tools:context=".MainActivity" >
    10 
    11     <Button
    12         android:id="@+id/button1"
    13         android:layout_width="match_parent"
    14         android:layout_height="wrap_content"
    15         android:layout_alignParentLeft="true"
    16         android:layout_alignParentTop="true"
    17         android:layout_marginLeft="73dp"
    18         android:text="拍照" />
    19    
    20 </RelativeLayout>

    3.AndroidManifest.xml文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.example.takephoto"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6 
     7     <uses-sdk
     8         android:minSdkVersion="8"
     9         android:targetSdkVersion="18" />
    10 
    11     <application
    12         android:allowBackup="true"
    13         android:icon="@drawable/ic_launcher"
    14         android:label="@string/app_name"
    15         android:theme="@style/AppTheme" >
    16         <activity
    17             android:name="com.example.takephoto.MainActivity"
    18             android:label="@string/app_name" >
    19             <intent-filter>
    20                 <action android:name="android.intent.action.MAIN" />
    21 
    22                 <category android:name="android.intent.category.LAUNCHER" />
    23             </intent-filter>
    24         </activity>
    25     </application>
    26 
    27 </manifest>

    4.注:因为是调用的系统摄像头进行拍照,系统相机可以自由获取本地文件的存储权限,所以无需在声明权限。

    二、Building a Camera App

    1.MainActivity.java文件

      1 package com.example.takemyphoto;
      2 
      3 import java.io.File;
      4 import java.io.FileNotFoundException;
      5 import java.io.FileOutputStream;
      6 import java.io.IOException;
      7 
      8 import android.os.Bundle;
      9 import android.app.Activity;
     10 import android.content.Context;
     11 import android.content.pm.PackageManager;
     12 import android.hardware.Camera;
     13 import android.hardware.Camera.AutoFocusCallback;
     14 import android.hardware.Camera.PictureCallback;
     15 import android.util.Log;
     16 import android.view.Menu;
     17 import android.view.View;
     18 import android.widget.Button;
     19 import android.widget.FrameLayout;
     20 
     21 public class MainActivity extends Activity {
     22     private Camera mCamera;
     23     private CreamPrivew mPreview;
     24 
     25     @Override
     26     protected void onCreate(Bundle savedInstanceState) {
     27         super.onCreate(savedInstanceState);
     28         setContentView(R.layout.activity_main);
     29         
     30      // Create an instance of Camera
     31         mCamera = getCameraInstance();
     32 
     33         // Create our Preview view and set it as the content of our activity.
     34         mPreview = new CreamPrivew(this, mCamera);
     35         FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
     36         preview.addView(mPreview);
     37         
     38      // Add a listener to the Capture button
     39         Button captureButton = (Button) findViewById(R.id.button_capture);
     40         captureButton.setOnClickListener(
     41             new View.OnClickListener() {
     42                 @Override
     43                 public void onClick(View v) {
     44                     // get an image from the camera
     45                     mCamera.autoFocus(new AutoFocusCallback(){
     46 
     47                         @Override
     48                         public void onAutoFocus(boolean succeed, Camera camera) {
     49                             // TODO 自动生成的方法存根
     50                             mCamera.takePicture(null, null, mPicture);
     51                         }
     52                         
     53                     });
     54                     
     55                 }
     56             }
     57         );
     58         
     59     }
     60    
     61         
     62         /** Check if this device has a camera */
     63         private boolean checkCameraHardware(Context context) {
     64             if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
     65                 // this device has a camera
     66                 return true;
     67             } else {
     68                 // no camera on this device
     69                 return false;
     70             }
     71         }
     72         /** A safe way to get an instance of the Camera object. */
     73         public static Camera getCameraInstance(){
     74             Camera c = null;
     75             try {
     76                 c = Camera.open(); // attempt to get a Camera instance,api9之后支持(1),打开前置摄像机
     77             }
     78             catch (Exception e){
     79                 // Camera is not available (in use or does not exist)
     80             }
     81             return c; // returns null if camera is unavailable
     82         }
     83    
     84 
     85 
     86     @Override
     87     public boolean onCreateOptionsMenu(Menu menu) {
     88         // Inflate the menu; this adds items to the action bar if it is present.
     89         getMenuInflater().inflate(R.menu.main, menu);
     90         return true;
     91     }
     92     private PictureCallback mPicture = new PictureCallback() {
     93 
     94         @Override
     95         public void onPictureTaken(byte[] data, Camera camera) {
     96 
     97             File pictureFile = new File("/scard/"+System.currentTimeMillis()+".jpg");
     98 
     99             try {
    100                 FileOutputStream fos = new FileOutputStream(pictureFile);
    101                 fos.write(data);
    102                 fos.close();
    103             } catch (FileNotFoundException e) {
    104                 Log.d("TAG", "File not found: " + e.getMessage());
    105             } catch (IOException e) {
    106                 Log.d("TAG", "Error accessing file: " + e.getMessage());
    107             }
    108         }
    109     };
    110     public void onDestory(){
    111         if(mCamera!=null){
    112             mCamera.release();
    113             mCamera=null;
    114             
    115         }
    116     }
    117 }

    2.CreamPrivew.java文件

     1 package com.example.takemyphoto;
     2 
     3 import java.io.IOException;
     4 
     5 import android.content.Context;
     6 import android.hardware.Camera;
     7 import android.util.Log;
     8 import android.view.SurfaceHolder;
     9 import android.view.SurfaceView;
    10 
    11 public class CreamPrivew extends SurfaceView implements SurfaceHolder.Callback {
    12     /** A basic Camera preview class */
    13         private SurfaceHolder mHolder;
    14         private Camera mCamera;
    15 
    16         public CreamPrivew(Context context, Camera camera) {
    17             super(context);
    18             mCamera = camera;
    19 
    20             // Install a SurfaceHolder.Callback so we get notified when the
    21             // underlying surface is created and destroyed.
    22             mHolder = getHolder();
    23             mHolder.addCallback(this);
    24             // deprecated setting, but required on Android versions prior to 3.0
    25             mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    26         }
    27 
    28         public void surfaceCreated(SurfaceHolder holder) {
    29             // The Surface has been created, now tell the camera where to draw the preview.
    30             try {
    31                 mCamera.setPreviewDisplay(holder);
    32                 mCamera.startPreview();
    33             } catch (IOException e) {
    34                 Log.d(VIEW_LOG_TAG, "Error setting camera preview: " + e.getMessage());
    35             }
    36         }
    37 
    38         public void surfaceDestroyed(SurfaceHolder holder) {
    39             // empty. Take care of releasing the Camera preview in your activity.
    40         }
    41 
    42         public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    43             // If your preview can change or rotate, take care of those events here.
    44             // Make sure to stop the preview before resizing or reformatting it.
    45 
    46             if (mHolder.getSurface() == null){
    47               // preview surface does not exist
    48               return;
    49             }
    50 
    51             // stop preview before making changes
    52             try {
    53                 mCamera.stopPreview();
    54             } catch (Exception e){
    55               // ignore: tried to stop a non-existent preview
    56             }
    57 
    58             // set preview size and make any resize, rotate or
    59             // reformatting changes here
    60 
    61             // start preview with new settings
    62             try {
    63                 mCamera.setPreviewDisplay(mHolder);
    64                 mCamera.startPreview();
    65 
    66             } catch (Exception e){
    67                 Log.d(VIEW_LOG_TAG, "Error starting camera preview: " + e.getMessage());
    68             }
    69         }
    70         }

    3.activity_main.xml布局文件

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3      android:layout_width="fill_parent"
     4     android:layout_height="fill_parent"  
     5     android:orientation="horizontal"
     6     tools:context=".MainActivity" >
     7     <FrameLayout
     8     android:id="@+id/camera_preview"
     9     android:layout_width="fill_parent"
    10     android:layout_height="fill_parent"
    11     android:layout_weight="1"
    12     />
    13 
    14   <Button
    15     android:id="@+id/button_capture"
    16     android:text="Capture"
    17     android:layout_width="wrap_content"
    18     android:layout_height="wrap_content"
    19     android:layout_gravity="center"
    20     />
    21   
    22 
    23 </LinearLayout>

    4.AndroidManifest.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.example.takemyphoto"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6     <uses-permission android:name="android.permission.CAMERA" />
     7     <uses-feature android:name="android.hardware.camera" />
     8     <uses-feature android:name="android.hardware.camera" android:required="false" />
     9     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    10     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    11 
    12     <uses-sdk
    13         android:minSdkVersion="8"
    14         android:targetSdkVersion="18" />
    15 
    16     <application
    17         android:allowBackup="true"
    18         android:icon="@drawable/ic_launcher"
    19         android:label="@string/app_name"
    20         android:theme="@style/AppTheme" >
    21         <activity
    22             android:name="com.example.takemyphoto.MainActivity"
    23             android:label="@string/app_name" 
    24              android:screenOrientation="landscape">
    25             <intent-filter>
    26                 <action android:name="android.intent.action.MAIN" />
    27 
    28                 <category android:name="android.intent.category.LAUNCHER" />
    29             </intent-filter>
    30         </activity>
    31     </application>
    32 
    33 </manifest>

         相关API网址:http://developer.android.com/guide/topics/media/camera.html

    本性的苏醒,往往在遭遇真实之后。
  • 相关阅读:
    Jenkins+Ansible+Gitlab自动化部署三剑客(四)--Jenkins Linux shell集成
    Jenkins+Ansible+Gitlab自动化部署三剑客(三)--Jenkins
    腾讯云从业者线上课程(一)--云计算技术架构
    腾讯云从业者线上课程(一)--云计算发展历史
    nmcli 静态方式添加IP地址
    nmcli
    systemctl 控制单元
    ansible组件 Ad-Hoc
    ansible 定义主机用户和密码
    ansible 主机清单 /etc/ansible/hosts
  • 原文地址:https://www.cnblogs.com/chance88/p/4803155.html
Copyright © 2011-2022 走看看