Можно ли захватить изображение без предварительного просмотра камеры? У меня есть требование, чтобы я мог записывать изображение из потока или из службы, не нарушая приложения переднего плана, где я не хочу покажите предварительный просмотр камеры, но все же я хочу захватить изображение в фоновом режиме и сохранить его в устройстве
Как снимать камеру без предварительного просмотра из службы или потока?
Ответ 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>