2015-02-10 40 views
1

我正在尝试将文件写入我的手机。如何获取外部存储的路径?

我使用Environment.getDataDirectory()来了解内部存储的路径,并使用Environment.getExternamStorageDirectory()来了解外部存储的路径。

但是,当我使用Environment.getExternalStorageDirectory()作为路径时,文件创建在内部存储。当我使用Environment.GetDataStorage()作为路径时,文件没有创建(不确定,但至少在explorer资源中找不到)

我认为我的手机的内部存储器被认为是外部存储器(在我的情况下,它有32GB的存储量)

我想知道可移动存储(例如micro SD card)路径。我该怎么办?

+2

'我想知道外部存储(micro SD卡)path.'那你更好地称其为可移动存储。其余的都是内部或外部存储。 – greenapps 2015-02-10 09:01:12

+1

用以下方法更改问题标题会更好:_如何获取外部存储路径?_。它可能会投票你的问题。 – 2015-02-10 09:01:56

+0

感谢您的建议! – soonoo 2015-02-10 09:04:32

回答

1

你可以试试这个代码来获取SD卡(外部存储)路径:

String separator = "/"; 
String sdcardPath = Environment.getExternalStorageDirectory().getPath() + separator; 

例如,作为String意志SD卡的路径是这样的:

"mnt/sdcard/" 

如果仍然没有按不起作用,请尝试使用getAbsolutePath()更改getPath()

然后,添加这些权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

下面是如何根据@ ShubhangMalviya的回答得到SD卡的目录:

public String getSDCardDirectory(){ 
    String SdcardPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString(); 
    String dir = SdcardPath.substring(SdcardPath.lastIndexOf('/') + 1); 
    System.out.println(dir); 
    String[] trimmed = SdcardPath.split(dir); 
    String sdcardPath = trimmed[0]; 
    System.out.println(sdcardPath); 
    return sdcardPath; 
} 

我建议你使用Environment.DIRECTORY_DCIM,因为大多数人从不将他们的DCIM(照片)路径从SD卡移动到内部存储。通常,总是在SD卡中。

+0

不幸的是' getPath()'和'getAbsolutePath()'返回相同的值,只是'getExternalStorage()' – soonoo 2015-02-10 08:55:18

+0

我通过创建一个方法来获取'String'中sdcard的路径来编辑答案。 – 2015-02-10 10:32:31

3

从官方文档getExternalStorageDirectory()

不要被这个词在这里混淆“外部”。该目录 可以更好地被认为是媒体/共享存储。它是一个文件系统,它可以容纳相对较大数量的数据,并在所有应用程序间共享(不强制执行权限) 。传统上,这是SD卡的 ,但它也可以作为 设备中的内置存储设备实现,该设备与受保护的内部存储设备不同,并且可以将 作为文件系统安装在计算机上。

因此,它可以不同于设备中的内置存储器。

对于您的情况,您可以使用getExternalStoragePublicDirectory(java.lang.String)

这是用户通常会放置和管理自己的 文件

这里的路径应该是DIRECTORY_MUSIC之一,DIRECTORY_PODCASTS, DIRECTORY_RINGTONES,DIRECTORY_ALARMS ,DIRECTORY_NOTIFICATIONS, DIRECTORY_PICTURES,DIRECTORY_MOVIES,DIRECTORY_DOWNLOADS或 DIRECTORY_DCIM。可能不为null。

,或者如果你希望自己的数据被删除,只要用户卸载你的应用程序,你可以使用getExternalFilesDir()

由于这些文件内部的应用程序,而不是通常给用户的媒体可见。

还有一些getFilesDir()getExternalFilesDir()

  1. 外部文件之间的一些差异并不总是可用:如果用户安装在计算机上的外部存储或删除它,他们就会消失。有关存储状态信息,请参阅环境上的API。

  2. 这些文件没有执行安全措施。例如,任何持有WRITE_EXTERNAL_STORAGE的应用程序都可以写入这些文件。

+0

我使用了'getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)',但下载路径只是从'/ storage/emulated/0'改为'/storage/emulated/0/Download'.still内置的存储空间。你知道为什么吗? – soonoo 2015-02-10 09:10:28

+0

我想你应该看到commonsware http://stackoverflow.com/a/23030038/2319390的答案,一定要看看他的博客文章系列 – 2015-02-10 13:48:17

+0

请你详细说明这句话“外部文件并不总是可用的:他们会如果用户在计算机上安装外部存储器或将其删除,则消失“?据我了解,当用户将他的设备安装到PC时,文件将被隐藏。但Google在谈论哪种安装模式?当我将设备连接到PC时,我可以看到PC上存储在上述路径上的所有文件。请解释上述句子。预先感谢! – VicJordan 2015-07-13 10:22:16

0
try this.... 
static String storagestate = Environment.getExternalStorageState(); 
    private static FileOutputStream outStream; 
    private static File imageFilepath; 

    public static String saveImage(Bitmap bitmap) { 
     File folder = null; 
//check for SD card 
     if (storagestate.equals(Environment.MEDIA_MOUNTED)) { 
      folder = new File(Environment.getExternalStorageDirectory(), 
        "*YourStorageNameInDevice"); 
      if (!folder.exists()) { 
       folder.mkdir(); 
      } 
      outStream = null; 

      String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") 
        .format(new Date()); 
//getting filepath 
      imageFilepath = new File(folder.getPath() + File.separator 
        + timestamp + ".PNG"); 
      try { 
       outStream = new FileOutputStream(imageFilepath); 
       bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
       outStream.flush(); 
       outStream.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return imageFilepath.getAbsolutePath(); 
    } 
} 
相关问题