Android getExternalFilesDir()不将文件存储到已装入的存储卡
我正在使用Nougut 7.1.1设备Android getExternalFilesDir()不将文件存储到已装入的存储卡,android,android-external-storage,Android,Android External Storage,我正在使用Nougut 7.1.1设备 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("tag", Environment.getExternalStorageState().toString());
Log.i("tag", getExternalFilesDir(null).toString());
savePrivate();
}
public void savePrivate() {
String info = "Written";
File folder = getExternalFilesDir("Hello World");// Folder Name
File myFile = new File(folder, "myData2.txt");// Filename
writeData(myFile, info);
}
private void writeData(File myFile, String data) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(myFile);
fileOutputStream.write(data.getBytes());
Toast.makeText(this, "Done" + myFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
当我运行下面给定的代码时,文件存储在设备或内部存储器“模拟/0…”中,但我想将其存储在可移动存储卡中
我记录了getExternalStorageState(),它显示已装入。我也尝试过使用Environment.getExternalStorageDirectory(),它存储在“仿真/0…”中,没有结果 我在清单文件中也使用了权限,如下所示:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
但存储的文件(myData2.txt)仅存在于内部存储器的“helloworld”文件夹中
它存储在Android SDK所称的。外部存储不是,也不是Android SDK所说的
当我运行下面给定的代码时,文件存储在设备或内部存储器“模拟/0…”中,但我想将其存储在可移动存储卡中
首先,您正在向getExternalFilesDir()
传递一个无效值。请遵循并输入有效值(例如,Environment.DIRECTORY\u MUSIC
)或null
要写入可移动存储,请替换
getExternalFilesDir()
,然后从返回的位置数组中选择一个位置。如果该数组有2+个条目,其中1+将位于可移动存储上。如下更改了我的savePrivate()方法,效果非常好根据@commonware的建议,使用getExternalFilesDirs()返回可用的位置数组,我可以从中选择特定的存储,在我的例子中,文件夹[0]指向“模拟的/0…”,文件夹[1]指向可移动存储(存储/15C8-119Z/) 从开始,使用getExternalFilesDir()访问应用程序的专用外部存储目录中的文件进行读取或写入-不需要读取外部存储或写入外部存储权限。因此,如果您的应用程序支持Android 4.3(API级别18)及更低版本,并且您只想访问私有外部存储目录,则应通过添加maxSdkVersion属性声明仅在更低版本的Android上请求权限:
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
</manifest>
在多个存储位置之间选择
有时,分配内部内存分区用作外部存储器的设备也会提供SD卡插槽。这意味着设备有两个不同的外部存储目录,因此在将“私有”文件写入外部存储时,需要选择要使用的目录
从Android 4.4(API级别19)开始,您可以通过调用getExternalFileDirs()访问这两个位置,该函数返回一个文件数组,其中包含每个存储位置的条目。阵列中的第一个条目被视为主要外部存储,除非该位置已满或不可用,否则应使用该位置
如果您的应用程序支持Android 4.3及更低版本,则应使用支持库的静态方法ContextCompat.getExternalFilesDirs()。这总是返回一个文件数组,但如果设备运行的是Android 4.3及更低版本,那么它只包含一个主外部存储条目(如果有第二个存储位置,则无法在Android 4.3及更低版本上访问)
有关详细说明,请参阅
希望这能有所帮助。您是否在运行时检查授予的权限否否,我没有检查在运行时授予的权限。写入外部存储是必需的吗?请参阅我的回复谢谢@Commonware GetExternalFileDirs()返回了两个位置0和1。现在我可以在任何地方保存我的文件。为什么应用程序甚至需要自己的外部存储区域,而它们有一个内部存储区域?@AndrewS:用户无法访问内部存储。不过,用户可以通过提供的文件管理器应用程序或USB电缆访问外部存储。但我认为这就是为什么存在模拟/0/之类的东西。这似乎违反直觉。我不知道任何一个非技术导向的Android用户会想到在这样一个位置寻找。现在是否有一种非弃用的方式使I能够引用/模拟/0/(如果有)?尝试了你的解决方案,我的Google Pixel 2和3a只得到了一个奇数位置“/storage/simulated/0/Android/media/edu.wcu.cs.androidstyle”。为什么我们不能用/storage/simulated/0/来代替所有这些额外的东西?@AndrewS:“我不知道任何一个非技术导向的Android用户会想到在这样一个地方寻找”——毫无疑问,谷歌可以在这里做得更好。“现在有没有一种非弃用的方法可以让我引用/模拟/0/如果它可用的话?”--Android R开发者预览版已经有了。当应用程序有自己的内部存储区域时,我们为什么还要这样做呢?
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
</manifest>