Android N FileUriExposedException
Guys My application uses a camera to take pictures. I am using the following code to take a snapshot
public void takepic(View view) {
TextView schtitle = (TextView) findViewById(R.id.Sitename);
String schname = schtitle.getText().toString();
String[] tokens = schname.split(" ");
String timeStamp = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss").format(new Date());
String imageFileName = tokens[0] + "-" + timeStamp + ".jpg";
TextView myAwesomeTextView = (TextView)findViewById(R.id.filetext);
//in your OnCreate() method
myAwesomeTextView.setText(imageFileName);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
String name = imageFileName;
File file = new File(path, name );
outputFileUri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, TAKE_PICTURE);
}
This works fine in all but Nougat
I understand how they did it in marshmallow, now you need permissions and no longer use the file URI.
I can't find any sample code on how to take a snapshot in nougat, can anyone point me in the right direction on how to change my code to make this happen?
Any help is appreciated
Mark
source to share
The problem is in the file: // uri is no longer allowed.
You should use FileProvider instead.
Take a look here: https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en
source to share
Just quote it here for reference.
We now have updated documentation on how to use camera intent with a uri file to store the captured image in the android training section.
https://developer.android.com/training/camera/photobasics.html
source to share
public void openShare(View view) {
// save bitmap to cache directory
try {
bitmap = ((BitmapDrawable) iv.getDrawable()).getBitmap();
File cachePath = new File(getCacheDir(), "images");
if (!cachePath.exists())
cachePath.mkdirs();
FileOutputStream stream = new FileOutputStream(cachePath + "/" + imageName);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
stream.close();
shareImage();
} catch (Exception e) {
e.printStackTrace();
}
}
private void shareImage() {
File imagePath = new File(getCacheDir(), "images");
File newFile = new File(imagePath, imageName);
Uri contentUri = MyFileProvider.getUriForFile(this, "com.example.kushaalsingla.contentsharingdemo", newFile);
if (contentUri != null) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri));
shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
startActivity(Intent.createChooser(shareIntent, "Choose an app"));
}
}
################## Add to manifest
<provider
android:name=".MyFileProvider"
android:authorities="com.example.kushaalsingla.contentsharingdemo"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
######################### filepaths.xml ########################
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="shared_images" path="images/"/>
</paths>
source to share