Дозвіл на запис на SD-карту


80

Я хотів би, щоб мій додаток архівував БД програми на SD-карту. У своєму коді я перевіряю, чи canWrite()існує каталог , а якщо немає, кидаю IOException. У цьому конкретному випадку я намагаюся скопіювати файл db у кореневий каталог на SD-карті, але він видає файл IOException. Як я можу змінити дозвіл на папку / файл, щоб мати можливість писати в нього?

Відповіді:


209

Ви маєте рацію, що каталог SD-карт є, /sdcardале вам не слід важко його кодувати. Натомість зателефонуйте, Environment.getExternalStorageDirectory()щоб отримати каталог:

File sdDir = Environment.getExternalStorageDirectory();

Якщо ви цього ще не зробили, вам потрібно буде дати своєму додатку правильний дозвіл писати на SD-карту, додавши рядок нижче до вашого Маніфесту:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Дякую ... Я зміню свій код відповідно до вашої пропозиції. Однак на даний момент у мене це жорстке кодування, і я не маю дозволу, встановленого у файлі маніфесту, але це дозволяє мені все одно зберегти його на SD-карті. чому я можу зберегти його без жодного дозволу?
багзі

4
@ user244190 - я припускаю, що ваш телефон працює під управлінням Android 1.5. WRITE_EXTERNAL_STORAGEбуло введено в 1.6, тому вам потрібно буде включити його у свою програму, якщо ви хочете, щоб вона була сумісною з подальшим використанням.
Дейв Вебб

@DaveWebb: дивіться моє запитання тут: stackoverflow.com/questions/9351904 / ...
Сахер ахваль

Ніхто не відповів, і я не знаю, чому це не працює.
Saher Ahwal

@DaveWebb - правильна ідея, але, мабуть, справа не в тому, що на телефоні працює 1.5, а в тому, що додаток вказує, що він побудований проти 1.5 або (частіше) взагалі не вказує версію, і коли новіший телефон бачить, що він додає дозвіл на зворотну сумісність.
Chris Stratton

1

Запропонована вище методика у відповіді Дейва, безумовно, є гарною практикою дизайну, і так, зрештою, необхідний дозвіл повинен бути встановлений у файлі AndroidManifest.xml для доступу до зовнішнього сховища.

Однак моно-еск-спосіб додавання більшості (якщо не всіх, не впевнений) "параметрів маніфесту" здійснюється через атрибути класу, що реалізує діяльність (або послугу).

Плагін Visual Studio Mono автоматично генерує маніфест, тому найкраще не втручатися в нього вручну (я впевнений, що бувають випадки, коли немає іншого варіанту).

Наприклад:

[Activity(Label="MonoDroid App", MainLauncher=true, Permission="android.permission.WRITE_EXTERNAL_STORAGE")]
public class MonoActivity : Activity
{
  protected override void OnCreate(Bundle bindle)
  {
    base.OnCreate(bindle);
  }
}

Насправді, зараз я бачу, що цей параметр WRITE_EXTERNAL_STORAGE є дозволом користувача, і якщо встановити його так, як вказано вище, він відображатиметься як параметр активності (android: разрешение), а не як дозвіл користувача у файлі маніфесту. О, я щойно згадав, ви встановили користувачеві дозволи користувачеві властивості проекту у VS (це прапорець із списком усіх дозволів).
samis

1
Вони насправді є тегами "дозвіл на використання", а не "дозвіл користувача", але крім цього все інше справедливо.
samis

Одне, що є абсолютно необхідним, - це викликати if (Build.VERSION.SDK_INT> = 19) {MainActivity.get (). GetExternalFilesDirs (null); } // Щоб отримати доступ до SD / Android / data / your.package.name // Не намагайтеся створити директорію пакета самостійно. Нездійснення цього дзвінка призводить до того, що mkdir або mkdirs не працюють.
pstorli
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.