Android - ContentProvider: проблема с настройкой имени файла для файлов, доставляемых с помощью ContentProvider.openFile - PullRequest
1 голос
/ 25 марта 2011

Я столкнулся со следующей проблемой при реализации ContentProvider для доставки изображений, хранящихся в области личных данных приложения в Android-проекте:

Файлы, возвращаемые реализацией ниже, имеют полный абсолютный путь к сохраненным изображениям как имя файла, которое выглядит как

_data_data_com.mypackage.imageprovider_app_images_123456789.jpg

где app_images - это имя каталога, в котором изображения хранятся приложением, а 123456789.jpg - это фактическое имя файла.

Теперь у меня вопрос: как сделать так, чтобы ContentProvider устанавливал только фактическое имя файла (или, альтернативно, указанное мной имя файла) для доставленных изображений?

Это должно быть возможно, так как, например, встроенные провайдеры в Android удается доставить только фактическое имя файла для изображения.

В таблице базы данных есть столбцы для _id, filename и _data, где _data содержит абсолютный путь к изображению в файловой системе.

Любые намеки очень высоко ценятся :)

Заранее спасибо, snowcrash123

Вот соответствующие части моего текущего ContentProvider:

@Override
public Cursor query(Uri uri, String[] projection, String selection, 
    String[] selectionArgs, String sortOrder)
{
    final SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(PhotosTable.TABLE_NAME);

    switch (URI_MATCHER.match(uri))
    {
        case PHOTO_DIR:
            if (sortOrder == null)
            {
                sortOrder = PhotosDirectory.DEFAULT_SORT_ORDER;
            }
            break;

        case PHOTO_ID:
            queryBuilder.appendWhere(IPhotoColumns.FILENAME + "=" 
                + uri.getPathSegments().get(1) + " AND ");
            break;

        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
    }

    if (!mDb.isOpen())
    {
        assignWritableDb();
    }

    return queryBuilder.query(mDb, PhotosDirectory.ALL_COLUMNS, 
        selection, selectionArgs, null, null, sortOrder);
}

@Override
public ParcelFileDescriptor openFile(Uri uri, String mode)
{
    if (URI_MATCHER.match(uri) != PHOTO_ID)
    {
        throw new IllegalArgumentException(
            "operation only permitted for single file");
    }
    try
    {
        return openFileHelper(uri, mode);
    }
    catch (FileNotFoundException e)
    {
        return null;
    }
}
...