Автоматическая съемка без участия пользователя

Я использовал этот код для захвата изображения с камеры.

package android.takeowneship; import java.io.File; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.widget.ImageView; import android.widget.Toast; public class camera extends Activity{ private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; Uri imageUri; private ImageView imageView; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //define the file-name to save photo taken by Camera activity String fileName = "new-photo-name.jpg"; //create parameters for Intent with filename ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, fileName); values.put(MediaStore.Images.Media.DESCRIPTION,"Image capture by camera"); //imageUri is the current activity attribute, define and save it for later usage (also in onSaveInstanceState) imageUri = getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); //create new Intent Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { if (resultCode == RESULT_OK) { //use imageUri here to access the image Toast.makeText(this, "picture has been taken"+ imageUri, Toast.LENGTH_SHORT).show(); } else if (resultCode == RESULT_CANCELED) { Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show(); } } } public static File convertImageUriToFile (Uri imageUri, Activity activity) { Cursor cursor = null; try { String [] proj={MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID, MediaStore.Images.ImageColumns.ORIENTATION}; cursor = activity.managedQuery( imageUri, proj, // Which columns to return null, // WHERE clause; which rows to return (all rows) null, // WHERE clause selection arguments (none) null); // Order-by clause (ascending by name) int file_ColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); // int orientation_ColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION); if (cursor.moveToFirst()) { // String orientation = cursor.getString(orientation_ColumnIndex); return new File(cursor.getString(file_ColumnIndex)); } return null; } finally { if (cursor != null) { cursor.close(); } } } 

}

Но в этом коде он открывает камеру, и пользователь должен нажать кнопку, чтобы сделать снимок. Я хочу сделать фотографию автоматически (без предварительного просмотра) и сохранить ее на карте памяти.

Solutions Collecting From Web of "Автоматическая съемка без участия пользователя"

Android не позволяет делать снимок без отображения окна предварительного просмотра. Поэтому вы должны сделать вид поверхности очень маленьким. Как 1 * 1 пиксель и поместите его в угол любого управления.

Или покажите фиктивный вид поверхности, чтобы сделать это.

 SurfaceView view = new SurfaceView(this); c.setPreviewDisplay(view.getHolder()); c.startPreview(); c.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback); 

Проверьте (удаленная ссылка) , это и это .

Этот код захватывает изображение с помощью передней камеры и автоматически сохраняет его

 /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); int index = getFrontCameraId(); if (index == -1){ Toast.makeText(getApplicationContext(), "No front camera", Toast.LENGTH_LONG).show(); } else { iv_image = (ImageView) findViewById(R.id.imageView); sv = (SurfaceView) findViewById(R.id.surfaceView); sHolder = sv.getHolder(); sHolder.addCallback(this); sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { parameters = mCamera.getParameters(); mCamera.setParameters(parameters); mCamera.startPreview(); Camera.PictureCallback mCall = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { Uri uriTarget = getContentResolver().insert//(Media.EXTERNAL_CONTENT_URI, image); (Media.EXTERNAL_CONTENT_URI, new ContentValues()); OutputStream imageFileOS; try { imageFileOS = getContentResolver().openOutputStream(uriTarget); imageFileOS.write(data); imageFileOS.flush(); imageFileOS.close(); Toast.makeText(TakePictureActivity.this, "Image saved: " + uriTarget.toString(), Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } //mCamera.startPreview(); bmp = BitmapFactory.decodeByteArray(data, 0, data.length); iv_image.setImageBitmap(bmp); } }; mCamera.takePicture(null, null, mCall); } int getFrontCameraId() { CameraInfo ci = new CameraInfo(); for (int i = 0 ; i < Camera.getNumberOfCameras(); i++) { Camera.getCameraInfo(i, ci); if (ci.facing == CameraInfo.CAMERA_FACING_FRONT) return i; } return -1; // No front-facing camera found } @Override public void surfaceCreated(SurfaceHolder holder) { int index = getFrontCameraId(); if (index == -1){ Toast.makeText(getApplicationContext(), "No front camera", Toast.LENGTH_LONG).show(); } else { mCamera = Camera.open(index); Toast.makeText(getApplicationContext(), "With front camera", Toast.LENGTH_LONG).show(); } mCamera = Camera.open(index); try { mCamera.setPreviewDisplay(holder); } catch (IOException exception) { mCamera.release(); mCamera = null; } } @Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); mCamera = null; } 

}