Хобрук: Ваш путь к мастерству в программировании

Android: IOException: разрешение отклонено

Я создаю/сохраняю файл на SD-карте. Это код:

File sdDir = Environment.getExternalStorageDirectory();
public void btnsave_clicked(View v) throws FileNotFoundException, IOException{
     File f;
      f=new File(sdDir, "deposit.dma");
      if(!f.exists())
      f.createNewFile();
...
}

Но когда я нажимаю кнопку, он выдает «Отказано в доступе». Не спрашивайте меня о добавлении разрешений на использование.

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

Я уже добавил это в манифест.

Что я должен делать? Информация LogCat:

10-19 20:25:14.681: E/AndroidRuntime(29016): FATAL EXCEPTION: main
10-19 20:25:14.681: E/AndroidRuntime(29016): java.lang.IllegalStateException: Could not execute method of the activity
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.view.View$1.onClick(View.java:2168)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.view.View.performClick(View.java:2552)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.view.View$PerformClick.run(View.java:9229)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.os.Handler.handleCallback(Handler.java:587)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.os.Looper.loop(Looper.java:130)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.app.ActivityThread.main(ActivityThread.java:3701)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.lang.reflect.Method.invokeNative(Native Method)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.lang.reflect.Method.invoke(Method.java:507)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at dalvik.system.NativeStart.main(Native Method)
10-19 20:25:14.681: E/AndroidRuntime(29016): Caused by: java.lang.reflect.InvocationTargetException
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.lang.reflect.Method.invokeNative(Native Method)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.lang.reflect.Method.invoke(Method.java:507)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.view.View$1.onClick(View.java:2163)
10-19 20:25:14.681: E/AndroidRuntime(29016):    ... 11 more
10-19 20:25:14.681: E/AndroidRuntime(29016): Caused by: java.io.IOException: Permission denied
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.io.File.createNewFileImpl(Native Method)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.io.File.createNewFile(File.java:1257)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at org.brotheroftux.depositmaster.MainActivity.btnsave_clicked(MainActivity.java:43)
10-19 20:25:14.681: E/AndroidRuntime(29016):    ... 14 more

  • Я бы начал с публикации ошибок logcat, чтобы мы могли видеть, что происходит. 19.10.2012
  • Пожалуйста, опубликуйте вывод logcat. Также убедитесь, что строка <uses-permission ...> находится в правильном месте в манифесте. Кроме того, это на реальном устройстве или на эмуляторе? 19.10.2012
  • использование-разрешение должно присутствовать непосредственно в <manifest> ... </manifest> tag. 19.10.2012
  • Похоже, вы подключили карту памяти к ПК. Вам нужно отключить его, если вы видите новый диск на своем компьютере. 19.10.2012
  • Да, разрешение на использование в правильном месте. Это выдает даже когда я отсоединяю устройство от ПК 19.10.2012
  • На всякий случай добавьте свой манифест. 19.10.2012
  • Нет проблем, см. сообщение mfrankli 19.10.2012

Ответы:


1

Из документа по среде Android.

Приложения не должны напрямую использовать этот каталог верхнего уровня, чтобы не загрязнять корневое пространство имен пользователя. Любые файлы, которые являются частными для приложения, должны быть помещены в каталог, возвращаемый Context.getExternalFilesDir, который система позаботится об удалении, если приложение будет удалено. Другие общие файлы должны быть помещены в один из каталогов, возвращаемых функцией getExternalStoragePublicDirectory(String).

Другими словами, это не очень хорошая практика (хотя, возможно, у вас есть очень веская причина; контекст не очень ясен).

Кроме того, как прокомментировали Ктулху и Тед Хопп, убедитесь, что разрешение находится в правильном месте в манифесте.

19.10.2012
  • Хорошо, я попробую этот метод, но использование-разрешение находится в правильном месте. 19.10.2012

  • 2

    На некоторых картах SD и MicroSD есть переключатели защиты от записи. Если он у вас есть, убедитесь, что он не защищен от записи.

    Кроме того, после подключения телефона убедитесь, что вы не выбрали «Включить USB-накопитель». Это смонтирует вашу SD-карту для доступа с вашего ПК и отключит запись с вашего устройства.

    Вы можете проверить это, проведя панель уведомлений сверху вниз. У меня написано «USB подключено», что нормально, но «Включить USB-накопитель» не должно быть включено.

    19.10.2012
  • Большое спасибо. Выдергивал мне волосы. Никогда не понимал, что перевод телефона в режим USB-накопителя заблокирует доступ телефона к карте. 11.08.2013
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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