2016-01-03 2 views
3

Я обновляю целевую версию SDK для Android-приложения до 23 (Android M), у которой есть новые разрешения Runtime (https://developer.android.com/training/permissions/requesting.html). Мое приложение объявило WRITE_EXTERNAL_STORAGE в своем манифесте, который теперь должен меня просить во время выполнения. Конечно, я хотел бы только запросить его, когда это необходимо.Как узнать, когда требуется WRITE_EXTERNAL_STORAGE

У меня есть абстракция для разных типов хранения, одна из них реализует локальное хранилище с помощью обычного ввода-вывода файлов (а не содержимого Android Content Provider). В этом классе я получаю путь к файлу (например,/mnt/sdcard/... или/data/data/...) и перед доступом к этому файлу (режим чтения и записи), я хочу проверить, нужно ли мне звонить RequestPermissions для WRITE_EXTERNAL_STORAGE.

Итак, вопрос: какой самый безопасный и простой способ определить, можно ли читать и записывать файл без этого разрешения (например, поскольку он находится внутри getExternalFilesDir()) или нет?

+0

«В этом классе я получаю путь к файлу» - откуда именно этот путь? Если он исходит из другого места вашего кода, то вы знаете, находится ли он на внешнем хранилище, где бы вы ни создавали этот путь. Если путь поступает извне вашего приложения (например, 'Uri' в« Intent »), тогда IMHO вам лучше всего будет предлагать пользователю разрешение, прежде чем вы сможете получить такой путь, например, при первом запуске ваше приложение. – CommonsWare

+0

Возможны пути: пути могут быть созданы внутри приложения, но я также открываю файлы из Intents. Кроме того, мне приходится иметь дело с путями, которые использовались в предыдущих версиях приложения и хранятся в общих предпочтениях.Я, конечно, не могу спросить всех пользователей, потому что многие пользователи не используют локальное хранилище, а только облачное хранилище. Но я могу спросить, в первый раз они используют любой локальный файл, который не находится во внутреннем каталоге приложения. Я надеялся, что есть лучшее решение. – Philipp

+0

Вы нашли ответ на этот вопрос? Я пытаюсь обновить свое приложение для API 23 и иметь ту же проблему, как я могу узнать, является ли путь внешним путем? – Chen

ответ

1

Вы можете видеть here, что вам нужно только указать WRITE_EXTERNAL_STORAGE, когда ваше приложение должно писать на внешнее хранилище. Но:

Начиная с уровня API 19, это разрешение не требуется для чтения/записи файлов в ваших конкретных приложений каталогов, возвращаемых getExternalFilesDir(String) и getExternalCacheDir().

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

Если вы не можете использовать Intent, чтобы избежать записи с помощью своего приложения, и вы знаете, что в какой-то день пользователю придется писать извне, я думаю, что лучше было бы запрашивать разрешения при первом приеме пользователя путь «написать во внешнем хранилище».

Насколько я знаю, в API23 вам нужно только один раз просить разрешения, поэтому я думаю, что самый простой способ - попросить разрешения в первый раз, когда пользователю нужны функции, я думаю, что тогда, когда он выполнит его снова, разрешения будут приняты. Вы можете проверить предоставленные разрешения с помощью процедуры, показанной на рисунке here.

Here вы можете прочитать:

Пользователю предлагается дать разрешение один раз, либо во время выполнения или время установки (в зависимости от пользователя версии Android). После этого ваше приложение может выполнить операцию, не требуя от пользователя дополнительного взаимодействия . Однако, если пользователь не предоставит разрешение (или отменяет его позже), ваше приложение не сможет выполнить .

+0

Идея новой системы разрешений заключается в том, что разрешения не запрашиваются до тех пор, пока они действительно не используются. Скорее всего, многие пользователи никогда не захотят запрашивать это разрешение, поскольку в приложении есть много других опций для хранения (например, облачного хранилища). По этим причинам я не буду просить каждого пользователя предоставить это разрешение. – Philipp

+0

Хорошо, тогда вы знаете ответ, только просите разрешения, когда пользователь берет внешний путь хранения, не так ли? Спросите, как пользователь хочет сохранить данные, а затем запросить разрешения или нет. – arodriguezdonaire

+0

Что такое «внешний путь хранения»? Предположим, что у вас есть локальный путь к файлу. Когда требуется разрешение? – Philipp

Смежные вопросы