Ottenere la posizione SDCard esterna in Android

Ho un'applicazione con dati enormi pre-memorizzati nella SD Card.

Stiamo sostenendo tutte le tabelle ICS in avanti . Non riesco a trovare un modo per accedere correttamente alla posizione SDCard su tutti i dispositivi.

  • onActivityResult Con launchMode = "singleTask"?
  • Come identificare il clic del button in getChildView di ExpandableListView in android
  • RandomAccessFile nel file di risorse raw di Android
  • Applicare molti filtri di colore allo stesso disegnatore
  • Come creare uno stile inbox (con il count dei conteggi) per android?
  • Animazione di materiale in android
  • Ho esaminato diverse soluzioni date qui su SO, ma non sembrano funzionare in tutti i casi. Alla ricerca di una soluzione generica.

    Anche se qualcuno può dirmi tutti i punti di assembly possibili di SDCard.

    Sto pensando alle compresse android solo se questo può restringere la soluzione.

    4 Solutions collect form web for “Ottenere la posizione SDCard esterna in Android”

    Purtroppo questo è un problema comune a causa del fatto che i dispositivi Android sono estremamente frammentati. Environment.getExternalStorageDirectory() riferisce a qualunque produttore del dispositivo considera "storage esterno". Su alcuni dispositivi, questo è un supporto rimovibile, come una scheda SD. Su alcuni dispositivi, questa è una parte del flash sul dispositivo. ( http://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory () ) Qui "memory esterna" significa "l'unità accessibile tramite modalità di archiviazione di massa USB quando montato su una macchina host ". Se un produttore di dispositivi ha scelto di avere una memory esterna a bordo e dispone anche di una scheda SD, è necessario contattare tale produttore per determinare se è ansible utilizzare la scheda SD. Per la maggior parte dei dispositivi android compatibili (quelli noti dall'elenco di conformità di google), Environment.getExternalStorageDirectory() dovrebbe funzionare. Oppure potresti scrivere una class di archiviazione personalizzata che guarda i punti di assembly e ti dà il giusto cammino verso l'SDCard montato. Questo è qualcosa che ho implementato e ha funzionato finora.

     public class StorageOptions { private static ArrayList<String> mMounts = new ArrayList<String>(); private static ArrayList<String> mVold = new ArrayList<String>(); public static String[] labels; public static String[] paths; public static int count = 0; private static final String TAG = StorageOptions.class.getSimpleName(); public static void determineStorageOptions() { readMountsFile(); readVoldFile(); compareMountsWithVold(); testAndCleanMountsList(); setProperties(); } private static void readMountsFile() { /* * Scan the /proc/mounts file and look for lines like this: * /dev/block/vold/179:1 /mnt/sdcard vfat * rw,dirsync,nosuid,nodev,noexec, * relatime,uid=1000,gid=1015,fmask=0602,dmask * =0602,allow_utime=0020,codepage * =cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 * * When one is found, split it into its elements and then pull out the * path to the that mount point and add it to the arrayslist */ // some mount files don't list the default // path first, so we add it here to // ensure that it is first in our list mMounts.add("/mnt/sdcard"); try { Scanner scanner = new Scanner(new File("/proc/mounts")); 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) { // Auto-generated catch block e.printStackTrace(); } } private static void readVoldFile() { /* * Scan the /system/etc/vold.fstab file and look for lines like this: * dev_mount sdcard /mnt/sdcard 1 * /devices/platform/s3c-sdhci.0/mmc_host/mmc0 * * When one is found, split it into its elements and then pull out the * path to the that mount point and add it to the arrayslist */ // some devices are missing the vold file entirely // so we add a path here to make sure the list always // includes the path to the first sdcard, whether real // or emulated. mVold.add("/mnt/sdcard"); try { Scanner scanner = new Scanner(new File("/system/etc/vold.fstab")); 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(":")); // don't add the default vold path // it's already in the list. if (!element.equals("/mnt/sdcard")) mVold.add(element); } } } catch (Exception e) { // Auto-generated catch block e.printStackTrace(); } } private static void compareMountsWithVold() { /* * Sometimes the two lists of mount points will be different. We only * want those mount points that are in both list. * * Compare the two lists together and remove items that are not in both * lists. */ for (int i = 0; i < mMounts.size(); i++) { String mount = mMounts.get(i); if (!mVold.contains(mount)) mMounts.remove(i--); } // don't need this anymore, clear the vold list to reduce memory // use and to prepare it for the next time it's needed. mVold.clear(); } private static void testAndCleanMountsList() { /* * Now that we have a cleaned list of mount paths Test each one to make * sure it's a valid and available path. If it is not, remove it from * the list. */ for (int i = 0; i < mMounts.size(); i++) { String mount = mMounts.get(i); File root = new File(mount); if (!root.exists() || !root.isDirectory() || !root.canWrite()) mMounts.remove(i--); } } @SuppressWarnings("unchecked") private static void setProperties() { /* * At this point all the paths in the list should be valid. Build the * public properties. */ Constants.mMounts = new ArrayList<String>(); ArrayList<String> mLabels = new ArrayList<String>(); int j = 0; if (mMounts.size() > 0) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) mLabels.add("Auto"); else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { if (Environment.isExternalStorageRemovable()) { mLabels.add("External SD Card 1"); j = 1; } else mLabels.add("Internal Storage"); } else { if (!Environment.isExternalStorageRemovable() || Environment.isExternalStorageEmulated()) mLabels.add("Internal Storage"); else { mLabels.add("External SD Card 1"); j = 1; } } if (mMounts.size() > 1) { for (int i = 1; i < mMounts.size(); i++) { mLabels.add("External SD Card " + (i + j)); } } } labels = new String[mLabels.size()]; mLabels.toArray(labels); paths = new String[mMounts.size()]; mMounts.toArray(paths); Constants.mMounts = (ArrayList<String>) mMounts.clone(); Constants.mLabels = (ArrayList<String>) mLabels.clone(); count = Math.min(labels.length, paths.length); // don't need this anymore, clear the mounts list to reduce memory // use and to prepare it for the next time it's needed. mMounts.clear(); } } 

    Ho trovato questo fuori di una domanda simile da SO, che non ho il collegamento a purtroppo, ma è probabilmente il sito sviluppatore di Sony di Sony (nessuno dei collegamenti c'è purtroppo). Wagic – una libreria del motore di gioco C ++ implementa la stessa e il loro codice è qui: http://wagic.googlecode.com/svn-history/r4300/trunk/projects/mtg/Android/src/net/wagic/utils/StorageOptions. java in modo da poter guardare l'implementazione. Desidero che qualcuno di Google possa rispondere a questa domanda e fornisca un solo modo che legge il punto di assembly di SDcard da tutti i dispositivi Android

    Non è semplice come stai pensando, String f = Environment.getExternalStorageDirectory (). GetAbsolutePath (); Log.v ("TAG", f); // per printingre il path di sdcard

    Riport il path di memorizzazione del dispositivo non un sdcard esterno.

    Se stai cercando di get il path alla scheda SD utilizzare questo codice

    String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();

    Quindi utilizzare questo per get il path della cartella / file specifica

    String path = baseDir + "/your folder(s)/" + fileName;

    È semplice.

     String f = Environment.getExternalStorageDirectory().getAbsolutePath(); Log.v("TAG",f);//to print the path of sdcard 

    se si desidera accedere a un file allora.

     String f = Environment.getExternalStorageDirectory()+"/file.ext"; Log.v("TAG",f);//to print the path of file in Logcat. 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.