Доступ к файлам в andorid - PullRequest
0 голосов
/ 25 марта 2020

Цель моего приложения - выбрать файл (может быть изображение, аудио или даже видеофайл) и использовать его позже в приложении, сохранив путь к файлу, чтобы он был доступен.

У меня есть эта функция, которая должна выполнять работу

Attach attach = AttachmentUtilities.extractAttachInfoFromUri(context, uri);

        attach.setPath(FileUtils.getPath(context, uri));
        attach.setUri(uri);
        try {
            if (cursor != null && cursor.moveToFirst()) {
                String name = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                attach.setName(name);

                //try getting mime type first way
                String mimeType = cursor.getString(cursor.getColumnIndex("mime_type"));
                //if null then try second way
                if (mimeType == null) {
                    mimeType = context.getContentResolver().getType(uri);
                }
                //if still null then try guessing from file name
                if (mimeType == null) {
                    mimeType = getFileExtension(name);
                }
                attach.setType(FileUtils.getMainFileType(mimeType));

                String extension = FileUtils.getExentsionFromMimeType(mimeType);
                attach.setExtension(extension);

                int sizeColIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
                Long size = null;
                if (!cursor.isNull(sizeColIndex)) {
                    size = (long) cursor.getInt(sizeColIndex);
                }
                attach.setSize(size);
            } else if (attach.getPath() != null) {
                attach = AttachmentUtilities.convertFileToAttachment(attach.getPath());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }

и установить функцию пути


        if (DEBUG)
            LogUtils.i(TAG + " File -",
                    "Authority: " + uri.getAuthority() +
                            ", Fragment: " + uri.getFragment() +
                            ", Port: " + uri.getPort() +
                            ", Query: " + uri.getQuery() +
                            ", Scheme: " + uri.getScheme() +
                            ", Host: " + uri.getHost() +
                            ", Segments: " + uri.getPathSegments().toString()
            );

        // DocumentProvider
        if (DocumentsContract.isDocumentUri(context, uri)) {
            // LocalStorageProvider
            if (isLocalStorageDocument(uri)) {
                // The path is the id
                return DocumentsContract.getDocumentId(uri);
            }
            // ExternalStorageProvider
            else if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }

                uri.getPath();
                // TODO handle non-primary volumes
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {

                final String id = DocumentsContract.getDocumentId(uri);
                LogUtils.i(TAG, "id=" + id);
                if (id.contains("raw:")) {
                    return id.replace("raw:", "");
                }

                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                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]
                };

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

            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();
            else if (isGoogleDriveUri(uri)) {
                return uri.getLastPathSegment();
            }

            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

Я получаю большая ошибка на fabri c на android os 9 ошибка отображается на другой версии ОС, но не так часто, как на ОС 9

Ошибка:

Failure delivering result ResultInfo{who=null, request=4, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/9887 flg=0x43 }} to activity {attachment.AttachmentPickerActivity}: java.lang.IllegalArgumentException: Unknown URI: content://downloads/public_downloads/9887
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...