Android getExternalFilesDir()不将文件存储到已装入的存储卡

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.

我正在使用Nougut 7.1.1设备

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>