0

I have implemented many imageviews with a camera icon so that when the user touches on the icon it starts the camera and when the picture is taken it returns to the original activity where the camera intent was called and display the captured image in the imageviews.

The problem is this works ok with in my Jellybean 4.2.2. But in some phones having kitkat and Jellybean 4.2.1, when the camera is loaded and the picture is taken it gives an option to save or discard the captured image (in my phone no option is given to save) and when i click save the app crashes. Sometimes even in my phone it returns to previous activity but doesn't show the captured images.

Please help me if you can.I am posting the essential code below

ImageView photo1,photo2,photo3,photo4,photo5;
int photonum=0;
String image1,image2,image3,image4,image5;

// Activity request codes
private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
public static final int MEDIA_TYPE_IMAGE = 1;

// directory name to store captured images and videos
private static final String IMAGE_DIRECTORY_NAME = "MagicPlaces";

private Uri fileUri; // file url to store image/video


   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.data_uploadtab1);

    photo1= (ImageView) findViewById(R.id.photo1);
    photo2= (ImageView) findViewById(R.id.photo2);
    photo3= (ImageView) findViewById(R.id.photo3);
    photo4= (ImageView) findViewById(R.id.photo4);
    photo5= (ImageView) findViewById(R.id.photo5);

    photo1.setOnClickListener(this);
    photo2.setOnClickListener(this);
    photo3.setOnClickListener(this);
    photo4.setOnClickListener(this);
    photo5.setOnClickListener(this);
  }

   public void onClick(View v) {
    int id=v.getId();
    if(id==R.id.photo1){

      captureImage();
        photonum=1;

    }if(id==R.id.photo2){
      captureImage();
        photonum=2;
    }
    if(id==R.id.photo3){

        captureImage();
        photonum=3;
    }
    if(id==R.id.photo4){
        captureImage();
        photonum=4;

    }  if(id==R.id.photo5){

        captureImage();
        photonum=5;
    }

}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode) {
           case(100):{
            if (resultCode == RESULT_OK) {
               String fileuri=data.getData().getPath();
               previewCapturedImage(fileuri);
            }
            else {
                // failed to capture image
                Toast.makeText(getApplicationContext(),
              "Sorry! Failed to capture image",Toast.LENGTH_SHORT)
                        .show();
            }
        }
        break;
    }
}

 private void previewCapturedImage(String fileUr) {
    try {
       // System.out.println(fileUr);
        // bimatp factory
        BitmapFactory.Options options = new BitmapFactory.Options();

        // downsizing image as it throws OutOfMemory Exception for larger
        // images
        options.inSampleSize = 16;

         Bitmap bitmap = BitmapFactory.decodeFile(fileUr,
                options);


        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 80, baos);
        byte[] b = baos.toByteArray();
        String encodedImage = Base64.encodeToString(b,Base64.DEFAULT);

        Log.e("LOOK", encodedImage);



        if(photonum==1){

        photo1.setImageBitmap(bitmap);
            image1=encodedImage;
    }
       if(photonum==2){
           photo2.setImageBitmap(bitmap);
           image2=encodedImage;
       }
        if(photonum==3){

            photo3.setImageBitmap(bitmap);
            image3=encodedImage;
        }
        if(photonum==4){

            photo4.setImageBitmap(bitmap);
            image4=encodedImage;
        }
        if(photonum==5){

            photo5.setImageBitmap(bitmap);
            image5=encodedImage;
        }

    } catch (NullPointerException e) {
        e.printStackTrace();
    }
}


    private void captureImage() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
    //System.out.println(fileUri);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);



    // start the image capture Intent
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);

}

/**
 * Creating file uri to store image/video
 */
public Uri getOutputMediaFileUri(int type) {
    return Uri.fromFile(getOutputMediaFile(type));
}

/*
 * returning image / video
 */
private static File getOutputMediaFile(int type) {

    // External sdcard location
    File mediaStorageDir = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            IMAGE_DIRECTORY_NAME);

    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
                    + IMAGE_DIRECTORY_NAME + " directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
            Locale.getDefault()).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;
}
  • A `Uri` (`data.getData()`) is not a file. There is no requirement that `data.getData().getPath()` be some filesystem path. Use `getContentResolver().openInputStream()` to get an `InputStream` on the image, then use `decodeStream()` on `BitmapFactory` to read it in. "when i click save the app crashes" -- use LogCat to examine the Java stack trace associated with your crash: https://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can-i-solve-this – CommonsWare May 24 '15 at 20:14
  • thanks i'll try that. Logcat doesn't show abything in red other than this 05-25 02:16:04.272 7209-7209/dmax.mymap E/﹕ appName=dmax.mymap, acAppName=/system/bin/surfaceflinger 05-25 02:16:04.272 7209-7209/dmax.mymap E/﹕ 0 – Dileepa Marasinghe May 24 '15 at 20:50
  • Then either you are not crashing, or something is wrong with your LogCat output. Crashes always result in a stack trace. Now, if the *camera app* crashes, that will be associated with its own process, and so if your LogCat filter is set to only show messages from your process, you will not see the camera's crash. – CommonsWare May 24 '15 at 21:10
  • java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {dmax.mymap/dmax.mymap.Upload_data}: java.lang.NullPointerException This is the exception I get.This points to "data.getData() " in the code . I changed my code to use the inputstream and thank you very much for that – Dileepa Marasinghe May 24 '15 at 21:17

0 Answers0