我怎样才能在三星和所有其他设备上获得正确的外部存储?

官方方法Environment.getExternalStorageDirectory()似乎不能在三星设备上工作…

它返回“/ sdcard /”而不是真正的path“/ sdcard / external_sd /”,你可以参考下面的文章

三星Galaxy上的Android SD卡特性

是否有另外的方法来检测外部实际存储path并适用于所有设备? 或者只是教我如何避免这个问题?

谢谢。

Solutions Collecting From Web of "我怎样才能在三星和所有其他设备上获得正确的外部存储?"

你能不能尝试像这样的东西:

String url = Environment.getExternalStorageDirectory(); if(android.os.Build.DEVICE.contains("Samsung") || android.os.Build.MANUFACTURER.contains("Samsung")){ url = url + "/external_sd/"; } 

我希望下面的代码是有帮助的。 该代码find可移动外部存储(即SD卡)的path。

  File file = new File("/system/etc/vold.fstab"); FileReader fr = null; BufferedReader br = null; try { fr = new FileReader(file); } catch (FileNotFoundException e) { e.printStackTrace(); } try { if (fr != null) { br = new BufferedReader(fr); String s = br.readLine(); while (s != null) { if (s.startsWith("dev_mount")) { String[] tokens = s.split("\\s"); path = tokens[2]; //mount_point if (!Environment.getExternalStorageDirectory().getAbsolutePath().equals(path)) { break; } } s = br.readLine(); } } } catch (IOException e) { e.printStackTrace(); } finally { try { if (fr != null) { fr.close(); } if (br != null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } 

为了获得所有外部存储path,可以使用ContextCompat.getExternalFilesDirs()

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

第一个是主要的外部存储,其余的应该是真正的SD卡path。

多个“.getParentFile()”的原因是上一个文件夹,因为原来的path是

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

是否有另外一种方法来检测外部实际存储path并适用于所有设备?

不,Android通过SDK支持一个“外部存储真实path”。 在这些三星设备的情况下,有多个“外部存储”。 没有SDK提供的方式来获取任何其他存储path。

如果你正在为三星Galaxy做一个应用程序,那么Blundell提供的解决scheme是最好的。 但是,你必须确保所有的三星Galaxy Tablet /手持设备共享一个共同的目录结构。 例如,在某些三星设备(具有较低的存储规格),您可能无法find/ mnt / sdcard / external_sd; 相反,您必须将/ data视为内部存储,将/ mnt / sdcard视为外部存储。 此外,不保证所有的三星设备将具有相同的共同目录结构,你是硬编码。 所以,只要确保你检查不同的三星设备的目录结构。 如果你正在制作一个通用的应用程序(对于所有的Android设备),那么恐怕这种方法是行不通的,除非Android提供了一个API或制造商自带的API,如摩托罗拉外部存储API,你可以在这里findhttp: //developer.motorola.com/docstools/library/motorola-external-storage-api/ 。 祝你好运