Совместное использование изображения в каталоге данных приложения через ContentProvider на Android - PullRequest
5 голосов
/ 24 августа 2011

Я пытаюсь открыть файл .png, расположенный в каталоге / data моего приложения, через ContentProvider, но вместо достижения openFile вызывается метод query. Теперь у меня есть только одно изображение, которое мне нужно предоставить для совместного использования в других приложениях. Как настроить намерение на openFile вместо query?

Intent shareImageIntent = new Intent(Intent.ACTION_SEND);

            shareImageIntent.setType("image/*");

            shareImageIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
            startActivity(Intent.createChooser(shareImageIntent, "Share image"));

Где выглядит Ури

content://my.package.contentprovider/fileName

Или, альтернативно, мне нужно создать базу данных для этого и вернуть курсор?

UPDATE

Так что, похоже, это работает для всего, кроме приложения SMS (именно это я и решил сначала протестировать), однако я хотел бы поделиться им с ним.

Вот соответствующая трассировка стека:

Вызывается: java.lang.IllegalArgumentException: Запрос на content: //mypackage.myprovider/someImage.png возвращает нулевой результат. в com.android.mms.ui.UriImage.initFromContentUri (UriImage.java:104) в com.android.mms.ui.UriImage. (UriImage.java:63) в com.android.mms.model.ImageModel.initModelFromUri (ImageModel.java:83) на com.android.mms.model.ImageModel. (ImageModel.java:65) на com.android.mms.data.WorkingMessage.changeMedia (WorkingMessage.java:481) в com.android.mms.data.WorkingMessage.setAttachment (WorkingMessage.java:375) ...

Таким образом, приложение SMS выполняет запрос вместо чтения непосредственно из openFile, что, похоже, делает любое другое приложение на моем телефоне (включая другие приложения Google)

Кто-нибудь знает, что мне нужно вернуть, чтобы выполнить запрос соответствующим образом? Я сейчас пойду копать AOSP.

Ответы [ 3 ]

4 голосов
/ 24 августа 2011

После копания в исходном коде приложения SMS (действительно MMS) я пришел к этому.

Внутри UriImage.initFromContentUri приложение создает код запроса и предполагает, что вCursor

 } else {
   filePath = c.getString(c.getColumnIndexOrThrow(Images.Media.DATA));
   mContentType = c.getString(c.getColumnIndexOrThrow(Images.Media.MIME_TYPE));
 }

Для того чтобы ваш ContentProvider работал с приложением MMS, вам нужно вернуть Cursor в query, который имеет только одну строку и два столбца (изображения.Media.DATA & Images.Media.MIME_TYPE) с соответствующими данными.После этого MMS выполнит вызов на номер openFile, чтобы получить изображение.

2 голосов
/ 24 августа 2011

Более простой способ поделиться ресурсом изображения - сохранить его во внешнем хранилище (SD-карта) и затем выполнить:

Uri imageUri = Uri.fromFile(pathToFile);

Обновление:

Попробуйте использовать

Uri imageUri = Uri.parse("android.resource://com.package.yourapp/" +imageResID);

Update2

Попробуйте сохранить файл в Media Store и затем отправить его:

String url = Media.insertImage(context.getContentResolver(), imageFile.getAbsolutePath(), imageFile.getName(), imageFile.getName());

Uri imageUri = Uri.parse(url);

Окончательное обновление с использованием ContentProvider и Cursor:

Ваш ContentProvider должен реализовывать метод query(..) и возвращать Cursor.См. исходный код UrlImage.initFromContentUri(..) (который используется внутри приложения MMS), чтобы увидеть, как вызывается курсор.Посмотрите на MatrixCursor, если это соответствует требованиям.

0 голосов
/ 24 августа 2011

Если ваш поставщик контента уже работает, вы можете получить доступ к ParcelFileDescriptor с помощью метода openFileDescriptor в поставщике контента.

Быстрый и грязный пример для этого:

ParcelFileDescriptor descriptor = mContext.getContentResolver().openFileDescriptor(IMGURI, "r");
Bitmap bmp = BitmapFactory.decodeFileDescriptor(descriptor.getFileDescriptor());

Ура!

...