Я пытаюсь экспортировать битовый массив из своего приложения с помощью намерения доли, не сохранив файл для временного местоположения. Всеми примерами, которые я нашел, является тустеп, 1) сохраняют к SD-карте и создают Uri для того файла 2), запускают намерение с этого Uri
Действительно ли возможно сделать его, не требуя разрешения WRITE_EXTERNAL_STORAGE, сохранив файл [и удаляя его впоследствии]? Как обратиться к устройствам без ExternalStorage?
У меня была эта та же проблема. Я не хотел должным быть просить чтение и писать внешние полномочия устройства хранения данных. Кроме того, иногда существуют проблемы, когда телефоны не имеют SD-карт, или карты размонтированы.
следующий метод использует ContentProvider, названный 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
с Вашим именем пакета приложения.
<?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"));
}
я пытаюсь экспортировать битовый массив из своего приложения с помощью намерения доли, не сохранив файл для временного местоположения.
В теории, это возможно. На практике это, вероятно, не возможно.
В теории, все, что необходимо совместно использовать, Uri
, который решит к битовому массиву. Самый простой подход состоит в том, если это - файл, который непосредственно доступен другому приложению, такой как на внешнем устройстве хранения данных.
Для не записи этого для высвечивания вообще необходимо было бы реализовать собственное ContentProvider
, выяснить, как реализовать openFile()
, чтобы возвратить битовый массив в оперативной памяти и затем передать Uri
представление, которые побитово отображают в ACTION_SEND
Intent
. С тех пор openFile()
потребности возвратиться ParcelFileDescriptor
, я не знаю, как Вы сделали бы это без дискового представления, но я не провел много времени, ища.
это возможный сделать его, не требуя разрешения WRITE_EXTERNAL_STORAGE, сохранив файл [и удаляя его впоследствии]?
, Если Вы просто не хотите это на внешнем устройстве хранения данных, можно пойти эти ContentProvider
маршрут, с помощью файла на внутренней памяти. Этот демонстрационный проект демонстрирует ContentProvider
, который подает файл PDF через [1 110] к средству просмотра PDF на устройстве; тот же подход мог использоваться для [1 111].