FilePicker icon indicating copy to clipboard operation
FilePicker copied to clipboard

[Bug]: com.nareshchocha.filepickerlibrary.models.DocumentFilePickerConfig cannot be cast to android.content.Intent

Open cobertgael opened this issue 6 months ago • 1 comments

Describe the bug

hello this is my java code to call the picker

launcher.launch(new DocumentFilePickerConfig());

private ActivityResultLauncher launcher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Uri uri = result.getData().getData(); // String filePath = result.getData().getStringExtra(Const.BundleExtras.FILE_PATH); // Handle other scenarios (e.g., multiple picks) as needed } } );

i have this error com.nareshchocha.filepickerlibrary.models.DocumentFilePickerConfig cannot be cast to android.content.Intent at androidx.activity.result.contract.ActivityResultContracts$StartActivityForResult.createIntent(ActivityResultContracts.kt:58) at androidx.activity.ComponentActivity$activityResultRegistry$1.onLaunch(ComponentActivity.kt:176) at androidx.activity.result.ActivityResultRegistry$register$2.launch(ActivityResultRegistry.kt:130) at androidx.activity.result.ActivityResultLauncher.launch(ActivityResultLauncher.kt:37) at fr.openmotion.secureangelmodel.gui.excel_import.ChooseAttachment.browseButton(ChooseAttachment.java:163)

Library Version

0.5.2

Steps to reproduce

No response

cobertgael avatar Jul 09 '25 09:07 cobertgael

ok i found


 int popUpIcon = R.drawable.icon;
        String popUpText = "File Media";
        boolean allowMultiple = true;
        int  maxFiles = 10;
        List<String> mMimeTypes = listOf("application/pdf", "image/*");
        String askPermissionTitle = "";
        String askPermissionMessage = "";
        String settingPermissionTitle = "";
        String settingPermissionMessage = "";
        DocumentFilePickerConfig oo = new DocumentFilePickerConfig(
                popUpIcon,popUpText,allowMultiple,maxFiles,mMimeTypes,askPermissionTitle,askPermissionMessage,	settingPermissionTitle,	settingPermissionMessage
        );
        launcher.launch(getDocumentFilePick(oo));



private Intent getDocumentFilePick(DocumentFilePickerConfig oo) {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/*");
        return intent;
    }

private ActivityResultLauncher  launcher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                int code_received = result.getResultCode();
                Log.i(TAG, "code_received : "+code_received);
                if (code_received == Activity.RESULT_OK) {
                    Uri uri = result.getData().getData();
                    Log.i(TAG, "uri : "+uri);
                    FileHelper fileHelper = new FileHelper();
                    String filePath = fileHelper.getRealPathFromURI(mContext,uri);
                    Log.i(TAG, "filePath : "+filePath);
                    File test_file = new File(filePath);
                  
                }
            }
    );

and the FileHelper class

`public class FileHelper { @TargetApi(19) public static String getRealPathFromURI(final Context context, final Uri uri) { String path = ""; try { path = processUri(context, uri); } catch (Exception exception) { exception.printStackTrace(); } if (TextUtils.isEmpty(path)) { path = copyFile(context, uri); } return path; }

private static String processUri(Context context, Uri uri) {
    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
    String path = "";
    // DocumentProvider
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
        // ExternalStorageProvider
        if (isExternalStorageDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            if ("primary".equalsIgnoreCase(type)) {
                path = Environment.getExternalStorageDirectory() + "/" + split[1];
            }
        } else if (isDownloadsDocument(uri)) { // DownloadsProvider
            final String id = DocumentsContract.getDocumentId(uri);
            //Starting with Android O, this "id" is not necessarily a long (row number),
            //but might also be a "raw:/some/file/path" URL
            if (id != null && id.startsWith("raw:/")) {
                Uri rawuri = Uri.parse(id);
                path = rawuri.getPath();
            } else {
                String[] contentUriPrefixesToTry = new String[]{
                        "content://downloads/public_downloads",
                        "content://downloads/my_downloads"
                };
                for (String contentUriPrefix : contentUriPrefixesToTry) {
                    final Uri contentUri = ContentUris.withAppendedId(
                            Uri.parse(contentUriPrefix), Long.valueOf(id));
                    path = getDataColumn(context, contentUri, null, null);
                    if (!TextUtils.isEmpty(path)) {
                        break;
                    }
                }
            }
        } else if (isMediaDocument(uri)) { // MediaProvider
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];
            Uri contentUri = null;
            if ("image".equals(type)) {
                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }

            final String selection = "_id=?";
            final String[] selectionArgs = new String[] {
                    split[1]
            };

            path = getDataColumn(context, contentUri, selection, selectionArgs);
        }  else if ("content".equalsIgnoreCase(uri.getScheme())) {
            path = getDataColumn(context, uri, null, null);
        }
    } else if ("content".equalsIgnoreCase(uri.getScheme())) { // MediaStore (and general)
        path = getDataColumn(context, uri, null, null);
    } else if ("file".equalsIgnoreCase(uri.getScheme())) { // File
        path = uri.getPath();
    }
    return path;
}

static String copyFile(Context context, Uri uri) {
    try {
        InputStream attachment = context.getContentResolver().openInputStream(uri);
        if (attachment != null) {
            String filename = getContentName(context.getContentResolver(), uri);
            if (filename != null) {
                File file = new File(context.getCacheDir(), filename);
                FileOutputStream tmp = new FileOutputStream(file);
                byte[] buffer = new byte[1024];
                while (attachment.read(buffer) > 0) {
                    tmp.write(buffer);
                }
                tmp.close();
                attachment.close();
                return file.getAbsolutePath();
            }
        }
    } catch (Exception e) {
        return null;
    }
    return null;
}

private static String getContentName(ContentResolver resolver, Uri uri) {
    Cursor cursor = resolver.query(uri, null, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
        int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
        if (nameIndex >= 0) {
            String name = cursor.getString(nameIndex);
            cursor.close();
            return name;
        }
    }
    return null;
}

/**
 * Get the value of the data column for this Uri. This is useful for
 * MediaStore Uris, and other file-based ContentProviders.
 *
 * @param context The context.
 * @param uri The Uri to query.
 * @param selection (Optional) Filter used in the query.
 * @param selectionArgs (Optional) Selection arguments used in the query.
 * @return The value of the _data column, which is typically a file path.
 */
public static String getDataColumn(Context context, Uri uri, String selection,
                                   String[] selectionArgs) {
    Cursor cursor = null;
    String result = null;
    final String column = "_data";
    final String[] projection = { column };
    try {
        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                null);
        if (cursor != null && cursor.moveToFirst()) {
            final int index = cursor.getColumnIndexOrThrow(column);
            result = cursor.getString(index);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
        return null;
    } finally {
        if (cursor != null)
            cursor.close();
    }
    return result;
}


/**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is ExternalStorageProvider.
 */
public static boolean isExternalStorageDocument(Uri uri) {
    return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

/**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is DownloadsProvider.
 */
public static boolean isDownloadsDocument(Uri uri) {
    return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

/**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is MediaProvider.
 */
public static boolean isMediaDocument(Uri uri) {
    return "com.android.providers.media.documents".equals(uri.getAuthority());
}

}`

cobertgael avatar Jul 10 '25 13:07 cobertgael