2016-01-05 1 views
1

Я разработал приложение, которое - загрузить некоторые данные (.png и .wav файлы) - вставить путь, где каждый из файлов загружается в базу данных (SQLite)Android сохранить загруженные данные на SD

Так все так хорошо, все работает. Некоторые пользователи спрашивали меня, есть ли способ переместить загруженные данные на SD-карту, чтобы сохранить некоторое внутреннее пространство.

В настоящее время я создать каталог с этой строки кода

File directory = getApplicationContext().getDir("folderName", Context.MODE_PRIVATE); 

Затем приложение будет заполнить его весь материал, я скачал.

Я попытался с помощью этого куска кода:

   try { 
       File newFolder = new File(Environment.getExternalStorageDirectory(), "TestFolder"); 
       if (!newFolder.exists()) { 
        newFolder.mkdir(); 
       } 
       try { 
        File file = new File(newFolder, "MyTest" + ".txt"); 
        file.createNewFile(); 
        System.out.println("Path: " + file.getPath()); 
       } catch (Exception ex) { 
        System.out.println("ex: " + ex); 
       } 
      } catch (Exception e) { 
       System.out.println("e: " + e); 
      } 

И это создать папку и текстовый файл в: /storage/emulated/0/TestFolder/MyTest.txt , который не мой каталог SDCard, он должен быть: /storage/sdcard1/TestFolder/MyTest.txt

Так что мой вопрос: - где и как я сохранил личные данные моего приложения (в .png и .wav файлы) в SD-карты?

ответ

2

getExternalFilesDir, getExternalStorageDirectory или родственники, не всегда возвращает папку на SD-карте. Например, на моем Samsung он возвращает эмулированную внутреннюю SD-карту.

Вы можете получить все внешние устройства хранения данных (также съемные) с помощью ContextCompat.getExternalFilesDirs.

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

Я использую этот код для хранения (кэш) растровых изображений в папке с именем «ВМР» на устройстве.

@SuppressWarnings("ResultOfMethodCallIgnored") 
    private static File[] allCacheFolders(Context context) { 
     File local = context.getCacheDir(); 
     File[] extern = ContextCompat.getExternalCacheDirs(context); 

     List<File> result = new ArrayList<>(extern.length + 1); 

     File localFile = new File(local, "bmp"); 
     localFile.mkdirs(); 
     result.add(localFile); 

     for (File anExtern : extern) { 
      if (anExtern == null) { 
       continue; 
      } 
      try { 
       File externFile = new File(anExtern, "bmp"); 
       externFile.mkdirs(); 
       result.add(externFile); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       // Probably read-only device, not good for cache -> ignore 
      } 
     } 
     return result.toArray(new File[result.size()]); 
    } 



    private static File _cachedCacheFolderWithMaxFreeSpace; 
    private static File getCacheFolderWithMaxFreeSpace(Context context) { 
     if (_cachedCacheFolderWithMaxFreeSpace != null) { 
      return _cachedCacheFolderWithMaxFreeSpace; 
     } 
     File result = null; 
     long free = 0; 
     for (File folder : allCacheFolders(context)) { 
      if (!folder.canWrite()) { 
       continue; 
      } 
      long currentFree = folder.getUsableSpace(); 
      if (currentFree < free) { 
       continue; 
      } 
      free = currentFree; 
      result = folder; 
     } 
     _cachedCacheFolderWithMaxFreeSpace = result; 
     return result; 
    } 
+1

«The getExternalStorageDirectory не всегда возвращает папку на SD card "- точнее, он всегда возвращает корень [внешнего хранилища] (https://commonsware.com/blog/2014/04/08/storage-situation-external-storage.html). Внешнее хранилище практически невозможно снимать на современных устройствах Android. – CommonsWare

+0

«не всегда возвращает папку на SD-карте» это потому, что Android Docs говорят (о [ 'getExternalStorageDirectory()'] (http://developer.android.com/intl/ko/reference/android/os /Environment.html#getExternalStorageDirectory%28%29)) 'Традиционно это SD-карта, но она также может быть реализована как встроенное хранилище в устройстве, которое отличается от защищенного внутреннего хранилища и может быть смонтировано как файловая система на компьютер.' – Sufian

+0

Я сделал несколько тестов: Motorola MotoG 2-го поколения с Android 5.0.2 и SD-картой:/storage/sdcard1/Android/data/mypackage/cache/bmp Asus Nexus7 с ОС Android 6.0 и NO sd card return: /storage/emulated/0/Android/data/com.vesco.personaggi2/cache/bmp Что вы написали, это своего рода блестящий человек. – Vesco

0

попробовать этот

File sdCard = Environment.getExternalStorageDirectory(); 
File dir = new File (sdCard.getAbsolutePath() + "/newfolder"); 
dir.mkdirs(); 

добавить разрешение в файле манифеста

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

, что строка кода создать папку/хранения/эмулировать/0 – Vesco

+0

, на котором телефон вы тестирования – Gaurav

+0

Motorola MotoG 2-го поколения с Android 5.0.2 – Vesco

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