Camera.takePicture () crashes my application

I have an application that should take pictures using the camera.takePicture function. The code I use is as follows:

private Bitmap bitmapPicture;
//inside onCreate
btn.setOnClickListener(new OnClickListener(){

    public void onClick(View v){
        camera.takePicture(myShutterCallback, 
                myPictureCallback_RAW, myPictureCallback_JPG);
    }
    });


 //inside the activity
 ShutterCallback myShutterCallback = new ShutterCallback(){

@Override
public void onShutter() {
    // TODO Auto-generated method stub

}};

PictureCallback myPictureCallback_RAW = new PictureCallback(){

@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
    // TODO Auto-generated method stub

}};

PictureCallback myPictureCallback_JPG = new PictureCallback(){

@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
    // TODO Auto-generated method stub
    bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);
}};

When I press the button, the shutter sound is played, the image on the View surface freezes, but then the application crashes. Why is this happening? When I run it on an emulator with an emulated camera, it works, but it crashes on the device.

+2
source share
3 answers

I finally decided this. Below I give a code for those who want to know how to take screenshots of the layout, photos from the camera without intentions, screenshots (view) of the contents of the View surface and save the screenshot in the folder:

public class Cam_View extends Activity implements SurfaceHolder.Callback{

protected static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;
private SurfaceView SurView;
private SurfaceHolder camHolder;
private boolean previewRunning;
final Context context = this;
public static Camera camera = null;
private RelativeLayout CamView;
private Bitmap inputBMP=null,bmp,bmp1;
private ImageView mImage;




@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);

    CamView = (RelativeLayout) findViewById(R.id.camview);//RELATIVELAYOUT OR 
                                                          //ANY LAYOUT OF YOUR XML

    SurView = (SurfaceView)findViewById(R.id.sview);//SURFACEVIEW FOR THE PREVIEW 
                                                    //OF THE CAMERA FEED
    camHolder = SurView.getHolder();                           //NEEDED FOR THE PREVIEW
    camHolder.addCallback(this);                               //NEEDED FOR THE PREVIEW
    camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//NEEDED FOR THE PREVIEW
    camera_image = (ImageView) findViewById(R.id.camera_image);//NEEDED FOR THE PREVIEW



    Button btn = (Button) findViewById(R.id.button1); //THE BUTTON FOR TAKING PICTURE



    btn.setOnClickListener(new OnClickListener()     //THE BUTTON CODE
    {
        public void onClick(View v)
        {
                  camera.takePicture(null, null, mPicture);//TAKING THE PICTURE
                                                         //THE mPicture IS CALLED 
                                                         //WHICH IS THE LAST METHOD(SEE BELOW)
            }

        });

    }


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,//NEEDED FOR THE PREVIEW
    int height) {
if(previewRunning){
    camera.stopPreview();
}
Camera.Parameters camParams = camera.getParameters();
Camera.Size size = camParams.getSupportedPreviewSizes().get(0); 
    camParams.setPreviewSize(size.width, size.height);
camera.setParameters(camParams);
try{
    camera.setPreviewDisplay(holder);
    camera.startPreview();
    previewRunning=true;
}catch(IOException e){
    e.printStackTrace();
}
}

public void surfaceCreated(SurfaceHolder holder) {                  //NEEDED FOR THE PREVIEW
try{
    camera=Camera.open();
}catch(Exception e){
    e.printStackTrace();
    Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
    finish();
}
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {             //NEEDED FOR THE PREVIEW
camera.stopPreview();
camera.release();
camera=null;
}



public void TakeScreenshot(){    //THIS METHOD TAKES A SCREENSHOT AND SAVES IT AS .jpg

Random num = new Random();
int nu=num.nextInt(1000); //PRODUCING A RANDOM NUMBER FOR FILE NAME
CamView.setDrawingCacheEnabled(true); //CamView OR THE NAME OF YOUR LAYOUR
CamView.buildDrawingCache(true);
Bitmap bmp = Bitmap.createBitmap(CamView.getDrawingCache());
CamView.setDrawingCacheEnabled(false); // clear drawing cache
                ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
                bmp.compress(CompressFormat.JPEG, 100, bos); 
                byte[] bitmapdata = bos.toByteArray();
                ByteArrayInputStream fis = new ByteArrayInputStream(bitmapdata);

                String picId=String.valueOf(nu);
                String myfile="Ghost"+picId+".jpeg";

                File dir_image = new  File(Environment.getExternalStorageDirectory()+//<---
                        File.separator+"Ultimate Entity Detector");          //<---

                dir_image.mkdirs();                                                  //<---
                    //^IN THESE 3 LINES YOU SET THE FOLDER PATH/NAME . HERE I CHOOSE TO SAVE
                    //THE FILE IN THE SD CARD IN THE FOLDER "Ultimate Entity Detector"

                try {
                    File tmpFile = new File(dir_image,myfile); 
                    FileOutputStream fos = new FileOutputStream(tmpFile);

                     byte[] buf = new byte[1024];
                        int len;
                        while ((len = fis.read(buf)) > 0) {
                            fos.write(buf, 0, len);
                        }
                            fis.close();
                            fos.close();

                            Toast.makeText(getApplicationContext(),
                                    "The file is saved at :SD/Ultimate Entity Detector",Toast.LENGTH_LONG).show();

                            bmp1 = null;
                            camera_image.setImageBitmap(bmp1); //RESETING THE PREVIEW
                            camera.startPreview();             //RESETING THE PREVIEW       
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }


}

private PictureCallback mPicture = new PictureCallback() {   //THIS METHOD AND THE METHOD BELOW
                             //CONVERT THE CAPTURED IMAGE IN A JPG FILE AND SAVE IT

@Override
public void onPictureTaken(byte[] data, Camera camera) {

    File dir_image2 = new  File(Environment.getExternalStorageDirectory()+
            File.separator+"Ultimate Entity Detector");
    dir_image2.mkdirs();  //AGAIN CHOOSING FOLDER FOR THE PICTURE(WHICH IS LIKE A SURFACEVIEW 
                            //SCREENSHOT)



    File tmpFile = new File(dir_image2,"TempGhost.jpg"); //MAKING A FILE IN THE PATH                 
                    //dir_image2(SEE RIGHT ABOVE) AND NAMING IT "TempGhost.jpg" OR ANYTHING ELSE
    try {//SAVING
        FileOutputStream fos = new FileOutputStream(tmpFile);
        fos.write(data);
        fos.close();
        //grabImage();
    } catch (FileNotFoundException e) {
        Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
    } catch (IOException e) {
        Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
    }

    String path = (Environment.getExternalStorageDirectory()+  
            File.separator+"Ultimate EntityDetector"+
                                        File.separator+"TempGhost.jpg");//<---

    BitmapFactory.Options options = new BitmapFactory.Options();//<---
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;//<---
    bmp1 = BitmapFactory.decodeFile(path, options);//<---
    //THE LINES ABOVE READ THE FILE WE SAVED BEFORE AND CONVERT IT INTO A BitMap
    camera_image.setImageBitmap(bmp1); //SETTING THE BitMap AS IMAGE IN AN IMAGEVIEW(SOMETHING
                                //LIKE A BACKGROUNG FOR THE LAYOUT)
    TakeScreenshot();//CALLING THIS METHOD TO TAKE A SCREENSHOT

}
};
 }

( ), TakeScreenshot.

surfaceView, mPicture , , backgroung, TakeScreenshot, ( )

, takePicture mPicture surfaceView .

, " ", (, ..) .

xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"   
android:id="@+id/camview">

<SurfaceView
    android:id="@+id/sview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" />

<ImageView
    android:id="@+id/camera_image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:contentDescription="@string/app_name" />



<Button
    android:id="@+id/button1"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" />


</RelativeLayout>
0

IMP : mainfest

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

public class MainActivity extends Activity {

private static final int CAMERA_PIC_REQUEST = 1111;//Constant ID for ActivityResult
private ImageView mImage; // To display the thumbnail

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mImage = (ImageView) findViewById(R.id.camera_image);

    // Start an intent for Camera Capture with ResultActivity
    Intent cameraIntent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA_PIC_REQUEST) {
        // Get the image in a Bitmap extension to assign it to the ImageView
        if (data.getExtras() == null)
            return;
        Bitmap thumb = (Bitmap) data.getExtras().get("data");
        mImage.setImageBitmap(thumb);

        // Compress the Bitmap image into JPEG to save it on the device
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        thumb.compress(Bitmap.CompressFormat.JPEG, 100, bytes);// 100 is the scale..for less quality decrease the number                                

        // Save the image on the root SDCard
        File file = new File(Environment.getExternalStorageDirectory()
                + File.separator + "imageName.png");

        try {
            // Create the file to save the image
            file.createNewFile();
            FileOutputStream fo = new FileOutputStream(file);
            fo.write(bytes.toByteArray());
            fo.close();
        } catch (Exception e) {
        }

    }

}

}

MainActivity.XML:

    <ImageView android:id="@+id/camera_image"
    android:layout_width="wrap_content" android:layout_height="wrap_content" />
0

Just add a callback to start the preview on your camera instance. The fact is that after starting the preview on the camera instance, he needs some time to take a picture. Try the following:

       camera.startPreview();
        camera.setOneShotPreviewCallback(new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
                camera.takePicture(null, null, new Camera.PictureCallback() {
                    @Override
                    public void onPictureTaken(byte[] data, Camera camera) {
               // do something you want with your picture and stop preview
                        camera.stopPreview();
                    }
                });
0
source

All Articles