This might be a possible duplicate but i can't seem to pinpoint the exact solution. Camera works fine and returns the image uri on devices below api 23. However app crushes right after capturing image on devices apove api 23 with log error
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { act=inline-data (has extras) }} to activity {ana.foodi/ana.foodi.MainActivity}: java.lang.NullPointerException: uri
at android.app.ActivityThread.deliverResults(ActivityThread.java:3940)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3983)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1548)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5765)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: java.lang.NullPointerException: uri
at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:60)
at android.content.ContentResolver.query(ContentResolver.java:481)
at android.content.ContentResolver.query(ContentResolver.java:441)
at ana.foodi.MainActivity.onActivityResult(MainActivity.java:672)
After checking with breakpoints,realised Uri (selectedImage) is null below:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
final String filePath;
if(resultCode == Activity.RESULT_OK && REQUEST_POST_PHOTO==999){
if(requestCode == 2 ) {
requestRuntimePermission();
Uri selectedImage = data.getData();
String[] filePaths = {MediaStore.Images.Media.DATA};
Cursor c = this.getContentResolver().query(selectedImage, filePaths, null, null, null);
c.moveToFirst();
int columnIndex = c.getColumnIndex(filePaths[0]);
filePath = c.getString(columnIndex);
c.close();
I've tried requesting runtime permission with this
public void requestRuntimePermission() {
if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(context,android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
}
but error persist.
startActivityForResult call
REQUEST_POST_PHOTO=999;
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, REQUEST_CODE_POST);
At least for older versions, if multiple selection is allowed (
Intent#EXTRA_ALLOW_MULTIPLE
), URIs will be returned as clipboard data:See
Intent#getClipData()
andClipData
.Check if data is being returned there:
Try this
Use both
WRITE_EXTERNAL_STORAGE
andWRITE_EXTERNAL_STORAGE
to read and write fileHere ask to write permission & read permission add multiple permission
Check this Android 6.0 multiple permissions
//Check permission granted or not if granted then call this block
You are using
ACTION_IMAGE_CAPTURE
.ACTION_IMAGE_CAPTURE
is not supposed to return aUri
viaonActivityResult()
. Instead, either:You provide
EXTRA_OUTPUT
on theACTION_IMAGE_CAPTURE
Intent
, in which case the image is supposed to be saved to that location (see this sample app), orYou do not provide
EXTRA_OUTPUT
on theACTION_IMAGE_CAPTURE
Intent
, in which case you get a thumbnailBitmap
back via the"data"
extra on theIntent
delivered toonActivityResult()
This is covered in the documentation.
Some buggy camera apps will return a
Uri
. Do not count on this behavior, as well-written camera apps will not.If you get permissions (camera, read/write external storage permissions) from user, this code snippet will work correctly. You can call cameraIntent().