采用camera拍照

MainActivity

public class MainActivity extends Activity { 

 protected static final String TAG = "MainActivity";

 private static final int MEDIA_TYPE_IMAGE = 1;

 private static final int MEDIA_TYPE_VIDEO = 2;

 private Camera mCamera;

 private FrameLayout preview;

 private CameraPreview mPreview;

 private PictureCallback mPicture = new PictureCallback() {

  @Override

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

   File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);

   if (pictureFile == null) {

    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());

   }

  }

 };

 @Override

 public 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.activity_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);

  preview = (FrameLayout) findViewById(R.id.camera_preview);

  preview.addView(mPreview);

  // Add a listener to the Capture button

  Button captureButton = (Button) findViewById(R.id.button_capture);

  captureButton.setOnClickListener(new View.OnClickListener() {

   @Override

   public void onClick(View v) {

    mCamera.autoFocus(new AutoFocusCallback() {

     @Override

     public void onAutoFocus(boolean arg0, Camera arg1) {

      mCamera.takePicture(null, null, mPicture);

     }

    });

   }

  });

 }

 /**

  * 判断设备是否有摄像头

  */

 private boolean checkCameraHardware(Context context) {

  if (context.getPackageManager().hasSystemFeature(

    PackageManager.FEATURE_CAMERA)) {

   // this device has a camera

   return true;

  } else {

   // no camera on this device

   return false;

  }

 }

 /**

  * 以一种安全方式去初始化一个Camera对象

  */

 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

 }

 /** Create a File for saving an image 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 images 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;

  }

  System.out.println(mediaFile.getPath());

  return mediaFile;

 }

 @Override

 protected void onPause() {

  super.onPause();

  if (mCamera != null) {

   mCamera.release(); // release the camera for other applications

   mCamera = null;

  }

 }

}

A basic Camera preview class

public class CameraPreview extends SurfaceView implements

  SurfaceHolder.Callback {

 private static final String TAG = "CameraPreview";

 private SurfaceHolder mHolder;

 private Camera mCamera;

 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 = this.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());

  }

 }

}


Manifest

<?xml version="1.0" encoding="utf-8"?>

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

    package="com.itheima.carema"

    android:versionCode="1"

    android:versionName="1.0" >

    <uses-feature android:name="android.hardware.camera" />

    <uses-permission android:name="android.permission.CAMERA" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="18" />

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="com.itheima.carema.MainActivity"

            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>

Layout

<?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>

原文地址:https://www.cnblogs.com/freenovo/p/4469811.html