Reputation:
This is the code
public void openCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory(), "image.jpg");
imageURI = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageURI);
startActivityForResult(intent, CAMERA);
}
Here is the error
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.app, PID: 2971
: file:///storage/emulated/0/image.jpg exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1958)
at android.net.Uri.checkFileUriExposed(Uri.java:2348)
at android.content.ClipData.prepareToLeaveProcess(ClipData.java:941)
at android.content.Intent.prepareToLeaveProcess(Intent.java:9735)
at android.content.Intent.prepareToLeaveProcess(Intent.java:9720)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1609)
at android.app.Activity.startActivityForResult(Activity.java:4472)
at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:65)
at android.app.Activity.startActivityForResult(Activity.java:4430)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:711)
at com.kushy.features.sell.CommunityPostActivity.openCamera(CommunityPostActivity.java:414)
at com.kushy.features.sell.CommunityPostActivity$11.onClick(CommunityPostActivity.java:388)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Tried File Provider but I'm not sure how to implement it. made to code not run. Sorry... i suck
Upvotes: 1
Views: 610
Reputation: 112
If your targetSdkVersion >= 24, you can not use file: Uri values in Intents on Android 7.0+ devices.You can change your code like this:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
ContentValues contentValues = new ContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, CAMERA);
For more details:Android camera intent FileUriExposedException for SDK >= 24 and https://developer.android.com/training/secure-file-sharing/setup-sharing
Upvotes: 0
Reputation: 11565
Use this code to get uri for android N or upper :
private Uri getFileUri(Context context, Uri fileUri, File file) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return FileProvider.getUriForFile(context, context.getPackageName() + ".provider", file);
} else {
return fileUri;
}
}
and don't forget to add flag with intent :
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Upvotes: 1