diff --git a/.changeset/funny-pugs-cover.md b/.changeset/funny-pugs-cover.md new file mode 100644 index 00000000..e1fb1ff9 --- /dev/null +++ b/.changeset/funny-pugs-cover.md @@ -0,0 +1,5 @@ +--- +"@react-native-documents/picker": patch +--- + +fix(android): invalid column flags error in picker diff --git a/packages/document-picker/android/src/main/java/com/reactnativedocumentpicker/MetadataGetter.kt b/packages/document-picker/android/src/main/java/com/reactnativedocumentpicker/MetadataGetter.kt index 36bc2de9..1e26a984 100644 --- a/packages/document-picker/android/src/main/java/com/reactnativedocumentpicker/MetadataGetter.kt +++ b/packages/document-picker/android/src/main/java/com/reactnativedocumentpicker/MetadataGetter.kt @@ -65,7 +65,8 @@ class MetadataGetter(private val uriMap: MutableMap) { } } - queryContentResolverMetadata(contentResolver, metadataBuilder, context) + val couldBeVirtualFile = pickOptions.allowVirtualFiles && DocumentsContract.isDocumentUri(context, sourceUri) + queryContentResolverMetadata(contentResolver, metadataBuilder, couldBeVirtualFile) metadataBuilder } @@ -73,18 +74,24 @@ class MetadataGetter(private val uriMap: MutableMap) { fun queryContentResolverMetadata( contentResolver: ContentResolver, metadataBuilder: DocumentMetadataBuilder, - context: Context + couldBeVirtualFile: Boolean ) { val forUri = metadataBuilder.getUri() + + val projection = mutableListOf( + DocumentsContract.Document.COLUMN_MIME_TYPE, + OpenableColumns.DISPLAY_NAME, + OpenableColumns.SIZE, + ).apply { + if (couldBeVirtualFile) { + add(DocumentsContract.Document.COLUMN_FLAGS) + } + }.toTypedArray() + contentResolver .query( forUri, - arrayOf( - DocumentsContract.Document.COLUMN_MIME_TYPE, - OpenableColumns.DISPLAY_NAME, - OpenableColumns.SIZE, - DocumentsContract.Document.COLUMN_FLAGS, - ), + projection, null, null, null @@ -106,7 +113,7 @@ class MetadataGetter(private val uriMap: MutableMap) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // https://developer.android.com/training/data-storage/shared/documents-files#open-virtual-file val isVirtual = - if (DocumentsContract.isDocumentUri(context, forUri)) { + if (couldBeVirtualFile) { val cursorValue: Int = getCursorValue( cursor, DocumentsContract.Document.COLUMN_FLAGS, Int::class.java diff --git a/packages/document-picker/android/src/main/java/com/reactnativedocumentpicker/RNDocumentPickerModule.kt b/packages/document-picker/android/src/main/java/com/reactnativedocumentpicker/RNDocumentPickerModule.kt index 8fdfbecc..58e7cc6e 100644 --- a/packages/document-picker/android/src/main/java/com/reactnativedocumentpicker/RNDocumentPickerModule.kt +++ b/packages/document-picker/android/src/main/java/com/reactnativedocumentpicker/RNDocumentPickerModule.kt @@ -272,7 +272,7 @@ class RNDocumentPickerModule(reactContext: ReactApplicationContext) : val targetUriString = if (options.hasKey("uri")) options.getString("uri") else null val metadataBuilder = fileOps.writeDocumentImpl(currentUriOfFileBeingExported, targetUriString, reactApplicationContext) - metadataGetter.queryContentResolverMetadata(reactApplicationContext.contentResolver, metadataBuilder, reactApplicationContext) + metadataGetter.queryContentResolverMetadata(reactApplicationContext.contentResolver, metadataBuilder, couldBeVirtualFile = false) val arrayWithSingleResult = Arguments.createArray().apply { val resultMap = metadataBuilder.build()