'video capture intent in android 31 - Only owner is able to interact with pending item

This is standard code for capturing video in android:

compileSdk and targetSdk is 31

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    binding.btn.setOnClickListener {
        Log.v(TAG, "addVideoFromCamera")
        val takePictureIntent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
        addVideoFromCameraLauncher.launch(takePictureIntent)
    }
}

val addVideoFromCameraLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
) { result ->
    val data = result.data

    if (result.resultCode == Activity.RESULT_OK && data != null){
        if (data?.getData() != null) {
            val videoUri: Uri = data.getData()!!
            Log.v(TAG, "addVideoFromCameraLauncher result videoUri=$videoUri")

            // here we dont call takePersistableUriPermission, which
            // would throw an exception like:
            // java.lang.SecurityException: No persistable permission grants found for UID 10147 and Uri content://media/external_primary/video/media/62

            CoroutineScope(Dispatchers.Main).launch{
                try {
                    getContentResolver().openInputStream(videoUri)?.close();
                    Log.d(TAG, "openInputStream ok")
                }catch(ex:Exception){
                    Log.d(TAG, "openInputStream error", ex)
                }
            }
        }
    }
}

It usually produces log like this:

V/Thd/testvideo: addVideoFromCameraLauncher result videoUri=content://media/external/video/media/252778 D/Thd/testvideo: openInputStream ok

BUT When running on android emulator api level 31, it produces this error:

V/Thd/testvideo: addVideoFromCamera D/OpenGLRenderer: endAllActiveAnimators on 0x7e9e47763890 (RippleDrawable) with handle 0x7e9d5777f080 V/Thd/testvideo: addVideoFromCameraLauncher result videoUri=content://media/external_primary/video/media/64 D/Thd/testvideo: openInputStream error java.lang.IllegalStateException: Only owner is able to interact with pending item content://media/external_primary/video/media/64 at android.os.Parcel.createExceptionOrNull(Parcel.java:2433) at android.os.Parcel.createException(Parcel.java:2409) at android.os.Parcel.readException(Parcel.java:2392) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:190) at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:153) at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:780) at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:2027) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1842) at android.content.ContentResolver.openInputStream(ContentResolver.java:1518) at com.danitest.myapplication.MainActivity$addVideoFromCameraLauncher$1$1.invokeSuspend(MainActivity.kt:62)

I couldn't test on a real android 12 (api 31) device, but clients complaint about a similar error on their devices although I don't have the stack trace.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source