0

CODE

    mCameraButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int permissionCheck = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA);
            if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                startCameraActivity();
                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
                    startActivityForResult(cameraIntent, 1000);
                }
            }
            else {
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, 1000);
            }

        }
    });

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode==1000 && grantResults.length > 0){
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
            startActivityForResult(cameraIntent, 1000);
        }

    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == 1000) {
            first_getUri = data.getData();
            Bitmap bitmap = null;
            try {
                bitmap = getBitmapFromUri(first_getUri); //Here is problem
            } catch (IOException e) {
                Toast.makeText(getContext(), getString(R.string.failed_in_creating_bitmap_from_uri), Toast.LENGTH_LONG).show();

            }

            File imageFile = null;
            try {
                imageFile = createFileFromBitmap(bitmap);
            } catch (IOException e) {
                Toast.makeText(getContext(), getString(R.string.failed_in_creating_file_from_bitmap), Toast.LENGTH_LONG).show();

            }
            returnUri = Uri.fromFile(imageFile);
        }
        Glide.with(this)
                .load(returnUri)
                .override(1280, 1280)
                .into(mImageview);
    }
}

On this code, opening camera is doing well, but when i take a picture and enter,

Error is shown.

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=66536, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.keepair.www.pinair/com.keepair.www.pinair.MainActivity}: java.lang.NullPointerException: uri
Caused by: java.lang.NullPointerException: uri

On line of onActivityResult's uri part - bitmap = getBitmapFromUri(first_getUri);

I think i cant get uri from CameraActivity.

How can i get correct uri of picture that was taken?

Would you teach me please?

EDIT

private Bitmap getBitmapFromUri(Uri uri) throws IOException {
    ParcelFileDescriptor parcelFileDescriptor =
            getActivity().getContentResolver().openFileDescriptor(uri, "r");
    FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();

    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inJustDecodeBounds = true;
    BitmapFactory.decodeFileDescriptor(fileDescriptor, null, opts);

    int width = opts.outWidth;
    int height = opts.outHeight;

    float sampleRatio = getSampleRatio(width, height);

    opts.inJustDecodeBounds = false;
    opts.inSampleSize = (int) sampleRatio;

    Bitmap resizedBitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor, null, opts);
    Log.d("Resizing", "Resized Width / Height : " + resizedBitmap.getWidth() + "/" + resizedBitmap.getHeight());
    parcelFileDescriptor.close();
    return resizedBitmap;
}

private float getSampleRatio(int width, int height) {

    final int targetWidth = 1280;
    final int targetheight = 1280;

    float ratio;

    if (width > height) {
        // Landscape
        if (width > targetWidth) {
            ratio = (float) width / (float) targetWidth;
        } else ratio = 1f;
    } else {
        // Portrait
        if (height > targetheight) {
            ratio = (float) height / (float) targetheight;
        } else ratio = 1f;
    }
    return Math.round(ratio);
}

private File createFileFromBitmap(Bitmap bitmap) throws IOException {
    File newFile = new File(getActivity().getFilesDir(), makeImageFileName());
    FileOutputStream fileOutputStream = new FileOutputStream(newFile);
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
    fileOutputStream.close();
    return newFile;
}

private String makeImageFileName() {

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_hhmmss");
    Date date = new Date();
    String strDate = simpleDateFormat.format(date);
    return strDate + ".png";
}

Crash Logs

FATAL EXCEPTION: main
Process: com.keepair.www.pinair, PID: 4827
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=263144, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.keepair.www.pinair/com.keepair.www.pinair.MainActivity}: java.lang.NullPointerException: uri
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
    at android.app.ActivityThread.-wrap16(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: uri
    at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:60)
    at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:922)
    at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:795)
    at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:749)
    at com.keepair.www.pinair.GreenFragment.getBitmapFromUri(GreenFragment.java:385)
    at com.keepair.www.pinair.GreenFragment.onActivityResult(GreenFragment.java:357)
    at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:165)
    at android.app.Activity.dispatchActivityResult(Activity.java:6428)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 
    at android.app.ActivityThread.-wrap16(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Kamran Ahmed
  • 7,661
  • 4
  • 30
  • 55
H.fate
  • 644
  • 2
  • 7
  • 18

3 Answers3

2

This code is tested on 6.0 and 7.0 as well

     private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
    public static final int MEDIA_TYPE_IMAGE = 1;

    private static final int CROP_FROM_CAMERA = 2;
    private static final int PICK_FROM_FILE = 3;


    public static final int camPermissionRequestCode=6;
    public static final int galleryPermissionRequestCode=4;

    private Uri imageUri;

    private File profilePicPicked;



  @Override
    public void onClick(View v) {


        int id=v.getId();

        switch (id){


            case R.id.camera:
                if (Build.VERSION.SDK_INT >= 23) {
                    //do your check here

                    isStoragePermissionGranted(camPermissionRequestCode);

                } else {

                    captureImage();

                }

                break;
            case R.id.upload_image:

                if (Build.VERSION.SDK_INT >= 23) {
                    //do your check here
                    isStoragePermissionGranted(galleryPermissionRequestCode);

                } else {

                    pickFromGallery();

                }


                break;

        }

    }





    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub


        if (resultCode != Activity.RESULT_OK)
            return;



        switch (requestCode) {
            case CAMERA_CAPTURE_IMAGE_REQUEST_CODE:
                /**
                 * After taking a picture, do the crop
                 */


                File file2 = handleImageUri(imageUri,getContext());


                try {

                    ExifInterface ei = new ExifInterface(file2.getAbsolutePath());
                    int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                            ExifInterface.ORIENTATION_UNDEFINED);

                    switch (orientation) {
                        case ExifInterface.ORIENTATION_ROTATE_90:
                            file2=rotateImage(file2, 90);
                           /* Toast.makeText(getActivity(),"90",Toast.LENGTH_SHORT).show();*/
                            break;
                        case ExifInterface.ORIENTATION_ROTATE_180:
                            file2=rotateImage(file2, 180);
                           /* Toast.makeText(getActivity(),"180",Toast.LENGTH_SHORT).show();*/
                            break;
                        case ExifInterface.ORIENTATION_ROTATE_270:
                            file2=rotateImage(file2, 270);
                           /* Toast.makeText(getActivity(),"270",Toast.LENGTH_SHORT).show();*/
                            break;
                        case ExifInterface.ORIENTATION_NORMAL:
                            /*Toast.makeText(getActivity(),"default",Toast.LENGTH_SHORT).show();*/
                        default:
                            break;

                    }

                }catch (Exception e){

                    e.printStackTrace();
                }


                profilePicPicked= file2;


                break;

            case PICK_FROM_FILE:
                /**
                 * After selecting image from files, save the selected path
                 */

                /*Toast.makeText(getContext(), "Image Taken", Toast.LENGTH_LONG).show();*/
                imageUri = data.getData();

                //iv_post.setImageURI(fileUri);
                File fileGAllr = getRealPathFromURIForGallery(getActivity(),imageUri);

                profilePicPicked=fileGAllr;


                // new Updata().execute("");
                // btn_gallery.setVisibility(View.GONE);

                break;

            case CROP_FROM_CAMERA:

                break;

        }

    }



    public static File getRealPathFromURIForGallery(Context context, Uri uri) {
        File file = null;
        try {


            String extension="";
            String[] filePathColumn = {MediaStore.Images.Media.DATA};
            Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null);
            if (cursor.moveToFirst()) {
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String filePath = cursor.getString(columnIndex);
                extension= filePath.substring(filePath.lastIndexOf("."));
                System.out.print("");
            }
            cursor.close();

            InputStream input = null;
            input = context.getContentResolver().openInputStream(uri);

            if (input == null) {
                return null;
            }
            file = new File(context.getCacheDir(), System.currentTimeMillis()+"_Photo"+extension);
            OutputStream output = new FileOutputStream(file);
            try {
                byte[] buffer = new byte[4 * 1024];
                int read;
                while ((read = input.read(buffer)) != -1) {
                    output.write(buffer, 0, read);
                }
                output.flush();
            } finally {
                output.close();
                input.close();
            }
        } catch (IOException e) {
            Log.d("Error", e.toString());
        }
        return file;
    }




    public File  rotateImage(File f, float angle) {

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        Bitmap source = BitmapFactory.decodeFile(f.getAbsolutePath(), options);
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);


        Bitmap finalBm= Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);

        File editedFile=getOutputMediaFile(MEDIA_TYPE_IMAGE);
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(editedFile);
            finalBm.compress(Bitmap.CompressFormat.JPEG, 100, out); // bmp is your Bitmap instance
            // PNG is a lossless format, the compression factor (100) is ignored
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        f.delete();

        return editedFile;
    }


    public static File handleImageUri(Uri uri, Context context) {
        Pattern pattern = Pattern.compile("(content://media/.*\\d)");
        Matcher matcher = pattern.matcher(uri.getPath());
        if (matcher.find()) {
            return getRealPathFromURI(context, uri);
        } else {
            return new File(uri.getPath());
        }
    }


    public static File getRealPathFromURI(Context context, Uri uri) {
        File file = null;
        try {
            InputStream input = null;
            input = context.getContentResolver().openInputStream(uri);

            if (input == null) {
                return null;
            }
            file = new File(context.getCacheDir(), System.currentTimeMillis()+"Photo.png");
            OutputStream output = new FileOutputStream(file);
            try {
                byte[] buffer = new byte[4 * 1024];
                int read;
                while ((read = input.read(buffer)) != -1) {
                    output.write(buffer, 0, read);
                }
                output.flush();
            } finally {
                output.close();
                input.close();
            }
        } catch (IOException e) {
            Log.d("Error", e.toString());
        }
        return file;
    }


    public  boolean isStoragePermissionGranted(int requsetCode) {
        if (Build.VERSION.SDK_INT >= 23) {
            if (ContextCompat.checkSelfPermission(getActivity(),android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {

                if(requsetCode==camPermissionRequestCode){

                    captureImage();
                }else{

                    pickFromGallery();
                }
                return true;
            } else {


                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requsetCode);
                return false;
            }
        }
        else { //permission is automatically granted on sdk<23 upon installation

            if(requsetCode==camPermissionRequestCode){

                captureImage();
            }else{

                pickFromGallery();
            }
            return true;
        }


    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(grantResults[0]== PackageManager.PERMISSION_GRANTED){

            if(requestCode==camPermissionRequestCode){

                captureImage();
            }else if(requestCode==galleryPermissionRequestCode){

                pickFromGallery();
            }
            //resume tasks needing this permission
        }
    }



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

        imageUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

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


    private void pickFromGallery(){

        Intent i = new Intent(
                Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, PICK_FROM_FILE);
    }


    public Uri getOutputMediaFileUri(int type) {
        return Uri.fromFile(getOutputMediaFile(type));
    }


    private File getOutputMediaFile(int type) {
        // TODO Auto-generated method stub
        // External sdcard location
        File mediaStorageDir = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                "marcopolo");

        // 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",
                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;
    }
Adeel Turk
  • 897
  • 8
  • 23
  • @H.fate Actually on some of the devices data.getData returns null and on some of the devices it returns the file path of thumbnail only. there was another issue which faced and then i solved in this source was that some of devices returns the rotated bitmap. So i think it would be helpfull source for all !! Happy coding !! :) – Adeel Turk Nov 08 '16 at 05:57
  • Thanks for comment @Adeel Turk – H.fate Nov 08 '16 at 18:34
1

Generally speaking, the main contradiction is that data.getData() on some phone returns null.

so try this

add your fragment

FragmentTransaction fragmentTransaction =  getSupportFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.container, new TestFragment(), "cam");
fragmentTransaction.commit();

in fragment

// you can config a path to save photo and put this path to intent
// if you don't config a path, you can not get the uri path
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
    getActivity().startActivityForResult(cameraIntent, 1000);
}

on Activity#onActivityResult()

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    getSupportFragmentManager().findFragmentByTag("tag").onActivityResult(requestCode, resultCode, data);
}

on fragment#onActivityResult()

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1000) {
        if (resultCode == Activity.RESULT_OK) {
            Bundle bundle = data.getExtras();
            Bitmap bitmap = bundle.get("data");
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}
grantonzhuang
  • 557
  • 4
  • 6
1
mCameraButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
                openCameraMethod();//write the code to open camera
            }else  checkForPermission();

    }
});


@Override
public void onRequestPermissionsResult(int requestCode, String[]   permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_PERMISSIONS:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
        openCameraMethod();//write the code to open camera

            } else {
                // Permission Denied
                Toast.makeText(MainActivity.this, "Camera permission is Denied", Toast.LENGTH_SHORT)
                        .show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}




   private void checkForPermission() {
    int hasWriteContactsPermission = ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.CAMERA);
    if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
        if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            showMessageOKCancel("You need to allow access Camera",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                    REQUEST_CODE_ASK_PERMISSIONS);
                        }
                    });
            return;
        }
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_CODE_ASK_PERMISSIONS);
        return;
    }
  openCameraMethod();//write the code to open camera
}


   @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data)
  {

  //same code what ever u wnat to do


     }
shaik subhani
  • 169
  • 2
  • 12