Вопрос по virtual, android, email, file – Android Создание резидентного входного файла, который можно прикрепить к электронному письму
Конечная цель будет ясна в ближайшее время.
Я хочу создать объект файла и вместо получения данных из реального физического файла я хочу предоставить буфер самостоятельно.
Затем я хочу использовать этот файл, которого на самом деле нет в SDCard или где-либо за пределами моего приложения, дать ему имя и отправить его по электронной почте в виде вложения (используя EXTRA_STREAM).
Я нашел следующий фрагмент кода, написанный Адрианом Костером (@adriaankoster), постЗапись байта [] в файл в Java
<code>// 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); </code>
Я использовал это, чтобы создать эту функцию
<code>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; } </code>
и вот где я застрял, потому что, когда я использую это:
<code>// 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())); </code>
Я знаю из примеров, которые я видел, что вторым аргументом должен быть URI, но: как мне создатьvirtual URI, чтобы соответствовать моему файлу?
EDIT:
Возможность прикрепления данных непосредственно из приложения важна для приложений определенного типа. А именно, безопасность и банковские приложения, которые не хотят перемещать конфиденциальные данные слишком много. Конечно, если данные не попадают на SD-карту и отправляются непосредственно в почтовое вложение, их труднее прослушать, чем в памяти приложения.
Это не мой конкретный случай, но я хотел бы отметить, что эта возможность важна.
что ты захочешь сделать, я думаю, это создать ContentProvider. Вы можете увидеть пример реализации здесь
https: //github.com/dskinner/AndroidWeb/blob/master/src/org/tsg/web/WebContentProvider.jav
где в случае вышеупомянутой ссылки, вы бы добавили это в свой AndroidManifest.xml
<provider
android:name="org.tsg.web.WebContentProvider"
android:authorities="your.package.name" />
Теперь у вас будет контент, доступный для использования,content://your.package.name/
.
Та часть вышеуказанного ContentProvider, которая вас интересует, опять же, я думаю, этоopenFile
метод. При обмене данными намеренно между приложениями ожидаются определенные вещи. В вашем случае вы хотите поделиться некоторыми байтовыми данными, которые должны быть прикреплены к электронному письму.
Так что, если вы передадите контент URI в приложение электронной почты, такое какcontent://your.package.name/foo
с соответствующими флагами намерений, затемopenFile
будет вызываться на вашем ContentProvider. В этом случае вы можете проверить конец сегмента uri, чтобы увидетьfoo
был запрошен и возвращен соответствующим образом.
Следующая проблема, которую вы затронули, - это отсутствие файла на диске. Хотя я не могу поручиться за метод, который вы использовали выше (хотя он выглядит кошерно), вам нужно вернутьParcelFileDescriptor
от вашего ContentProvider. Если вы посмотрите на предоставленную мной ссылку, вы можете попытаться использовать ее в качестве примера, чтобы получить дескриптор файла из вашегоFile
объект (мои знания здесь не нужны), но я думаю, что в этот момент данные просто не будут доступны.
То, что ты воспитываешь, это безопасность. Важно отметить, что вы можете записывать данные на диск конфиденциально, так что только приложение имеет доступ к данным. Я полагаю, но вы можете проверить это дважды, если эти данные являются частными для приложения, вы можете предоставить их через ContentProvider и, возможно, заблокировать, кто и как используется провайдером, кто может его вызывать и т. Д. Вы можете хочу покопаться в андроид документации для этой части или посмотреть на некоторые другие вопросы SO.
В любом случае, удачи.
й файловой системе. Используйте API getCacheDir () для получения пути к каталогу кеша. Запишите данные в этот каталог и затем получите URI из объекта File, используя «Uri.fromFile (File file)». Когда вы закончите с файлом, удалите его.
Кэш вашего приложения доступен только вашему приложению, поэтому его безопасно использовать для ваших целей.
Вы можете сделать некоторое шифрование, если данные слишком критичны.
что для этого вам нужно будет предоставить ContentProvider, который позволит вам обрабатывать URI. Приложение электронной почты должно затем открыть openInputStream для вашего URI, после чего вы вернете InputStream для ваших данных в памяти.
Я не пробовал, но теоретически это должно сработать.
и я могу отправлять письма с вложениями. если вы хотите взглянуть: не может отправлять почту с вложением в Android