我想将文本文件保存到我插入运行棒棒糖的HTC One M8的SD卡中。但是,当我运行此代码时,它会保存到内部存储中。
String FILENAME = "mysavefile.txt";
File file = new File(Environment.getExternalStorageDirectory(), FILENAME);
if (isExternalStorageWritable()) {
errorSD.setVisibility(View.INVISIBLE);
try {
FileOutputStream fos = new FileOutputStream(file, false);
fos.write(allInformation.getBytes(), 0, 81);
fos.close();
successfulSubmissionToast();
} catch (FileNotFoundException e) {
e.printStackTrace();
errorSD.setVisibility(View.VISIBLE);
} catch (IOException e) {
e.printStackTrace();
}
应该保存到
/storage/ext_sd
但是保存到
/storage/emulated/0
然后我尝试手动输入SD卡的位置以查看是否可行但是它最终抛出了FileNotFoundException
File file = new File("/storage/ext_sd", FILENAME);
编辑: 我认为问题是有多个外部存储。一个是永久的,一个是临时的。问题是如何访问第二个。
答案 0 :(得分:2)
首先,我们需要了解内部存储,外部存储(又称主外部存储)和辅助外部存储之间的区别是什么?
内部存储是用户无法访问的存储,除非是已安装的应用(或通过生根设备)。示例:data / data / app_packageName
主要外部存储:在内置的共享存储中,用户可以通过插入USB电缆并将其作为驱动器安装在主机上进行访问"。示例:当我们说Nexus 5 32 GB。
辅助外部存储:可移动存储。示例:SD卡。
getExternalStorageDirectory ()
它将返回主外部存储目录的路径
要访问可移动SD(辅助外部存储),有以下API:
getExternalFilesDirs(), getExternalCacheDirs(),
和getExternalMediaDirs()
查看文档以获取更多信息
答案 1 :(得分:1)
如果Android设备在此处guide之后处理多个外部存储,我们可以使用以下代码来检测Android kitkat或更高版本的数据写入位置。
final String APP_EXTERNAL_CACHE = "Android" + File.separator + "data"
+ File.separator + getPackageName() + File.separator + "cache";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
for (File file : getExternalCacheDirs()) {
if (file != null) {
String mountPoint = file.getAbsolutePath().replace(APP_EXTERNAL_CACHE, "");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (Environment.isExternalStorageRemovable(file)) {
Log.d(TAG, "removable external " + file.getAbsolutePath());
}
if (Environment.isExternalStorageEmulated(file)) {
Log.d(TAG, "emulated internal " + file.getAbsolutePath());
}
} else {
if (mountPoint.contains("emulated")) {
Log.d(TAG, "emulated internal " + mountPoint);
} else {
Log.d(TAG, "removable external " + mountPoint);
}
}
}
}
}
并在清单中声明相关许可。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
答案 2 :(得分:1)
我想将文本文件保存到插入我的HTC One M8运行棒棒糖的SD卡中
欢迎您在getExternalFilesDirs()
上尝试getExternalCacheDirs()
,getExternalMediaDirs()
和Context
。请注意方法名称的复数形式。对于这些方法,如果它们返回多个条目,则第二个和后续条目应位于可移动介质上,指向您可以读取和写入的目录,而无需任何特定权限(例如,WRITE_EXTERNAL_STORAGE
)。
在这些位置之外,对于Android 4.4及更高版本的设备,you have no access to removable storage。
答案 3 :(得分:-1)
我认为这是因为HTC one修改了sdcard挂载点,你应该尝试adb shell
ls -l
命令找出sdcard挂载的路径。
例如在nexus 4中:
lrwxrwxrwx root root 2015-03-24 18:26 sdcard -> /storage/emulated/legacy
drwxr-x--x root sdcard_r 2015-03-24 18:26 storage
您应该确保它不是链接:ls -l /storage/emulated/legacy
lrwxrwxrwx root root 2015-03-24 18:26 legacy -> /mnt/shell/emulated/0
路径/mnt/shell/emulated/0
实际上是SD卡路径。
请尝试阅读How can I get external SD card path for Android 4.0+?,这可能会对您有所帮助。
<强>更新强>
我试过这段代码:
String test = "/storage/emulated/legacy"; // work
//String test = "/mnt/shell/emulated/legacy"; // not work
File sdDir = new File(test);
if (sdDir.exists()) {
File file = new File(test, "test.sdcard");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
所以你最好试试/storage/emulated/*
个目录,找出哪个是你的SD卡。