-4

I am having trouble saving the image taken to a specific directory with specific name. I have no idea how to do it. Below is my code.

CameraCaptureImage.java

public class CaptureCameraImage extends Activity {

    public static int cameraID = 0;
    public static boolean isBlack = true;
    public static ImageView image;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activitycapturecameraimage);
        image = (ImageView) findViewById(R.id.imgView);
    }



    public void onBackClick(View v){


        cameraID = 0;
        Intent i = new Intent(CaptureCameraImage.this,CameraView.class);
        startActivityForResult(i, 999);
    }

}

CameraView.java

public class CameraView extends Activity implements SurfaceHolder.Callback, OnClickListener{
        private static final String TAG = "CameraTest";
        Camera mCamera;
        boolean mPreviewRunning = false;

        @SuppressWarnings("deprecation")
        public void onCreate(Bundle icicle){
            super.onCreate(icicle);
            Log.e(TAG, "onCreate");

            getWindow().setFormat(PixelFormat.TRANSLUCENT);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setContentView(R.layout.cameraview);
            ImageView img = (ImageView) findViewById(R.id.blankImage);

            if(CaptureCameraImage.isBlack)
                img.setBackgroundResource(android.R.color.black);
            else
                img.setBackgroundResource(android.R.color.white);

            mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
            mSurfaceView.setOnClickListener(this);
            mSurfaceHolder = mSurfaceView.getHolder();
            mSurfaceHolder.addCallback(this);
            mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        }

        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState){
            super.onRestoreInstanceState(savedInstanceState);
        }


        Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {

            public void onPictureTaken(byte[] data, Camera camera) {
                // TODO Auto-generated method stub
                if (data != null){
                    //Intent mIntent = new Intent();
                    //mIntent.putExtra("image",imageData);

                    mCamera.stopPreview();
                    mPreviewRunning = false;
                    mCamera.release();

                     try{
                         BitmapFactory.Options opts = new BitmapFactory.Options();
                         Bitmap bitmap= BitmapFactory.decodeByteArray(data, 0, data.length,opts);
                         bitmap = Bitmap.createScaledBitmap(bitmap, 300, 300, false);
                         int width = bitmap.getWidth();
                         int height = bitmap.getHeight();
                         int newWidth = 300;
                         int newHeight = 300;

                         // calculate the scale - in this case = 0.4f
                         float scaleWidth = ((float) newWidth) / width;
                         float scaleHeight = ((float) newHeight) / height;

                         // createa matrix for the manipulation
                         Matrix matrix = new Matrix();
                         // resize the bit map
                         matrix.postScale(scaleWidth, scaleHeight);
                         // rotate the Bitmap
                         matrix.postRotate(90);
                         Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
                                 width, height, matrix, true);
                         CaptureCameraImage.image.setImageBitmap(resizedBitmap);

                     }catch(Exception e){
                         e.printStackTrace();
                     }
                    //StoreByteImage(mContext, imageData, 50,"ImageName");
                    //setResult(FOTO_MODE, mIntent);
                    setResult(585);
                    finish();
                }       
            }
        };

        protected void onResume(){
            Log.e(TAG, "onResume");
            super.onResume();
        }

        protected void onSaveInstanceState(Bundle outState){
            super.onSaveInstanceState(outState);
        }

        protected void onStop(){
            Log.e(TAG, "onStop");
            super.onStop();
        }

        @TargetApi(9)
        public void surfaceCreated(SurfaceHolder holder){
            Log.e(TAG, "surfaceCreated");
            mCamera = Camera.open(CaptureCameraImage.cameraID);
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
            Log.e(TAG, "surfaceChanged");

            // XXX stopPreview() will crash if preview is not running
            if (mPreviewRunning){
                mCamera.stopPreview();
            }

            Camera.Parameters p = mCamera.getParameters();
            p.setPreviewSize(300, 300);

            if(CaptureCameraImage.cameraID == 0){
                String stringFlashMode = p.getFlashMode();
                if (stringFlashMode.equals("torch"))
                        p.setFlashMode("on"); // Light is set off, flash is set to normal 'on' mode
                else
                        p.setFlashMode("torch");
            }

            mCamera.setParameters(p);
            try{
                mCamera.setPreviewDisplay(holder);
            }catch (Exception e){
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            mCamera.startPreview();
            mPreviewRunning = true;
            mCamera.takePicture(null, mPictureCallback, mPictureCallback);
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            Log.e(TAG, "surfaceDestroyed");
            //mCamera.stopPreview();
            //mPreviewRunning = false;
            //mCamera.release();
        }

        private SurfaceView mSurfaceView;
        private SurfaceHolder mSurfaceHolder;

        public void onClick(View v) {
            // TODO Auto-generated method stub
            mCamera.takePicture(null, mPictureCallback, mPictureCallback);
        }

    }
halfer
  • 19,824
  • 17
  • 99
  • 186
rakesh
  • 1
  • 1
  • 3
  • Possible duplicate of [Android: Image save to location](http://stackoverflow.com/questions/3844391/android-image-save-to-location) – B001ᛦ Jun 13 '16 at 11:39
  • I've already tried that not working. – rakesh Jun 13 '16 at 11:43
  • "please respond immediately as this is urgent" is not an appropriate way to address volunteers. Please learn some time management, some patience, and some respect. – halfer Jun 13 '16 at 11:43
  • it was telling me that there is more code than text,so i had to add some text....sorry. – rakesh Jun 13 '16 at 11:44
  • How about adding a description of what debugging you have done so far, and what _exactly_ the problem is? – halfer Jun 13 '16 at 11:45

1 Answers1

0

To capture an image and save it in a specific folder, you have to :

  1. Request for permission on runtime (API 23)
  2. Request image capture
  3. Create the folder

First of all, if you target API 23, you have to follow the new permission system which asks the user to grant it only when used for the first time. In your case, you need to have WRITE_EXTERNAL_STORAGE granted.

    boolean hasPermission = (ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);

    if (!hasPermission) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_STORAGE);
    }

Then, you need to create an implicit intent to capture a photo. The camera app could appear in the app chooser or be selected automatically depending on user settings and installed apps.

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); // final int = 1

Finally, you need to create the folder and indicate the extra output so Android will know where to save the picture.

//Intent i = new intent...

                    long timestamp = System.currentTimeMillis();

                    File file = new File("");

                        file = new File(Environment.getExternalStorageDirectory()
                            + File.separator
                            + "DCIM"
                            + File.separator
                            + address
                            + File.separator
                            , "IMG_" + String.valueOf(timestamp) + ".jpg");

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));

//startActivityForResult...

There are a lot of storage possibilities. You can take a look here : https://developer.android.com/training/basics/data-storage/files.html

I have done nothing special in onActivityResult callback method. I only show a toast to confirm the user that the picture is saved successfully. All the code above is in the onClickListener of an imageView in my case.

Alexandre Martin
  • 1,472
  • 5
  • 14
  • 27