FileProvider.getUriForFile returns NullPointerException
First, this:
android:authorities="${applicationId}.fileprovider"
does not match this:
private static final String AUTHORITY = "org.broadinstitute.jsnap.provider";
Use the same algorithm in both places. So, replace the second line with:
private static final String AUTHORITY = BuildConfig.APPLICATION_ID+".fileprovider";
That will get you past the NullPointerException
.
Second, this:
File photo = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), FILENAME);
does not match this:
<external-path name="jsnap_images" path="Android/data/org.broadinstitute.jsnap/files/Pictures" />
Since I don't know which of those is what you really want, I cannot suggest a fix.
I know this is a pretty old question but this answer is for future viewers. So I've encountered a similar problem and after researching, I've found an alternative to this approach.
Your Intent here for eg: To view your image from your path
val intent = Intent()
intent.setAction(Intent.ACTION_VIEW)
val file = File(currentUri)
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
val contentURI = getContentUri(context!!, file.absolutePath)
intent.setDataAndType(contentURI,"image/*")
startActivity(intent)
Main Function below
private fun getContentUri(context:Context, absPath:String):Uri? {
val cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
arrayOf<String>(MediaStore.Images.Media._ID),
MediaStore.Images.Media.DATA + "=? ",
arrayOf<String>(absPath), null)
if (cursor != null && cursor.moveToFirst())
{
val id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID))
return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Integer.toString(id))
}
else if (!absPath.isEmpty())
{
val values = ContentValues()
values.put(MediaStore.Images.Media.DATA, absPath)
return context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
}
else
{
return null
}
}