Файл, созданный с использованием MODE_WORLD_READABLE, не отправляется по электронной почте в виде вложения

Я создал базу данных SQLite, используя следующий код:

context.openOrCreateDatabase(dbName, Context.MODE_WORLD_READABLE, null);

И попытался отправить его в виде вложения по электронной почте, используя следующий код:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND)
        .setType("message/rfc822")
        .putExtra(android.content.Intent.EXTRA_STREAM,
                Uri.fromFile(getDatabasePath(dbName)));
startActivity(Intent.createChooser(emailIntent, null));

Откроется действие создания GMail со значком вложения. Но получатель не получил вложения.

Об этом уже спрашивали. Но похоже, что нет другого решения, кроме как скопировать файл db на SD-карту.

Тогда мой вопрос: Какой смысл использовать флаг MODE_WORLD_READABLE, если другое приложение, такое как GMail, не может прочитать файл?


person Dheeraj Vepakomma    schedule 21.06.2012    source источник
comment
Отправка базы данных по электронной почте не кажется простой. используйте какой-либо метод сериализации. В любом случае приложение в Android изолировано, и это может быть причиной проблемы. при использовании вложения или другого метода обмена вы должны убедиться, что файл находится за пределами песочницы.   -  person ApriOri    schedule 21.06.2012
comment
@Erb Какая польза от флага MODE_WORLD_READABLE, если файл находится в песочнице?   -  person Dheeraj Vepakomma    schedule 21.06.2012


Ответы (1)


Допустим, у нас есть 2 приложения app_1 и app_2 в файловой системе Android, эти 2 приложения лежат в /data/data/app_1 и /data/data/app_2, где app_1 — это «пользовательское» приложение_1.

если вы запустите ls для /data/data, вы увидите что-то вроде этого: drwxr-x--x app_1 app_1 drwxr-x--x app_2 app_2

MODE_WORLD_READABLE эквивалентен команде Unix a+r [файл]. Однако это не позволяет другим пользователям/приложению получать доступ к файлу, поскольку разрешения каталога не позволяют приложению_1 получать доступ к файлам в папке app_2.

На самом деле app_1 даже не сможет ls /data/data увидеть список всех других каталогов. Суть в том, что MODE_WORLD_READBLE полезен только тогда, когда вы имеете дело с файлами в общем хранилище, таком как SD-карта, но не в изолированной программной среде, в которой работает каждое приложение.

Я надеюсь, что эта информация будет полезной.

person ApriOri    schedule 21.06.2012
comment
PS, если вы хотите проверить это поведение и у вас есть root на вашем устройстве/эмуляторе, вы можете сделать что-то вроде cd /data/data, а затем su app_1, а затем попытаться получить доступ к файлам другого приложения в /data/data/app_2. - person ApriOri; 21.06.2012