0

I had to update my app to work along with the new android versions, targeting the N version, I Updated:

from:

Uri.fromFile();

to:

FileProvider.getUriForFile();

I did this as follows:

Based on: ( android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData() )

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

provider_paths:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-cache-path name="external_files" path="."/>
</paths>

FntTakePicture:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState)

//......
//......

btnTakePicture.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        if (takePictureIntent.resolveActivity(getContext().getPackageManager()) != null) {


            outputFileName = null;
            try {

                /*if(fragmentPosition == 0 || fragmentPosition == 4)
                    outputFileName = Images.createImageFile2();//PNG
                else
                    outputFileName = Images.createImageFile3();//JPG*/

                outputFileName = Images.createImageFile3();

                //takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(outputFileName));
                Uri photoURI = FileProvider.getUriForFile(getContext(),"com.mydomain.fileprovider",outputFileName);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);
                takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

                startActivityForResult(takePictureIntent, RC_IMAGE_CAPTURE);

            } catch (IOException e) {
                e.printStackTrace();
                FirebaseCrash.report(e);
            }

        }
    }
});

}

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

    if (requestCode == RC_IMAGE_CAPTURE && resultCode == RESULT_OK) {

        loadImage(outputFileName.getAbsolutePath());//outputFileName.getAbsolutePath()

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            txtInstructions.setText(Html.fromHtml(
                    String.format(
                            getResources().getString(R.string.validate_picture2),
                            defaultValidateText
                    ),Html.FROM_HTML_MODE_LEGACY
            ));

        } else {
            txtInstructions.setText(Html.fromHtml(
                    String.format(
                            getResources().getString(R.string.validate_picture2),
                            defaultValidateText
                    )), TextView.BufferType.SPANNABLE);
        }

        btnTakePicture.setText(getString(R.string.take_photo_again));
        //this.data.setImage(Images.compressImage(picture),fragmentPosition);
        this.data.setImage(outputFileName.getAbsolutePath(),fragmentPosition);
        Log.e("Data Picture"," Vin: "+this.data.getVin()+" lon: "+this.data.getLon()+ " lat: "+this.data.getLat());


        if(lastPage)
        validateContinueBoton();
        listener.save(this.data);
    }
}

public void loadImage(final String path){
    new AsyncTask<Void,Void,Bitmap>(){

        @Override
        protected Bitmap doInBackground(Void... params) {

            return Images.decodeSampledBitmapFromFile(path,
                    getResources().getDimensionPixelSize(R.dimen.ancho_default)/2);
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            imgPictureTaken.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imgPictureTaken.setImageBitmap(bitmap);
        }
    }.execute(null,null,null);
}

Images Class:

public class Images{


    static File createImageFile3() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",Locale.US).format(new Date());
        String imageFileName = "NTS_Image_" + timeStamp + "_";
        File storageDir = ContextCompat.getExternalCacheDirs(App.getContext())[0];

        File nf = File.createTempFile(
                imageFileName,  // prefix
                ".jpg",         // suffix
                storageDir      // directory
        );

        nf.deleteOnExit();
        return nf;
    }
}

Also, this event is in a fragment, I don't know if that's matters.

After run install app give it permissions then crash once it works normally…

The exception I got it this:

04-17 15:00:10.058 669-669/? E/cnss-daemon: Stale or unreachable neighbors, ndm state: 4 04-17 15:00:10.202 13596-13596/com.mydomain E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mydomain, PID: 13596 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=74538, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.mydomain/com.mydomain.CaptureWizard}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference at android.app.ActivityThread.deliverResults(ActivityThread.java:4094) at android.app.ActivityThread.handleSendResult(ActivityThread.java:4137) at android.app.ActivityThread.-wrap20(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1529) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference at com.mydomain.FntTakePicture.onActivityResult(FntTakePicture.java:201) at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:164) at com.mydomain.CaptureWizard.onActivityResult(CaptureWizard.java:133) at android.app.Activity.dispatchActivityResult(Activity.java:6931) at android.app.ActivityThread.deliverResults(ActivityThread.java:4090) at android.app.ActivityThread.handleSendResult(ActivityThread.java:4137) at android.app.ActivityThread.-wrap20(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1529) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

Community
  • 1
  • 1
Lord_Gama
  • 269
  • 1
  • 4
  • 12
  • Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference at com.mydomain.FntTakePicture.onActivityResult(FntTakePicture.java:201) – Marcin Orlowski Apr 17 '17 at 21:21

1 Answers1

0

Make sure that you are saving outputFileName in your saved instance state Bundle. Your process may be terminated while your app is in the background, which would cause that field to become null by default in your new process.

CommonsWare
  • 910,778
  • 176
  • 2,215
  • 2,253