title: FileUriExposedException in Android N with Camera
body: <p><strong>MainActivity</strong></p>
  
  <pre><code>import android.Manifest;
  import android.app.Activity;
  import android.app.AlertDialog;
  import android.content.ContentResolver;
  import android.content.ContentValues;
  import android.content.Context;
  import android.content.DialogInterface;
  import android.content.Intent;
  import android.content.pm.PackageManager;
  import android.content.pm.ResolveInfo;
  import android.graphics.Bitmap;
  import android.graphics.BitmapFactory;
  import android.net.Uri;
  import android.os.Build;
  import android.os.Environment;
  import android.os.Parcelable;
  import android.provider.MediaStore;
  import android.support.v4.app.ActivityCompat;
  import android.support.v4.content.ContextCompat;
  import android.support.v4.content.FileProvider;
  import android.support.v7.app.AppCompatActivity;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.View;
  import android.widget.Button;
  import android.widget.ImageView;
  import android.widget.Toast;
  
  import java.io.File;
  
  import java.io.FileInputStream;
  import java.io.FileNotFoundException;
  import java.io.IOException;
  import java.io.InputStream;
  import java.text.SimpleDateFormat;
  import java.util.ArrayList;
  import java.util.Date;
  import java.util.List;
  
  public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  
      private Button mBtn;
      private Context context;
      private static final int SELECT_PICTURE_CAMARA = 101, SELECT_PICTURE = 201, CROP_IMAGE = 301;
      private Uri outputFileUri;
      String mCurrentPhotoPath;
      private Uri selectedImageUri;
      private File finalFile = null;
      private ImageView imageView;
      private PermissionUtil permissionUtil;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      mBtn = (Button) findViewById(R.id.btn_img);
      imageView = (ImageView) findViewById(R.id.img_photo);
      permissionUtil = new PermissionUtil();
      mBtn.setOnClickListener(this);
      context = this;
  }
  
  @Override
  public void onClick(View view) {
      selectImageOption();
  }
  
  private void selectImageOption() {
      final CharSequence[] items = {"Capture Photo", "Choose from Gallery", "Cancel"};
  
      AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
      builder.setTitle("Add Photo!");
      builder.setItems(items, new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int item) {
              if (items[item].equals("Capture Photo")) {                
                  if (permissionUtil.checkMarshMellowPermission()) {
                      if (permissionUtil.verifyPermissions(MainActivity.this, permissionUtil.getCameraPermissions()))
                          onClickCamera();
                      else
                          ActivityCompat.requestPermissions(MainActivity.this, permissionUtil.getCameraPermissions(), SELECT_PICTURE_CAMARA);
                  } else
                      onClickCamera();
              } else if (items[item].equals("Choose from Gallery")) {
                  if (permissionUtil.checkMarshMellowPermission()) {
                      if (permissionUtil.verifyPermissions(MainActivity.this, permissionUtil.getGalleryPermissions()))
                          onClickGallery();
                      else
                          ActivityCompat.requestPermissions(MainActivity.this, permissionUtil.getGalleryPermissions(), SELECT_PICTURE);
                  } else
                      onClickGallery();
              } else if (items[item].equals("Cancel")) {
                  dialog.dismiss();
              }
          }
      });
      builder.show();
  }
  
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
  
      if (resultCode == RESULT_OK) {
  
          if (requestCode == SELECT_PICTURE) {
  
              selectedImageUri = data.getData();
              cropImage(selectedImageUri);
  
          } else if (requestCode == CROP_IMAGE) {
              /*if (data != null) {
                  // get the returned data
                  Bundle extras = data.getExtras();
                  // get the cropped bitmap
                  Bitmap selectedBitmap = extras.getParcelable("data");
  
                  imageView.setImageBitmap(selectedBitmap);
              }*/
  
              Uri imageUri = Uri.parse(mCurrentPhotoPath);
              File file = new File(imageUri.getPath());
              try {
                  InputStream ims = new FileInputStream(file);
                  imageView.setImageBitmap(BitmapFactory.decodeStream(ims));
              } catch (FileNotFoundException e) {
                  return;
              }
  
          } else if (requestCode == SELECT_PICTURE_CAMARA &amp;&amp; resultCode == Activity.RESULT_OK) {
              cropImage(Uri.parse(mCurrentPhotoPath));
  
          }
      }
  }
  
  private void onClickCamera() {
      Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  
      if (takePictureIntent.resolveActivity(context.getPackageManager()) != null) {
          File photoFile = null;
          try {
              photoFile = createImageFile();
          } catch (IOException ex) {
          }
          if (photoFile != null) {
  
              Uri photoURI;
              if (Build.VERSION.SDK_INT &gt;= 24) {
                  photoURI = FileProvider.getUriForFile(MainActivity.this,
                          BuildConfig.APPLICATION_ID + ".provider", photoFile);
              } else {
                  photoURI = Uri.fromFile(photoFile);
              }
  
              takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
              startActivityForResult(takePictureIntent, SELECT_PICTURE_CAMARA);
  
          }
      }
  }
  
  private void onClickGallery() {
      List&lt;Intent&gt; targets = new ArrayList&lt;&gt;();
      Intent intent = new Intent();
      intent.setType("image/*");
      intent.setAction(Intent.ACTION_PICK);
      intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
      List&lt;ResolveInfo&gt; candidates = getApplicationContext().getPackageManager().queryIntentActivities(intent, 0);
  
      for (ResolveInfo candidate : candidates) {
          String packageName = candidate.activityInfo.packageName;
          if (!packageName.equals("com.google.android.apps.photos") &amp;&amp; !packageName.equals("com.google.android.apps.plus") &amp;&amp; !packageName.equals("com.android.documentsui")) {
              Intent iWantThis = new Intent();
              iWantThis.setType("image/*");
              iWantThis.setAction(Intent.ACTION_PICK);
              iWantThis.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
              iWantThis.setPackage(packageName);
              targets.add(iWantThis);
          }
      }
      if (targets.size() &gt; 0) {
          Intent chooser = Intent.createChooser(targets.remove(0), "Select Picture");
          chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targets.toArray(new Parcelable[targets.size()]));
          startActivityForResult(chooser, SELECT_PICTURE);
      } else {
          Intent intent1 = new Intent(Intent.ACTION_PICK);
          intent1.setType("image/*");
          startActivityForResult(Intent.createChooser(intent1, "Select Picture"), SELECT_PICTURE);
      }
  }
  
  private File createImageFile() throws IOException {
      // Create an image file name
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
      String imageFileName = "JPEG_" + timeStamp + "_";
  
      File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
      File image = File.createTempFile(
              imageFileName,  /* prefix */
              ".jpg",         /* suffix */
              storageDir      /* directory */
      );
  
      // Save a file: path for use with ACTION_VIEW intents
      if (Build.VERSION.SDK_INT &gt;= 24) {
          mCurrentPhotoPath = String.valueOf(FileProvider.getUriForFile(MainActivity.this,
                  BuildConfig.APPLICATION_ID + ".provider", image));
      } else {
          mCurrentPhotoPath = String.valueOf(Uri.fromFile(image));
      }
  
      return image;
  }
  
  private void cropImage(Uri selectedImageUri) {
      Intent cropIntent = new Intent("com.android.camera.action.CROP");
  
      cropIntent.setDataAndType(selectedImageUri, "image/*");
  
      cropIntent.putExtra("crop", "true");
      cropIntent.putExtra("aspectX", 1);
      cropIntent.putExtra("aspectY", 1.5);
      cropIntent.putExtra("return-data", true);
  
      outputFileUri = Uri.fromFile(createCropFile());
  
      cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
      startActivityForResult(cropIntent, CROP_IMAGE);
  }
  
  private File createCropFile() {
      File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
      //  path = path + (timeStamp + "1jpg");
      File file = null;
      try {
          file = File.createTempFile(timeStamp, ".jpg", storageDir);
      } catch (IOException e) {
          e.printStackTrace();
      }
  
      mCurrentPhotoPath = String.valueOf(Uri.fromFile(file));
      return file;
  }
  }
  </code></pre>
  
  <p><strong>PermissionUtil.java</strong></p>
  
  <pre><code>package com.example.shwetachauhan.imagecropasoebi;
  
  import android.content.Context;
  import android.content.pm.PackageManager;
  import android.os.Build;
  import android.support.v4.app.ActivityCompat;
  
  public class PermissionUtil {
      private String[] galleryPermissions = {
          "android.permission.WRITE_EXTERNAL_STORAGE",
          "android.permission.READ_EXTERNAL_STORAGE"
  };
  
  private String[] cameraPermissions = {
          "android.permission.CAMERA",
          "android.permission.WRITE_EXTERNAL_STORAGE",
          "android.permission.READ_EXTERNAL_STORAGE"
  };
  
  public String[] getGalleryPermissions(){
      return galleryPermissions;
  }
  
  public String[] getCameraPermissions() {
      return cameraPermissions;
  }
  
  public boolean verifyPermissions(int[] grantResults) {
      if(grantResults.length &lt; 1){
          return false;
      }
  
      for (int result : grantResults) {
          if (result != PackageManager.PERMISSION_GRANTED) {
              return false;
          }
      }
      return true;
  }
  
  public boolean verifyPermissions(Context context, String[] grantResults) {
      for (String result : grantResults) {
          if (ActivityCompat.checkSelfPermission(context, result) != PackageManager.PERMISSION_GRANTED) {
              return false;
          }
      }
      return true;
  }
  
  public boolean checkMarshMellowPermission(){
      return(Build.VERSION.SDK_INT&gt; Build.VERSION_CODES.LOLLIPOP_MR1);
  }
  
  public boolean checkJellyBean(){
      return(Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.JELLY_BEAN);
  }
  }
  </code></pre>
  
  <ul>
  <li>This code is for pick image for crop from Camera or Gallery</li>
  <li>This code is works for all android OS but when I try to run On Android N device it crash when I open Camera. It works fine in Android N with Gallery.</li>
  </ul>