Chapter 17: Taking Pictures With Intents - Problem Getting ActivityResult's Intent

After including the code for opening camera app, I got an error in this section:

val captureImageIntent = takePhoto.contract.createIntent(
requireContext(),
null,
)

The error goes like :
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bignerdranch.android.criminal_intent_22_2, PID: 23861
java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter input
at androidx.activity.result.contract.ActivityResultContracts$TakePicture.createIntent(Unknown Source:7)
at androidx.activity.result.contract.ActivityResultContracts$TakePicture.createIntent(ActivityResultContracts.kt:275)
at com.bignerdranch.android.criminal_intent_22_2.CrimeDetailFragment.onViewCreated(CrimeDetailFragment.kt:133)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3128)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1890)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1814)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1751)
at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:538)
at android.os.Handler.handleCallback(Handler.java:794)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6651)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

It is solved only after setting photoUri a class level variable, populating it before this intent-extraction step and using it there, like below:

val captureImageIntent = takePhoto.contract.createIntent(
requireContext(),
photoUri,
)

Is it the expected solution or have I messed something up?

No, it looks like you might have found a bug in our code. Your fix works well. Another option people could take is replacing the null with Uri.parse("") so you code looks like:

val captureImageIntent = takePhoto.contract.createIntent(
    requireContext(),
    Uri.parse(""),
)

That particular value isn’t really used by anything. It just needs to be there because the API needs something there in other use cases regarding communicating with other apps. Older versions of libraries allowed nullable types for that particular value, but it looks like it only accepts non-null Uris now.

1 Like