Find location of a removable SD card

前端 未结 22 2588
南方客
南方客 2020-11-21 11:32

Is there an universal way to find the location of an external SD card?

Please, do not be confused with External Storage.

Environment.getExternalStorage

22条回答
  •  -上瘾入骨i
    2020-11-21 11:40

    You can try to use the support library function called of ContextCompat.getExternalFilesDirs() :

          final File[] appsDir=ContextCompat.getExternalFilesDirs(getActivity(),null);
          final ArrayList extRootPaths=new ArrayList<>();
          for(final File file : appsDir)
            extRootPaths.add(file.getParentFile().getParentFile().getParentFile().getParentFile());
    

    The first one is the primary external storage, and the rest are supposed to be real SD-cards paths.

    The reason for the multiple ".getParentFile()" is to go up another folder, since the original path is

    .../Android/data/YOUR_APP_PACKAGE_NAME/files/
    

    EDIT: here's a more comprehensive way I've created, to get the sd-cards paths:

      /**
       * returns a list of all available sd cards paths, or null if not found.
       *
       * @param includePrimaryExternalStorage set to true if you wish to also include the path of the primary external storage
       */
      @TargetApi(Build.VERSION_CODES.HONEYCOMB)
      public static List getSdCardPaths(final Context context, final boolean includePrimaryExternalStorage)
        {
        final File[] externalCacheDirs=ContextCompat.getExternalCacheDirs(context);
        if(externalCacheDirs==null||externalCacheDirs.length==0)
          return null;
        if(externalCacheDirs.length==1)
          {
          if(externalCacheDirs[0]==null)
            return null;
          final String storageState=EnvironmentCompat.getStorageState(externalCacheDirs[0]);
          if(!Environment.MEDIA_MOUNTED.equals(storageState))
            return null;
          if(!includePrimaryExternalStorage&&VERSION.SDK_INT>=VERSION_CODES.HONEYCOMB&&Environment.isExternalStorageEmulated())
            return null;
          }
        final List result=new ArrayList<>();
        if(includePrimaryExternalStorage||externalCacheDirs.length==1)
          result.add(getRootOfInnerSdCardFolder(externalCacheDirs[0]));
        for(int i=1;i

提交回复
热议问题