Вопрос по virtual, android, email, file – Android Создание резидентного входного файла, который можно прикрепить к электронному письму

12

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

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

Затем я хочу использовать этот файл, которого на самом деле нет в 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-карту и отправляются непосредственно в почтовое вложение, их труднее прослушать, чем в памяти приложения.
Это не мой конкретный случай, но я хотел бы отметить, что эта возможность важна.

@adriaankoster, если вы там, прочитайте этот пост. Может быть, вы можете помочь. ilomambo

Ваш Ответ

4   ответа
6

что ты захочешь сделать, я думаю, это создать 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.

В любом случае, удачи.

Спасибо, я посмотрю на контент-провайдеров. Прямо сейчас я отложил это, поскольку решение кажется более сложным, чем я ожидал. Я дам вам награду за прыжок веры. ilomambo
1

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

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

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

В этом и заключается суть. Я не знаю, насколько вы знакомы с миром реверс-инжиниринга. Но в основном все, что отправляется по системным шинам, может контролироваться с помощью аппаратного обеспечения и декодироваться обратно в данные. Существует шина для внутренней оперативной памяти и шина, которая идет к SD-карте (возможно, они одинаковы, в этом случае ваше предложение в порядке) :::: Я бы предпочел найти способ создания виртуального файла без записи это в любой каталог. ilomambo
AFAIK мы не можем получить URI для объекта в RAM .. Ronnie
Мы можем создать «MemoryFile», но мы не можем получить его URI. Ronnie
Примечание: иногда чип процессора представляет собой SOC (система на кристалле), и внутреннее ОЗУ является его частью, поэтому мониторинг чтения / записи в ОЗУ значительно затрудняется, поскольку отсутствует внешняя шина. SDCard, с другой стороны, всегда является внешним по определению. ilomambo
Можете ли вы рассказать о MemoryFile? ilomambo
1

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

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

Я не так опытен в Android, можешь ли ты опубликовать конкретный код? :::: Кстати, создание входного потока не проблема, ByteArrayInputStream является встроенным классом. Проблема в том, как заставить URI указывать на него. ilomambo
0

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

Спасибо @yiddow, я посмотрел ваш пост, но я не собираюсь создавать свой собственный интерфейс для присоединения. Я хочу использовать Intent.EXTRA_STREAM и прикрепить буфер байтов, который у меня есть, без предварительного создания файла. ilomambo

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