2011-12-17 31 views
16

camera preview bir aktivitede kullanmak istiyorum. Resimler eklemek istiyorum (yüzey görünümünde şeffaf çerçeveler). İşte Özel fotoğraf makinesi 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 

    } 
} 

benim açıktır: Tüm i kolayca arzu xml düzenini özelleştirebilirsiniz böylece kod aşağıdaki çalıştı

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

Dont know why: Burada

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

Ve düzenidir camera önizleme görüntülenmiyor mu?

cevap

34

kullanın bu kod

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> 

Aygıtı kullanma Menü düğmesine resim çekmek için.

yakalanan görüntü için Galerisi'nde Manifest dosyasında

Kontrol döndür klasör izinleri ekleyin.

+0

Şüpheniz varsa sadece yorum yazınız – surendra

+1

Bana tamamen çalışma projesini zip içinde verebilir misiniz? Sadece bu temel kamera bir düğmeye basmak için tıklayın? –

+0

Bu, tüm koddur. – surendra

İlgili konular