2012-06-06 18 views

Respuesta

90

por favor vea la respuesta a continuación.

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> 

Añadir debajo de las líneas a su archivo 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

Me ayudó mucho. Gracias. – Umesh

+6

Buena solución. Pero la vista previa de la cámara siempre está enfocada en 90 grados verticales, la cámara no está enfocada en absoluto. ¿Qué tiene que cambiar para lograr el enfoque directo de la cámara? – Karthick

+0

Buena solución Boss – vabhavsingh

6

siguiente fragmento le ayudará a

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

Recibí un error: "error 100" El servidor ICamera murió ... !! –

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

      } 

     ); 

entonces u ahora puede dar la imagen de un nombre de archivo de la siguiente manera y luego convertirlo en mapa de bits y más adelante en el archivo

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

     } 
    } 

use picasso para que las imágenes se visualicen bastante rápido

Cuestiones relacionadas