2012-03-16 31 views
23

Có thể chụp ảnh mà không hiển thị xem trước máy ảnh không ?, tôi có yêu cầu tôi có thể chụp ảnh từ một chủ đề hoặc từ một dịch vụ mà không làm phiền ứng dụng nền trước, nơi tôi không muốn hiển thị xem trước máy ảnh, nhưng tôi vẫn muốn chụp ảnh ở chế độ nền và lưu trữ hình ảnh đó trong thiết bịcách chụp ảnh mà không cần xem trước từ một dịch vụ hoặc chuỗi?

+2

Bạn có thấy những câu hỏi khác này không? http://stackoverflow.com/questions/2386025/android-camera-without-preview http://stackoverflow.com/questions/7398897/how-to-use-camera-to-take-picture-in-a-background -service-on-android –

+0

bất kỳ chương trình mẫu nào để sử dụng camera trước mà không xem trước và lưu thẻ sd – city0666

Trả lời

12

Hãy thử mã này. Nó sẽ nhấp vào một hình ảnh khi hoạt động khởi động. Nó có một bản xem trước, nhưng kích thước xem trước được đặt thành 0 bởi 0 dp.

package fortyonepost.com.pwop; 

import java.io.IOException; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.widget.ImageView; 

public class TakePicture extends Activity implements SurfaceHolder.Callback 
{ 
    //a variable to store a reference to the Image View at the main.xml file 
    private ImageView iv_image; 
    //a variable to store a reference to the Surface View at the main.xml file 
    private SurfaceView sv; 

    //a bitmap to display the captured image 
    private Bitmap bmp; 

    //Camera variables 
    //a surface holder 
    private SurfaceHolder sHolder; 
    //a variable to control the camera 
    private Camera mCamera; 
    //the camera parameters 
    private Parameters parameters; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     //get the Image View at the main.xml file 
     iv_image = (ImageView) findViewById(R.id.imageView); 

     //get the Surface View at the main.xml file 
     sv = (SurfaceView) findViewById(R.id.surfaceView); 

     //Get a surface 
     sHolder = sv.getHolder(); 

     //add the callback interface methods defined below as the Surface View callbacks 
     sHolder.addCallback(this); 

     //tells Android that this surface will have its data constantly replaced 
     sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) 
    { 
     //get camera parameters 
     parameters = mCamera.getParameters(); 

     //set camera parameters 
     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 

     //sets what code should be executed after the picture is taken 
     Camera.PictureCallback mCall = new Camera.PictureCallback() 
     { 
      @Override 
      public void onPictureTaken(byte[] data, Camera camera) 
      { 
       //decode the data obtained by the camera into a Bitmap 
       bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 
       //set the iv_image 
       iv_image.setImageBitmap(bmp); 
      } 
     }; 

     mCamera.takePicture(null, null, mCall); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw the preview. 
     mCamera = Camera.open(); 
     try { 
      mCamera.setPreviewDisplay(holder); 

     } catch (IOException exception) { 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     //stop the preview 
     mCamera.stopPreview(); 
     //release the camera 
     mCamera.release(); 
     //unbind the camera from this object 
     mCamera = null; 
    } 
} 

tham khảo: http://www.41post.com/3794/programming/android-take-a-picture-without-displaying-a-preview

+0

Điều này đang đi đúng hướng, nhưng bạn đang sử dụng 'Hoạt động' thay vì chuỗi hoặc dịch vụ nền. – Sam

+0

Điều này có một hình ảnh, nhưng nó được xoay 90 độ! Để kiểm tra, tôi đã thực hiện chế độ xem bề mặt 200x200 pixel thay vì 0 chiều rộng. Chế độ xem bề mặt cũng hiển thị hình ảnh sang một bên. – Raja

1

bạn có thể sử dụng một surfaceholder.callback giả

private SurfaceHolder.Callback dummySurfaceCallback = new SurfaceHolder.Callback() 
{ 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
     // do nothing 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    { 
     // do nothing 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     // do nothing 
    } 
}; 

và áp dụng nó vào một surfaceholder (previewHolder)

preview = (SurfaceView) findViewById(R.id.preview); 
    previewHolder = preview.getHolder(); 
    previewHolder.addCallback(dummySurfaceCallback); 
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

và sau đó sử dụng previewholder trong khi thiết lập xem trước hiển thị trong mediarecoreder.

mediaRecorder.setPreviewDisplay(previewHolder.getSurface()); 

phương pháp này sẽ cho bạn xem trước màn hình đen. hoạt động cho tôi, tôi hy vọng điều này sẽ giúp ích cho bạn ...

3

Tôi không thể nhận câu trả lời được chấp nhận để làm việc trong hoạt động chính của mình (hoạt động như một hoạt động riêng biệt khi tôi thay đổi bề mặt thành 1dpi theo 1dpi, nhưng sau khi chụp ảnh, lượt xem động của tôi sẽ biến mất).

để chụp ảnh mà không xem trước trong hoạt động chính của mình, tôi đã sử dụng mã từ Android - Take picture without preview (phiên bản được sửa đổi sau).

...

private SurfaceView sv; 
Camera myCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 

...

private void takePhoto() { 

     Camera.Parameters parameters = myCamera.getParameters(); 
     // myCamera.setDisplayOrientation(180); 
     // parameters.setPictureFormat(ImageFormat.JPEG); 
     // parameters.setPictureFormat(PixelFormat.JPEG); 
     myCamera.setParameters(parameters); 
     SurfaceView mview = sv; 
     try { 
      myCamera.setPreviewDisplay(mview.getHolder()); 
      myCamera.startPreview(); 
      myCamera.takePicture(null, null, photoCallback); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    Camera.PictureCallback photoCallback=new Camera.PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 

      saveMyPhotoToParse(data); 
      // Log.i(DEBUG_TAG,"image pseudo saved"); 
     } 
    }; 
+1

ngoại lệ con trỏ null trên dòng này myCamera.setPreviewDisplay (mview.getHolder()); –

1

Hãy xem trước bên trong một bố trí tuyến tính và thay đổi giá trị alpha 255 đầy đủ trong suốt 0 đầy đủ đục

cameraPreview_holderLL.setAlpha (255); // bật xem trước

máy ảnhPreview_holderLL.setAlpha (0); // tắt xem trước

<LinearLayout 
    android:id="@+id/camera_preview_holder" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
     <LinearLayout 
      android:id="@+id/camera_preview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:orientation="vertical" > 
     </LinearLayout> 
</LinearLayout> 
Các vấn đề liên quan