2015-07-10 6 views
3

Я пытался сохранить некоторые строки на SD-карте. но он выбрасывал это исключение открытым с ошибкой EACCES (Permission denied). Я тестировал это на устройстве (asus zenfone 5). Я объявил разрешения в файле манифеста - WRITE_EXTERNAL_STORAGE, моя sd-карта смонтирована, и данные можно записать и прочитать из нее (я лично проверил ее, скопировав некоторые mp3-файлы и воспроизведя их). поскольку это было специфическое для телефона приложение, и у телефона есть внутреннее и внешнее хранилище в нем, и я хочу сохранить файл на внешней SD-карте, я написал такой код. Я получил абсолютный путь внешней SD-карты, используя приложение эмулятора терминала, используя команды «cd» и «ls». Мой телефон не укоренен, поэтому я не могу напрямую изменять разрешения. Я попытался использовать все возможные методы google и stackoverflow. пожалуйста, помогите мнеopen failed EACCES (Permission denied)

public void savePublicExternalFile(String data){ 
     File folder = new File("/Removable/MicroSD/"); 
     //i have also tried File folder = new File("/Removable/MicroSD"); 
     File myFile = new File(folder,"mydata.txt"); 
     WriteData(myFile, data); 



    } 

    private void WriteData(File myFile, String data){ 

     if(t){ 
      Log.i("AbsolutePath",myFile.getAbsolutePath()); 
      t = false; 
     } 

     FileOutputStream fileOutputStream=null; 
     try { 
      fileOutputStream = new FileOutputStream(myFile); 
      fileOutputStream.write(data.getBytes()); 
     } catch (Exception e) { 
      Log.i("exception",e.toString()); 
     } finally { 
      if(fileOutputStream!=null){ 
       try { 
        fileOutputStream.close(); 
       } catch (IOException e) { 
        Log.i("exception", e.toString()); 
       } 
      } 
     } 


    } 

ответ

3

Я предполагаю, что ваш Asus Zenfon е работает на Android версиях >= KitKat. Итак, начиная с KITKAT из-за серьезных изменений в политике записи SD-карт вы не сможете писать на SD-карте, кроме своей папки с приложением (/storage/../data/com.example/ в SD-карта).

Для доступа к этой папке на SD-карте есть API, добавленный в KitKat. Этот API вернет массив файлов, содержащих путь для всех личных папок приложения.

File[] files = ContextCompat.getExternalFilesDirs(context, null) 

По умолчанию 0th позиция путь похож на путь возвращенного старшего API Environment.getExternalStorageDirectory() и это является основным для хранения. 1st позиция (в общем) будет другим каталогом хранения, который обычно является SD-картой. Используйте этот путь для записи на SD-карту. Перед записью чего-либо на нем убедитесь, что установлено состояние SD-карты.

Надеюсь, что эта помощь. Дайте мне знать, если вы столкнулись с какими-либо другими проблемами.

+0

Это было полезно, я смог написать внутри android-папку sd-карты, потому что файлы [1] дали мне этот путь, есть ли какой-либо метод, с помощью которого я могу получить корневой путь sd-карты, используя этот или любой другой метод? –

+0

Иисус Христос взял меня на два часа, чтобы найти ответ. Огромное спасибо. Я пробовал целую вечность с вызовом Environment, но он никогда не работал для моей системы Android 6 (версии раньше работали нормально). Вот мой подъем! –

0

Вместо того, чтобы использовать запрограммированный каталог, попробуйте использовать вызов Environment.getExternalStorageDirectory и открыть файл путем добавления имени к этому пути

+0

Сделал это, но без положительного результата –

+0

По-прежнему получаешь ту же ошибку? –

+0

Да, я все еще получаю ту же проблему. –

1

Несколько дней назад я попробовал этот код для сохранения изображения и это работает для меня.

void saveFile() { 
    String RootDir = Environment.getExternalStorageDirectory() 
      + File.separator + "any_folder"; 

    File myDir = new File(RootDir); 
    myDir.mkdirs(); 

    String fname = "mydata.txt"; 
    File file = new File(myDir, fname); 
    if (file.exists()) 
     file.delete(); 
    try { 
     FileOutputStream out = new FileOutputStream(file); 
     out.write(data.getBytes()); 
     out.flush(); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    Toast.makeText(AddText.this, "File saved to 'any_folder' folder", 
      Toast.LENGTH_LONG).show(); 
} 
+1

Не могли бы вы объяснить мне, в чем разница между вашим ответом и ответом BlackHamm3rJack? –