Намерение Доли Android для Битового массива - действительно ли возможно не сохранить его предшествующее совместное использование?

Я пытаюсь экспортировать битовый массив из своего приложения с помощью намерения доли, не сохранив файл для временного местоположения. Всеми примерами, которые я нашел, является тустеп, 1) сохраняют к SD-карте и создают Uri для того файла 2), запускают намерение с этого Uri

Действительно ли возможно сделать его, не требуя разрешения WRITE_EXTERNAL_STORAGE, сохранив файл [и удаляя его впоследствии]? Как обратиться к устройствам без ExternalStorage?

62
задан 29 January 2012 в 02:20

2 ответа

У меня была эта та же проблема. Я не хотел должным быть просить чтение и писать внешние полномочия устройства хранения данных. Кроме того, иногда существуют проблемы, когда телефоны не имеют SD-карт, или карты размонтированы.

следующий метод использует ContentProvider, названный FileProvider. Технически, Вы все еще сохраняете битовый массив (во внутренней памяти) до совместного использования, но Вы не должны запрашивать полномочия. Кроме того, каждый раз, когда Вы совместно используете битовый массив, файл изображения перезаписывается. И так как это находится во внутреннем кэше, это будет удалено, когда пользователь удалит приложение. Так, по-моему, это столь же хорошо как не сохранение образа. Этот метод также более безопасен, чем сохранение его к внешнему устройству хранения данных.

документация довольно хороша (см. Дополнительные материалы для чтения ниже), но некоторые части немного хитры. Вот сводка, которая работала на меня.

Настроенный FileProvider в Замене Декларации

<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.myapp.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
        ...
    </application>
</manifest>

com.example.myapp с Вашим именем пакета приложения.

Создают res/xml/filepaths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="shared_images" path="images/"/>
</paths>

, Это говорит FileProvider, где заставить файлы совместно использовать (использование каталога кэша в этом случае).

Сохраняют образ к внутренней памяти

// save bitmap to cache directory
try {

    File cachePath = new File(context.getCacheDir(), "images");
    cachePath.mkdirs(); // don't forget to make the directory
    FileOutputStream stream = new FileOutputStream(cachePath + "/image.png"); // overwrites this image every time
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    stream.close();

} catch (IOException e) {
    e.printStackTrace();
}

, Добавляют изображение

File imagePath = new File(context.getCacheDir(), "images");
File newFile = new File(imagePath, "image.png");
Uri contentUri = FileProvider.getUriForFile(context, "com.example.myapp.fileprovider", newFile);

if (contentUri != null) {
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
    shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri));
    shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
    startActivity(Intent.createChooser(shareIntent, "Choose an app"));
}

Дополнительные материалы для чтения

215
ответ дан 31 October 2019 в 13:06

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

В теории, это возможно. На практике это, вероятно, не возможно.

В теории, все, что необходимо совместно использовать, Uri, который решит к битовому массиву. Самый простой подход состоит в том, если это - файл, который непосредственно доступен другому приложению, такой как на внешнем устройстве хранения данных.

Для не записи этого для высвечивания вообще необходимо было бы реализовать собственное ContentProvider, выяснить, как реализовать openFile(), чтобы возвратить битовый массив в оперативной памяти и затем передать Uri представление, которые побитово отображают в ACTION_SEND Intent. С тех пор openFile() потребности возвратиться ParcelFileDescriptor, я не знаю, как Вы сделали бы это без дискового представления, но я не провел много времени, ища.

это возможный сделать его, не требуя разрешения WRITE_EXTERNAL_STORAGE, сохранив файл [и удаляя его впоследствии]?

, Если Вы просто не хотите это на внешнем устройстве хранения данных, можно пойти эти ContentProvider маршрут, с помощью файла на внутренней памяти. Этот демонстрационный проект демонстрирует ContentProvider, который подает файл PDF через [1 110] к средству просмотра PDF на устройстве; тот же подход мог использоваться для [1 111].

9
ответ дан 31 October 2019 в 13:06

Другие вопросы по тегам:

Похожие вопросы: