2011-12-17 7 views
16

Je souhaite utiliser camera preview dans une activité. Je veux ajouter des images (cadres transparents sur la vue de surface). J'ai essayé code suivant afin que je puisse facilement personnaliser la mise en page XML de préférence:Appareil photo personnalisé android

package com.demo; 


import java.io.IOException; 

import android.app.Activity; 
import android.graphics.PixelFormat; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.widget.Toast; 

public class CameraDemoActivity extends Activity implements SurfaceHolder.Callback{ 
    /** Called when the activity is first created. */ 
    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     getWindow().setFormat(PixelFormat.UNKNOWN); 
     surfaceView = (SurfaceView)findViewById(R.id.surfaceview); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     camera = Camera.open(); 
     if(camera!=null){ 

      try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
      } catch (IOException e) { 
      Toast.makeText(this, (CharSequence) e, Toast.LENGTH_LONG).show(); 
      } 

     } 


    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 
} 

Voici mon manifeste:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.demo" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="8" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".CameraDemoActivity" 
        android:label="@string/app_name" android:screenOrientation="portrait"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 
    <uses-permission android:name="android.permission.CAMERA"/> 
    <uses-feature android:name="android:hardware.camera" /> 
    <uses-feature android:name="android.hardware.camera.autofocus" /> 
</manifest> 

Et voici ma mise en page:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<SurfaceView 
android:id="@+id/surfaceview" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"/> 
</LinearLayout> 

ne sais pas pourquoi L'aperçu de camera ne s'affiche pas?

Répondre

34

Utilisez ce code

PreviewDemo.java

public class PreviewDemo extends Activity implements OnClickListener { 

    private SurfaceView preview = null; 
    private SurfaceHolder previewHolder = null; 
    private Camera camera = null; 
    private boolean inPreview = false; 
    ImageView image; 
    Bitmap bmp, itembmp; 
    static Bitmap mutableBitmap; 
    PointF start = new PointF(); 
    PointF mid = new PointF(); 
    float oldDist = 1f; 
    File imageFileName = null; 
    File imageFileFolder = null; 
    private MediaScannerConnection msConn; 
    Display d; 
    int screenhgt, screenwdh; 
    ProgressDialog dialog; 



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

     image = (ImageView) findViewById(R.id.image); 
     preview = (SurfaceView) findViewById(R.id.surface); 

     previewHolder = preview.getHolder(); 
     previewHolder.addCallback(surfaceCallback); 
     previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     previewHolder.setFixedSize(getWindow().getWindowManager() 
      .getDefaultDisplay().getWidth(), getWindow().getWindowManager() 
      .getDefaultDisplay().getHeight()); 


    } 


    @Override 
    public void onResume() { 
     super.onResume(); 
     camera = Camera.open(); 
    } 

    @Override 
    public void onPause() { 
     if (inPreview) { 
      camera.stopPreview(); 
     } 

     camera.release(); 
     camera = null; 
     inPreview = false; 
     super.onPause(); 
    } 

    private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) { 
     Camera.Size result = null; 
     for (Camera.Size size: parameters.getSupportedPreviewSizes()) { 
      if (size.width <= width && size.height <= height) { 
       if (result == null) { 
        result = size; 
       } else { 
        int resultArea = result.width * result.height; 
        int newArea = size.width * size.height; 
        if (newArea > resultArea) { 
         result = size; 
        } 
       } 
      } 
     } 
     return (result); 
    } 

    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { 
     public void surfaceCreated(SurfaceHolder holder) { 
      try { 
       camera.setPreviewDisplay(previewHolder); 
      } catch (Throwable t) { 
       Log.e("PreviewDemo-surfaceCallback", 
        "Exception in setPreviewDisplay()", t); 
       Toast.makeText(PreviewDemo.this, t.getMessage(), Toast.LENGTH_LONG) 
        .show(); 
      } 
     } 

     public void surfaceChanged(SurfaceHolder holder, 
     int format, int width, 
     int height) { 
      Camera.Parameters parameters = camera.getParameters(); 
      Camera.Size size = getBestPreviewSize(width, height, 
      parameters); 

      if (size != null) { 
       parameters.setPreviewSize(size.width, size.height); 
       camera.setParameters(parameters); 
       camera.startPreview(); 
       inPreview = true; 
      } 
     } 

     public void surfaceDestroyed(SurfaceHolder holder) { 
      // no-op 
     } 
    }; 


    Camera.PictureCallback photoCallback = new Camera.PictureCallback() { 
     public void onPictureTaken(final byte[] data, final Camera camera) { 
      dialog = ProgressDialog.show(PreviewDemo.this, "", "Saving Photo"); 
      new Thread() { 
       public void run() { 
        try { 
         Thread.sleep(1000); 
        } catch (Exception ex) {} 
        onPictureTake(data, camera); 
       } 
      }.start(); 
     } 
    }; 



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

     bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 
     mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true); 
     savePhoto(mutableBitmap); 
     dialog.dismiss(); 
    } 



    class SavePhotoTask extends AsyncTask < byte[], String, String > {@Override 
     protected String doInBackground(byte[]...jpeg) { 
      File photo = new File(Environment.getExternalStorageDirectory(), "photo.jpg"); 
      if (photo.exists()) { 
       photo.delete(); 
      } 
      try { 
       FileOutputStream fos = new FileOutputStream(photo.getPath()); 
       fos.write(jpeg[0]); 
       fos.close(); 
      } catch (java.io.IOException e) { 
       Log.e("PictureDemo", "Exception in photoCallback", e); 
      } 
      return (null); 
     } 
    } 


    public void savePhoto(Bitmap bmp) { 
     imageFileFolder = new File(Environment.getExternalStorageDirectory(), "Rotate"); 
     imageFileFolder.mkdir(); 
     FileOutputStream out = null; 
     Calendar c = Calendar.getInstance(); 
     String date = fromInt(c.get(Calendar.MONTH)) + fromInt(c.get(Calendar.DAY_OF_MONTH)) + fromInt(c.get(Calendar.YEAR)) + fromInt(c.get(Calendar.HOUR_OF_DAY)) + fromInt(c.get(Calendar.MINUTE)) + fromInt(c.get(Calendar.SECOND)); 
     imageFileName = new File(imageFileFolder, date.toString() + ".jpg"); 
     try { 
      out = new FileOutputStream(imageFileName); 
      bmp.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      out.flush(); 
      out.close(); 
      scanPhoto(imageFileName.toString()); 
      out = null; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public String fromInt(int val) { 
     return String.valueOf(val); 
    } 

    public void scanPhoto(final String imageFileName) { 
     msConn = new MediaScannerConnection(PreviewDemo.this, new MediaScannerConnectionClient() { 
      public void onMediaScannerConnected() { 
       msConn.scanFile(imageFileName, null); 
       Log.i("msClient obj in Photo Utility", "connection established"); 
      } 
      public void onScanCompleted(String path, Uri uri) { 
       msConn.disconnect(); 
       Log.i("msClient obj in Photo Utility", "scan completed"); 
      } 
     }); 
     msConn.connect(); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0) { 
      onBack(); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    public void onBack() { 
     Log.e("onBack :", "yes"); 
     camera.takePicture(null, null, photoCallback); 
     inPreview = false; 
    } 

    @Override 
    public void onClick(View v) { 

    } 

} 

Preview.xml

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

    <android.view.SurfaceView 
    android:id="@+id/surface" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 

</RelativeLayout> 

Utiliser un appareil de bouton Menu pour prendre la photo.

Ajouter les autorisations dans le fichier Manifest

dossier Vérifier Rotation dans la galerie pour l'image capturée.

+0

Si vous avez des doutes il suffit de mettre un commentaire – surendra

+1

Pouvez-vous me donner le projet entièrement fonctionnel en zip? Juste ce flux de caméra de base avec un bouton pour cliquer? –

+0

Ceci est l'intégralité du code. – surendra

Questions connexes