2
votes

I am trying to take photos from sdcard and it is working in case when user selects from google photos but gives an curserindexoutofbound error when selected from any othe app like gallery or file manager. here is the piece of code.

OnActivity Result ` { if (requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK && data != null && data.getData() != null) { Uri uri = null; String realPath = null;

        try
        {
            uri = data.getData();
            Log.e("uri",uri.toString());
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);

            imageView.setImageBitmap(bitmap);

            String imagePath = getRealPathFromURI(uri);

            File source = new File(imagePath);

            String destinationPath = Environment.getExternalStorageDirectory().toString() + "/IASFolders/"+Configuration.empcode+".jpg";



            File destination = new File(destinationPath);
            try
            {
                InputStream in = new FileInputStream(source.getAbsolutePath());
                OutputStream out = new FileOutputStream(destination.getAbsolutePath());

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

                in.close();
                out.close();

            }
            catch (IOException e)
            {
                e.printStackTrace();
                Log.d("File Copy Exception", e.toString());
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}

`{getRealPathFromURI function

private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor = getActivity().getContentResolver()
            .query(contentURI,new String[]{MediaStore.Images.Media.DATA},MediaStore.Images.Media.DISPLAY_NAME+"=?" ,new String[]{Configuration.empcode},null);

    /*
    * Cursor imageCursor=getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new String[]{MediaStore.Images.Media.DATA},MediaStore.Images.Media.DISPLAY_NAME+"=?" ,new String[]{imageTitle},null);
                    imageCursor.moveToFirst();
                    String imageData=imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
                    Long imageSize=imageCursor.getLong(imageCursor.getColumnIndex(ImageColumns.SIZE));
                    Toast.makeText(getApplicationContext(), String.valueOf(imageSize), Toast.LENGTH_LONG).show();*/
    if (cursor == null)
    {
        result = contentURI.getPath();
    }
    else
    {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}

}`

1

1 Answers

1
votes

Try like this

//while setting Intent
   if (Build.VERSION.SDK_INT <= 19) {
                                            Intent intent = new Intent();
                                            intent.setType("image/*");
                                            intent.setAction(Intent.ACTION_GET_CONTENT);
                                            intent.addCategory(Intent.CATEGORY_OPENABLE);
                                            startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
                                        } else if (Build.VERSION.SDK_INT > 19) {
                                            Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                                            startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);


                }


                // get result after selecting image from Gallery
                @Override
                public void onActivityResult(int requestCode, int resultCode, Intent data) {
                    super.onActivityResult(requestCode, resultCode, data);

                    if (requestCode == PICK_IMAGE && resultCode == getActivity().RESULT_OK && null != data) {
                        Uri selectedImageUri = data.getData();
                        String selectedImagePath = getRealPathFromURIForGallery(selectedImageUri);
                        decodeFile(selectedImagePath);
                    }
                }

                public String getRealPathFromURIForGallery(Uri uri) {
                    if (uri == null) {
                        return null;
                    }
                    String[] projection = {MediaStore.Images.Media.DATA};
                    Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null);
                    if (cursor != null) {
                        int column_index = cursor
                                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                        cursor.moveToFirst();
                        return cursor.getString(column_index);
                    }
                    return uri.getPath();
                }     
                  // decode image
                public void decodeFile(String filePath) {
                    // Decode image size
                    BitmapFactory.Options o = new BitmapFactory.Options();
                    o.inJustDecodeBounds = true;
                    BitmapFactory.decodeFile(filePath, o);
                    // The new size we want to scale to
                    final int REQUIRED_SIZE = 1024;
                    // Find the correct scale value. It should be the power of 2.
                    int width_tmp = o.outWidth, height_tmp = o.outHeight;
                    int scale = 1;
                    while (true) {
                        if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE)
                            break;
                        width_tmp /= 2;
                        height_tmp /= 2;
                        scale *= 2;
                    }

                    // Decode with inSampleSize
                    BitmapFactory.Options o2 = new BitmapFactory.Options();
                    o2.inSampleSize = scale;
                    bitmap = BitmapFactory.decodeFile(filePath, o2);
                    Security connection = new Security(context);
                    Boolean isInternetPresent = connection.isConnectingToInternet(); // true or false
                    if (isInternetPresent) {
                        // submit usr information to server
                        //first upload file
                        updateUserProfileImage();
                        Log.i("IMAGEPATH", "" + imagePath);
                    }
                    profileImageView.setImageBitmap(bitmap);
                }