2012-06-06 39 views

回答

90

請看下面的答案。

Custom_CameraActivity.java

public class Custom_CameraActivity extends Activity { 
    private Camera mCamera; 
    private CameraPreview mCameraPreview; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mCamera = getCameraInstance(); 
     mCameraPreview = new CameraPreview(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
     preview.addView(mCameraPreview); 

     Button captureButton = (Button) findViewById(R.id.button_capture); 
     captureButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mCamera.takePicture(null, null, mPicture); 
      } 
     }); 
    } 

    /** 
    * Helper method to access the camera returns null if it cannot get the 
    * camera or does not exist 
    * 
    * @return 
    */ 
    private Camera getCameraInstance() { 
     Camera camera = null; 
     try { 
      camera = Camera.open(); 
     } catch (Exception e) { 
      // cannot get camera or does not exist 
     } 
     return camera; 
    } 

    PictureCallback mPicture = new PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      File pictureFile = getOutputMediaFile(); 
      if (pictureFile == null) { 
       return; 
      } 
      try { 
       FileOutputStream fos = new FileOutputStream(pictureFile); 
       fos.write(data); 
       fos.close(); 
      } catch (FileNotFoundException e) { 

      } catch (IOException e) { 
      } 
     } 
    }; 

    private static File getOutputMediaFile() { 
     File mediaStorageDir = new File(
       Environment 
         .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
       "MyCameraApp"); 
     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; 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "IMG_" + timeStamp + ".jpg"); 

     return mediaFile; 
    } 
} 

CameraPreview.java

public class CameraPreview extends SurfaceView implements 
     SurfaceHolder.Callback { 
    private SurfaceHolder mSurfaceHolder; 
    private Camera mCamera; 

    // Constructor that obtains context and camera 
    @SuppressWarnings("deprecation") 
    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     this.mCamera = camera; 
     this.mSurfaceHolder = this.getHolder(); 
     this.mSurfaceHolder.addCallback(this); 
     this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder surfaceHolder) { 
     try { 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      // left blank for now 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, 
      int width, int height) { 
     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.startPreview(); 
     } catch (Exception e) { 
      // intentionally left blank for a test 
     } 
    } 
} 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" > 

    <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:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="Capture" /> 

</LinearLayout> 

添加下面幾行加入AndroidManifest.xml文件

<uses-feature android:name="android.hardware.camera" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

它幫了我很多。謝謝。 – Umesh

+6

不錯的解決方案。但相機預覽始終以90度垂直方向爲焦點,相機並不直接對焦。爲了實現直線相機對焦,必須改變什麼? – Karthick

+0

很好的解決方案Boss – vabhavsingh

6

下面的代碼片段將幫助您

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="de.vogella.cameara.api" 
    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="de.vogella.camera.api.MakePhotoActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <Button 
     android:id="@+id/captureFront" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:onClick="onClick" 
     android:text="Make Photo" /> 

</RelativeLayout> 

PhotoHandler.java

package org.sample; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import android.content.Context; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.os.Environment; 
import android.util.Log; 
import android.widget.Toast; 

public class PhotoHandler implements PictureCallback { 

    private final Context context; 

    public PhotoHandler(Context context) { 
     this.context = context; 
    } 

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

     File pictureFileDir = getDir(); 

     if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) { 

      Log.d(Constants.DEBUG_TAG, "Can't create directory to save image."); 
      Toast.makeText(context, "Can't create directory to save image.", 
        Toast.LENGTH_LONG).show(); 
      return; 

     } 

     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss"); 
     String date = dateFormat.format(new Date()); 
     String photoFile = "Picture_" + date + ".jpg"; 

     String filename = pictureFileDir.getPath() + File.separator + photoFile; 

     File pictureFile = new File(filename); 

     try { 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
      Toast.makeText(context, "New Image saved:" + photoFile, 
        Toast.LENGTH_LONG).show(); 
     } catch (Exception error) { 
      Log.d(Constants.DEBUG_TAG, "File" + filename + "not saved: " 
        + error.getMessage()); 
      Toast.makeText(context, "Image could not be saved.", 
        Toast.LENGTH_LONG).show(); 
     } 
    } 

    private File getDir() { 
     File sdDir = Environment 
      .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
     return new File(sdDir, "CameraAPIDemo"); 
    } 
} 

MakePhotoActivity.java

package org.sample; 

import android.app.Activity; 
import android.content.pm.PackageManager; 
import android.hardware.Camera; 
import android.hardware.Camera.CameraInfo; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 
import de.vogella.cameara.api.R; 

public class MakePhotoActivity extends Activity { 
    private final static String DEBUG_TAG = "MakePhotoActivity"; 
    private Camera camera; 
    private int cameraId = 0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // do we have a camera? 
     if (!getPackageManager() 
       .hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
      Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG) 
        .show(); 
     } else { 
      cameraId = findFrontFacingCamera(); 
      camera = Camera.open(cameraId); 
      if (cameraId < 0) { 
       Toast.makeText(this, "No front facing camera found.", 
         Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 

    public void onClick(View view) { 
     camera.takePicture(null, null, 
       new PhotoHandler(getApplicationContext())); 
    } 

    private int findFrontFacingCamera() { 
     int cameraId = -1; 
     // Search for the front facing camera 
     int numberOfCameras = Camera.getNumberOfCameras(); 
     for (int i = 0; i < numberOfCameras; i++) { 
      CameraInfo info = new CameraInfo(); 
      Camera.getCameraInfo(i, info); 
      if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { 
       Log.d(DEBUG_TAG, "Camera found"); 
       cameraId = i; 
       break; 
      } 
     } 
     return cameraId; 
    } 

    @Override 
    protected void onPause() { 
     if (camera != null) { 
      camera.release(); 
      camera = null; 
     } 
     super.onPause(); 
    } 

} 
+2

我得到一個錯誤:「錯誤100」的ICamera服務器死亡...! – 2013-05-18 06:06:23

-2
showbookimage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       // create intent with ACTION_IMAGE_CAPTURE action 
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       /** 
Here REQUEST_IMAGE is the unique integer value you can pass it any integer 
**/ 
       // start camera activity 
       startActivityForResult(intent, TAKE_PICTURE); 
      } 

      } 

     ); 

則u現在可以給圖像的文件名,如下所示,然後將其轉換成位圖,後來至檔案

private void createImageFile(Bitmap bitmap) throws IOException { 
     // Create an image file name 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = "JPEG_" + timeStamp + "_"; 
     File storageDir = Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES); 
     File image = File.createTempFile(
       imageFileName, /* prefix */ 
       ".jpg",   /* suffix */ 
       storageDir  /* directory */ 
     ); 
     FileOutputStream stream = new FileOutputStream(image); 
     stream.write(bytes.toByteArray()); 
     stream.close(); 
     // Save a file: path for use with ACTION_VIEW intents 
     mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
     fileUri = image.getAbsolutePath(); 
     Picasso.with(getActivity()).load(image).into(showbookimage); 
    } 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent intent) { 

     if (requestCode == TAKE_PICTURE && resultCode== Activity.RESULT_OK && intent != null){ 
      // get bundle 
      Bundle extras = intent.getExtras(); 
      // get 
      bitMap = (Bitmap) extras.get("data"); 
//   showbookimage.setImageBitmap(bitMap); 
      try { 
       createImageFile(bitMap); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

使用picasso進行圖像顯示比較快

相關問題