Intereting Posts
Ошибка DatePicker в Samsung с Android 3.0 Управление мультимедиа на экране блокировки, например, Google Play Музыка в Android? ContentProvider insert () всегда работает в потоке пользовательского интерфейса? Что такое ярлык для автоматического импорта всех в Android Studio? Как получить точку / координату пользователя, нажав на андроид? Как сделать верхний или нижний колонтитул ListView недоступным для просмотра Выходить из приложения для Android Gradle: как запустить контрольно-измерительный тест для класса Google Firebase выйдет и забудет пользователя в приложении для Android Программно получать MAC-адрес устройства Android Меню ВОПРОСЫ с некоторыми устройствами Android 4.x Метод тестирования единицы измерения, который содержит выражение лямбда Android Studio Использование XMPP для push-уведомлений пользователей на Android – любой способ настроить их таким образом, чтобы они не переходили на Google Talk и т. Д. Что представляет собой образ системы MIPS в Android SDK manager? IntentService: почему мой onHandleIntent никогда не называется?

Android Создание резидентного входного файла памяти, который можно подключить к электронной почте

Конечная цель будет очевидна в ближайшее время.

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

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

Я нашел следующий бит кода, Adriaan Koster (@adriaankoster), запись Write byte [] в файл на Java

// convert byte[] to File ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bis); File fileFromBytes = (File) ois.readObject(); bis.close(); ois.close(); System.out.println(fileFromBytes); 

Я использовал его для создания этой функции

 private File fileFromBytes(byte[] buf) { File f = null; try { ByteArrayInputStream bis = new ByteArrayInputStream(buf); ObjectInputStream ois = new ObjectInputStream(bis); f = (File) ois.readObject(); bis.close(); ois.close(); } catch (Exception e) {} return f; } 

И вот где я застрял, потому что когда я его использую:

 // When sent as body the mail is sent OK // emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, dump()); // When I try to attach the mail is empty emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, fileFromBytes(dump().getBytes())); 

Я знаю, из примеров, которые я видел, второй аргумент должен быть URI, но: Как создать виртуальный URI для моего файла?

EDIT: возможность подключения данных непосредственно из приложения важна для определенных приложений. А именно, приложения для обеспечения безопасности и банковского обслуживания, которые не хотят слишком сильно перемещать конфиденциальные данные. Разумеется, если данные не доходят до SD-карты и переходят непосредственно в почтовую вставку, ее сложно обнюхивать, чем в памяти приложения.
Это не мой конкретный случай, но я хотел бы указать, что эта способность важна.

Solutions Collecting From Web of "Android Создание резидентного входного файла памяти, который можно подключить к электронной почте"

Полагаю, первое, что вы захотите сделать, это создать ContentProvider. Вы можете увидеть пример реализации здесь

https://github.com/dskinner/AndroidWeb/blob/master/src/org/tsg/web/WebContentProvider.java

Где в случае вышеуказанной ссылки вы добавили бы это в свой AndroidManifest.xml

 <provider android:name="org.tsg.web.WebContentProvider" android:authorities="your.package.name" /> 

Теперь у вас будет доступный контент uri для использования, content://your.package.name/ .

Часть вышеприведенного ContentProvider, которого вы заинтересовали, опять же я считаю, это метод openFile . При совместном использовании данных по приложениям некоторые вещи ожидаются. В вашем случае вы хотите поделиться некоторыми байтовыми данными, которые должны быть прикреплены к электронной почте.

Поэтому, если вы передадите контент uri в приложение электронной почты, такое как content://your.package.name/foo с соответствующими флагами намерений, тогда openFile content://your.package.name/foo на вашем ContentProvider. В этом случае вы можете проверить конец сегмента uri, чтобы увидеть, что foo был запрошен, и возвратите его соответствующим образом.

Следующая проблема, которую вы вызываете, – это отсутствие файла на диске. Хотя я не могу ручаться за метод, который вы использовали выше (хотя он выглядит кошерным), то, что вам нужно вернуть, является ParcelFileDescriptor из вашего ContentProvider. Если вы посмотрите на ссылку, которую я предоставил, вы можете попытаться использовать это как образец, чтобы получить дескриптор файла из вашего объекта File (мои знания об отказе здесь), но я полагаю, что данные просто не будут доступны в этот момент.

Тем не менее, то, что вы делаете, это безопасность. Важно отметить, что вы можете записывать данные на диск конфиденциально, так что только приложение имеет доступ к данным. Я полагаю, но вы можете дважды проверить это, если эти данные являются приватными для приложения, вы можете открыть его через ContentProvider и, возможно, заблокировать, кто и как поставщик будет использоваться, кто может его назвать и т. Д. Вы можете Захотите вникнуть в андроидные документы для этой части или посмотреть на некоторые другие вопросы SO.

Во всяком случае, удачи.

Создайте файл в каталоге кэша приложения. Он будет создан во внутренней файловой системе. Используйте API getCacheDir () для получения пути к директории кеша. Запишите данные в этот каталог, а затем получите URI из объекта File с помощью «Uri.fromFile (File file)». Когда вы закончите с файлом, удалите его.

Кэш приложения доступен только для вашего приложения, поэтому его безопасно использовать для вашей цели.

Вы можете сделать некоторое шифрование, если данные слишком критичны.

Я думаю, для этого вам придется разоблачить ContentProvider, который позволит вам обрабатывать URI. Затем приложение электронной почты должно открытьInputStream в вашем URI, после чего вы возвращаете InputStream в свои данные в памяти.

Я не пробовал, но теоретически это должно работать.

Я был занят добавлением вложения в почту, и я могу отправить почту с приложением. Если вы хотите взглянуть: не удается отправить почту с приложением в Android