Как снимать камеру без предварительного просмотра из службы или потока?

Можно ли захватить изображение без предварительного просмотра камеры? У меня есть требование, чтобы я мог записывать изображение из потока или из службы, не нарушая приложения переднего плана, где я не хочу покажите предварительный просмотр камеры, но все же я хочу захватить изображение в фоновом режиме и сохранить его в устройстве

Ответ 1

Попробуйте этот код. Он щелкнет изображение, когда начнется действие. Он имеет предварительный просмотр, но размер предварительного просмотра установлен на 0 на 0 дп.

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

ссылка: http://www.41post.com/3794/programming/android-take-a-picture-without-displaying-a-preview

Ответ 2

Я не мог принять принятый ответ на работу в своей основной деятельности (он работал как отдельный вид, когда я изменил вид поверхности на 1dpi на 1dpi, но после съемки мои динамические представления исчезнут).

чтобы делать фото без предварительного просмотра в моем основном действии, я использовал код из Android - сделайте снимок без предварительного просмотра (измененная версия следует).

...

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

Ответ 3

вы можете использовать фиктивный поверхностный держатель .callback

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

и примените его к держателю поверхности (previewHolder)

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

а затем используйте предварительный просмотр в настройке предварительного просмотра в mediarecoreder.

    mediaRecorder.setPreviewDisplay(previewHolder.getSurface());

У этого метода будет черный экран. это работает для меня, я надеюсь, что это поможет...

Ответ 4

Сделайте предварительный просмотр внутри другого линейного макета и измените значения альфа 255 полностью прозрачные 0 полностью непрозрачные

cameraPreview_holderLL.setAlpha(255);//включить предварительный просмотр

cameraPreview_holderLL.setAlpha(0);//отключить предварительный просмотр

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