Android Dev:直接在三星设备上访问外部SD卡(使用extSdCard路径)?

时间:2016-03-11 18:23:15

标签: android filesystems storage

我正在学习Android开发,所以对于一些技术性Android概念来说相对较新,但我确实有很强的开发人员背景。

我正在编写一个应用程序,希望能够直接访问用户SD卡上的文件。测试设备是三星Galaxy Tab 4.

三星似乎使用自定义方法安装SD卡,将其放在/storage/extSdCard而不是传统的/sdcard

在我的应用中,我使用方法Environment.getExternalStoragePublicDirectory方法来请求存储路径,并且给出了指向内部存储而不是SD卡的路径。 (/storage/sdcard0/...

当我尝试直接访问SD卡存储空间(/storage/extSdCard/...)时,收到错误open failed: EACCES (Permission denied)

此设备 - 可能是任何用户的设备 - 内部存储器上的存储空间非常有限。 (此设备内部只有8GB的存储空间,其中大部分都被应用占用。)此外,我希望潜在的应用用户能够直接将文件放到他们的MicroSD卡上而不必使用Android文件传输工具将内容加载到应用程序中......

我可以直接从三星设备上运行的应用程序访问外部SD卡吗?

测试代码:

public void doTest()
{
    FileWriter fw;

    File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "test.txt");
    Log.i("file","Trying to write a file at: "+f.getPath());
    try {
        fw = new FileWriter(f);
        fw.write("You got a file.");
        fw.flush();
        fw.close();
        Log.i("file", "Successfully wrote the file.");
    }
    catch (IOException e)
    {
        Log.i("file_error", "Could not write the file.");
        Log.i("file_error",e.getMessage());
    }

    f = new File("/storage/extSdCard/Documents", "test.txt");
    Log.i("file","Trying to write a file at: "+f.getPath());
    try {
        fw = new FileWriter(f);
        fw.write("You got a file.");
        fw.flush();
        fw.close();
        Log.i("file", "Successfully wrote the file.");
    }
    catch (IOException e)
    {
        Log.i("file_error", "Could not write the file.");
        Log.i("file_error",e.getMessage());
    }
}

1 个答案:

答案 0 :(得分:3)

  

我正在编写一个应用程序,希望能够直接访问用户SD卡上的文件。

这在Android 4.4+上是不可能的,因为大多数对removable storage的直接访问都已缩减。例外情况包括预先安装的应用程序和在root用户设备上运行并使用超级用户权限的应用程序。

  

三星似乎使用自定义方法安装SD卡,将其放在/ storage / extSdCard而不是更传统的/ SD卡上。

在大多数设备上,

/sdcard自Android 2.x以来,尚未用于可移动媒体。

  

在我的应用程序中,我使用Environment.getExternalStoragePublicDirectory方法来请求存储路径,并且给出了指向内部存储而不是SD卡的路径。 (/存储/ sdcard0 /...)

不,getExternalStoragePublicDirectory()指向external storage。外部存储空间不是removable storageInternal storage完全是另一回事。

  

我可以直接从三星设备上运行的应用程序访问外部SD卡吗?

欢迎您使用getExternalFilesDirs()上的getExternalCacheDirs()getExternalMediaDirs()Context方法。请注意复数方法名称。如果这些方法返回2个以上的条目,则第二个和后续条目是可移动存储上可以读取和写入的位置,无需权限。但是,您无法以这种方式访问​​所有可移动存储,只能访问特定于您应用的位置。

您也可以使用the Storage Access Framework,允许用户选择内容的位置,包括将其放在可移动存储上。但是,您不再使用文件和路径,而是使用内容和Uri值。

N Developer Preview为“Scoped Directory Access”提供了另一个选项,它支持可移动存储。但是,这仍然是当前(2016年3月)开发人员预览的一部分。