Autore Topic: Individuare storage folders  (Letto 659 volte)

Offline uglyicons

  • Utente junior
  • **
  • Post: 88
  • UglyIcons - Great Apps (perlomeno ci proviamo)
  • Respect: +3
    • Mostra profilo
    • La mia app: EML Reader FREE
  • Dispositivo Android:
    Huawei Honour
  • Play Store ID:
    UglyIcons
  • Sistema operativo:
    Win
Individuare storage folders
« il: 14 Novembre 2013, 13:14:13 CET »
0
Ciao

Sto cercando di mettere assieme una funzione che mi enumeri tutti i folder di storage accessibili dalla mia app. Devo fare un file browser simile a, per esempio, ES File Explorer, e come quest'ultimo, vorrei elencare i device che vedo.

Ho trovato esempi che partono da /proc/mounts e li confrontano con vold.fstab, ma ho notato sul mio Huawei che /mnt/sdcard2 (che fa riferimento allo storage interno del telefono, funzionalmente analogo alla SD esterna ma builtin) non compare i9n vold.fstab
Mi piacerebbe avere un metodo che funzioni da 2.2 in su...

Qualcuno ha qualche indicazione da darmi per discriminare i mount ? ES File Explorer lo fa, quindi devono avere qualche metodo per farlo...

Grazie !

Ciao,
      Paolo

Codice (Java): [Seleziona]
  /**
     * @return A map of all storage locations available
     */

    public static Map<String, File> getAllStorageLocations() {
        Map<String, File> map = new HashMap<String, File>(10);

        List<String> mMounts = new ArrayList<String>(10);
        List<String> mVold = new ArrayList<String>(10);
        mMounts.add("/mnt/sdcard");
        mVold.add("/mnt/sdcard");

        try {
            File mountFile = new File("/proc/mounts");
            if(mountFile.exists()){
                Scanner scanner = new Scanner(mountFile);
                while (scanner.hasNext()) {
                    String line = scanner.nextLine();
                    if (line.startsWith("/dev/block/vold/")) {
                        String[] lineElements = line.split(" ");
                        String element = lineElements[1];

                        // don't add the default mount path
                        // it's already in the list.
                        if (!element.equals("/mnt/sdcard"))
                            mMounts.add(element);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            File voldFile = new File("/system/etc/vold.fstab");
            if(voldFile.exists()){
                Scanner scanner = new Scanner(voldFile);
                while (scanner.hasNext()) {
                    String line = scanner.nextLine();

                    if (line.startsWith("dev_mount")) {
                        String[] lineElements = line.split(" ");
                        String element = lineElements[2];

                        if (element.contains(":"))
                            element = element.substring(0, element.indexOf(":"));
                        if (!element.equals("/mnt/sdcard"))
                            mVold.add(element);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        for (int i = 0; i < mMounts.size(); i++) {
            String mount = mMounts.get(i);
            if (!mVold.contains(mount))
                mMounts.remove(i--);
        }
        mVold.clear();

        List<String> mountHash = new ArrayList<String>(10);

        for(String mount : mMounts){
            File root = new File(mount);
            if (root.exists() && root.isDirectory() && root.canWrite()) {
                File[] list = root.listFiles();
                String hash = "[";
                if(list!=null){
                    for(File f : list){
                        hash += f.getName().hashCode()+":"+f.length()+", ";
                    }
                }
                hash += "]";
                if(!mountHash.contains(hash)){
                    String key = SD_CARD + "_" + map.size();
                    if (map.size() == 0) {
                        key = SD_CARD;
                    } else if (map.size() == 1) {
                        key = EXTERNAL_SD_CARD;
                    }
                    mountHash.add(hash);
                    map.put(key, root);
                }
            }
        }

        mMounts.clear();

        if(map.isEmpty()){
                 map.put(SD_CARD, Environment.getExternalStorageDirectory());
        }
        return map;
    }
EML Reader FREE
Apri file e allegati EML e MSG da qualsiasi fonte.
Download su Play Store!