La construction de ma propre application de l'appareil photo + Automatiquement la capture de l'image

J'ai créé mon propre application de l'appareil photo. Et quand je clique sur le bouton, il prend la photo et l'enregistre dans le galary. Ce que je veux faire est de prendre la photo sans un aperçu et sans devoir cliquer sur un bouton.

Mon activité principale classe.

package themiya.camera.android;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.Toast;
public class CameraActivity extends Activity {
private Camera mCamera;
private CameraPreview mPreview;
public static final int MEDIA_TYPE_IMAGE = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button captureButton = (Button) findViewById(R.id.button_capture);
System.out.println("Starting!");
//Create an instance of Camera
mCamera = getCameraInstance();
//Create our Preview view and set it as the content of our activity.
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview);
final PictureCallback mPicture = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null){
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
MediaStore.Images.Media.insertImage(getContentResolver(), pictureFile.getAbsolutePath(), pictureFile.getName(), pictureFile.getName());
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
};
//Add a listener to the Capture button
captureButton.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
//get an image from the camera   
System.out.println("Photo Taking!");
mCamera.takePicture(null, null, mPicture);
}
}
);
}
/** A safe way to get an instance of the Camera object. */
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open(); //attempt to get a Camera instance
}
catch (Exception e){
//Camera is not available (in use or does not exist)
}
return c; //returns null if camera is unavailable
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();              //release the camera immediately on pause event
}
private void releaseCamera(){
if (mCamera != null){
mCamera.release();        //release the camera for other applications
mCamera = null;
}
}
/** Create a File for saving an image or video */
private  File getOutputMediaFile(int type){
//To be safe, you should check that the SDCard is mounted
//using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
//This location works best if you want the created images to be shared
//between applications and persist after your app has been uninstalled.
//Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
return null;
}
}
//Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
} else {
return null;
}
return mediaFile;
}
}

Et l'aperçu de la classe.

package themiya.camera.android;
import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context,Camera camera) {
super(context);
mCamera = camera;
/*SurfaceView view = new SurfaceView(this);
c.setPreviewDisplay(view.getHolder());
c.startPreview();
c.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback);
* */
//Install a SurfaceHolder.Callback so we get notified when the
//underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
//deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
//TODO Auto-generated method stub
if (mHolder.getSurface() == null){
//preview surface does not exist
return;
}
//stop preview before making changes
try {
mCamera.stopPreview();
} catch (Exception e){
//ignore: tried to stop a non-existent preview
}
//set preview size and make any resize, rotate or
//reformatting changes here
//start preview with new settings
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e){
}
}
public void surfaceCreated(SurfaceHolder holder) {
//TODO Auto-generated method stub
}
public void surfaceDestroyed(SurfaceHolder holder) {
//TODO Auto-generated method stub
}
}

Dans l'activité de la classe de la méthode de clic est comme ça.

captureButton.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
//get an image from the camera   
System.out.println("Photo Taking!");
mCamera.takePicture(null, null, mPicture);
}
}
);

Et quand j'ai enlever que l'auditeur de la partie et de ne mettre que le

mCamera.takePicture(null, null, mPicture);

le cadre de l'application se bloque. Je pense que cela peut être à cause du retard que l'application prend pour ouvrir l'appareil photo. Donc le code essayez de faire la photo avant d'ouvrir l'appareil photo. Aussi attendre(10000); ne fonctionne pas pour moi.

Et aussi je veux prendre la photo sans l'aperçu. Selon mes connaissances, j'ai changer l'aperçu de la classe de le faire. Mais je ne sais pas la bonne façon de le faire.

Quelqu'un peut m'aider avec cette asp.

  • Ok j'ai trouvé une réponse pour prendre la photo automatiquement.... finale de la Minuterie t = new Timer(); t.annexe(nouveau TimerTask() { @Override public void run() { mCamera.takePicture(null, null, mPicture); t.annuler(); } },5000); Maintenant, je veux arrêter la prévisualisation...
InformationsquelleAutor MoraRockey | 2012-03-24