我正在学习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());
}
}
答案 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 storage。 Internal storage完全是另一回事。
我可以直接从三星设备上运行的应用程序访问外部SD卡吗?
欢迎您使用getExternalFilesDirs()
上的getExternalCacheDirs()
,getExternalMediaDirs()
和Context
方法。请注意复数方法名称。如果这些方法返回2个以上的条目,则第二个和后续条目是可移动存储上可以读取和写入的位置,无需权限。但是,您无法以这种方式访问所有可移动存储,只能访问特定于您应用的位置。
您也可以使用the Storage Access Framework,允许用户选择内容的位置,包括将其放在可移动存储上。但是,您不再使用文件和路径,而是使用内容和Uri
值。
N Developer Preview为“Scoped Directory Access”提供了另一个选项,它支持可移动存储。但是,这仍然是当前(2016年3月)开发人员预览的一部分。