1

My Sample app is working well with the earlier version(before Android M) but getting crash while performing compression after being fetched from internal storage since height and width is coming -1.

Bitmap bmp = BitmapFactory.decodeFile(filePath, options);    
int actualHeight = options.outHeight;
int actualWidth = options.outWidth;

After doing some research, I come to the conclusion that the the file is getting corrupted at the time of clicking an image in Android N & M, may be since I'm saving the images as a temporary file not sure.

The following code I'm using for clicking an image:

public void takePhoto() {
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    File f = null;
    try {
        f = setUpPhotoFile();
        mCurrentPhotoPath = f.getAbsolutePath();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(ctx.getContext(),"com.example.fileprovider", f);
        }
        else{
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
        }

    } catch (IOException e) {
        e.printStackTrace();
        f = null;
        mCurrentPhotoPath = null;
    }

    ctx.startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
}

fileprovider.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="images" path="Pictures/AIADMK/"/>
</paths>

manifest.xml

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/fileprovider" />
</provider>

The below is the crash error:

java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Pictures/AIADMK/IMG_20170428_122804_1986080142.jpg
    at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
    at helper.ImageHelper.takePhoto(ImageHelper.java:108)
    at helper.ImageHelper$1.onClick(ImageHelper.java:73)
    at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1134)
    at android.widget.AdapterView.performItemClick(AdapterView.java:315)
    at android.widget.AbsListView.performItemClick(AbsListView.java:1193)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3231)
    at android.widget.AbsListView$3.run(AbsListView.java:4207)
    at android.os.Handler.handleCallback(Handler.java:815)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Looper.loop(Looper.java:207)
    at android.app.ActivityThread.main(ActivityThread.java:5769)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

Where am I going wrong?

Pang
  • 9,564
  • 146
  • 81
  • 122
Pranesh Sahu
  • 595
  • 5
  • 26

4 Answers4

1

Add required permissions check before requesting to camera and in addition

For Android N, add this code in onCreate() method of your Application class.

   if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) {
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());
    }

No need to specify provider or path with this.

Note-Using provider is still the best way to do same task.

hope it help someone !

Gagan
  • 745
  • 10
  • 31
0

check permission for marshmallow

if (Build.VERSION.SDK_INT >= 23 &&
                    (ContextCompat.checkSelfPermission(yourActivityContext, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)) {
                ActivityCompat.requestPermissions(yourActivityContext, new String[]{Manifest.permission.CAMERA}, 2//requestCode);
            } else {
                selectImage();
            }

And override onRequestPermissionsResult of Activity

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
      case 2: //same request code you provided in code above

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                   selectImage();

                }


            break;
       }
}
Harihar
  • 35
  • 1
  • 7
0
  1. Check for permission for API 23 and above refer this http://www.coderzheaven.com/2016/07/29/simple-example-on-using-camera-access-permission-in-android-marshmallow/

  2. Check your onActivityResult() is it give you output in bitmap or uri.

3.If you are getting output in uri convert it into bitmap.

0

The issue is the latest version of Android because in Android M & N we have to use FileProvider in order to persist the file and for earlier version we can use Uri.fromFile(f). I do have to change my fileprovider.xml as listed below:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <external-path name="myexternalimages" path="Pictures/AIADMK" />
</paths>
Pranesh Sahu
  • 595
  • 5
  • 26