'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 |
|---|
