2015-08-18 5 views
1

Есть ли способ получить /storage/. Я пробовал с Environment.getExternalStorageDirectory(), но он возвращает /storage/emulated/0. Я знаю, что могу использовать file.getParent(), но по какой-то причине я не могу это использовать. Я просто хочу прямой путь к каталогу /storage/, используя некоторую функцию ... Спасибо заранее.Как получить путь к каталогу хранения в android

ответ

1

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

Для этого вы можете использовать это,

public List<String> getStorageDirectories() { 

     // Final set of paths 
     final ArrayList<String> finalPaths = new ArrayList<String>(); 

     // Must add the ROOT directory 
     finalPaths.add("/"); 

     // Primary physical SD-CARD (not emulated) 
     final String rawExternalStorage = System.getenv("EXTERNAL_STORAGE"); 

     // All Secondary SD-CARDs (all exclude primary) separated by ":" 
     final String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE"); 

     // Primary emulated SD-CARD 
     final String rawEmulatedStorageTarget = System.getenv("EMULATED_STORAGE_TARGET"); 

     if (TextUtils.isEmpty(rawEmulatedStorageTarget)) { 

      // Device has physical external storage; use plain paths. 
      if (TextUtils.isEmpty(rawExternalStorage)) { 

       // EXTERNAL_STORAGE undefined; falling back to default. 
       finalPaths.add("/storage/sdcard0"); 
      } else { 
       finalPaths.add(rawExternalStorage); 
      } 
     } else { 

      // Device has emulated storage; external storage paths should have 
      // userId burned into them. 
      final String rawUserId; 
      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { 
       rawUserId = ""; 
      } else { 

       final String path = Environment.getExternalStorageDirectory().getAbsolutePath(); 
       final String[] folders = DIR_SEPARATOR.split(path); 
       final String lastFolder = folders[folders.length - 1]; 
       boolean isDigit = false; 
       try { 
        Integer.valueOf(lastFolder); 
        isDigit = true; 
       } catch (NumberFormatException ignored) { 
       } 
       rawUserId = isDigit ? lastFolder : ""; 
      } 
      // /storage/emulated/0[1,2,...] 
      if (TextUtils.isEmpty(rawUserId)) { 
       finalPaths.add(rawEmulatedStorageTarget); 
      } else { 
       finalPaths.add(rawEmulatedStorageTarget + File.separator + rawUserId); 
      } 
     } 
     // Add all secondary storages 
     if (!TextUtils.isEmpty(rawSecondaryStoragesStr)) { 
      // All Secondary SD-CARDs splited into array 
      final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator); 
      Collections.addAll(finalPaths, rawSecondaryStorages); 
     } 

     File usb = getUsbDrive(); 

     if (usb != null && !finalPaths.contains(usb.getPath())) 
      finalPaths.add(usb.getPath()); 

     return finalPaths; 
    } 

А вот метод, чтобы получить диск USB, прикрепленный к устройству,

public File getUsbDrive() { 
     File parent; 
     parent = new File("/storage"); 

     try { 
      for (File f : parent.listFiles()) { 
       if (f.exists() && f.getName().toLowerCase().contains("usb") && f.canExecute()) { 
        return f; 
       } 
      } 
     } catch (Exception e) { 
     } 
     parent = new File("/mnt/sdcard/usbStorage"); 
     if (parent.exists() && parent.canExecute()) 
      return (parent); 
     parent = new File("/mnt/sdcard/usb_storage"); 
     if (parent.exists() && parent.canExecute()) 
      return parent; 

     return null; 
    } 

Но помните, что это не является официальным способом но взломать, поэтому используйте его на свой страх и риск.

+0

'finalPaths.add ("/ storage/sdcard0");' Почему это было бы справедливо, если все не удалось? «все USB-накопители». Это даст только один. И в некоторых устройствах они находятся под/mnt. – greenapps

+0

@greenapps Как уже упоминалось, это взломать и не гарантирует работу на всех устройствах. Нам повезло бы, если бы были какие-то официальные способы. –

+0

Вы забыли использовать getExternalFileDirs(). Dirs! И от USB вы не доставляете всех. – greenapps

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

  • Нет связанных вопросов^_^