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



我正在使用Nougut 7.1.1设备

当我运行下面给出的代码时,文件存储在设备或内部存储"模拟/0..."中,但我想将其存储在可移动存储卡中。

我记录了getExternalStorageState((,它显示已挂载。
我也尝试使用Environment.getExternalStorageDirectory((,存储在"emulated/0..."中,没有结果

我也在清单文件中使用了权限,如下所示:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

注意:但是,内部和外部(存储卡(存储都由"Hello World"文件夹组成,例如:
Android/Data/com.example.myapplication/files/Hello World/

但存储的文件(myData2.txt(仅存在于内部存储的"Hello World"文件夹中

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();
}
}
}
}
}

更改了我的 savePrivate(( 方法,如下所示,它就像一个魅力!!
根据@CommonsWare建议,使用 getExternalFilesDirs(( 返回了我可以从中选择特定存储的可用位置数组,在我的情况下,文件夹 [0] 指向"模拟/0.."和文件夹 [1] 指向可移动存储(存储/15C8-119Z/...(。

public void savePrivate() {
String info = "Written";
File[] folder = getExternalFilesDirs("backup");// Folder Name
Log.i("tag", String.valueOf(folder[1]).toString());
File myFile = new File(folder[1], "myData2.txt");// Filename
writeData(myFile, info);
}

但存储的文件(myData2.txt(仅存在于内部存储的"Hello World"文件夹中

它存储在Android SDK所指的外部存储中。外部存储不是可移动存储,也不是 Android SDK 所说的内部存储。

当我运行下面给出的代码时,文件存储在设备或内部存储"模拟/0..."中,但我想将其存储在可移动存储卡中。

首先,将无效值传递给getExternalFilesDir()。请按照文档输入有效值(例如,Environment.DIRECTORY_MUSIC(或null

若要写入可移动存储,请将getExternalFilesDir()替换为getExternalFilesDirs(),然后从返回的位置数组中选择一个位置。如果该数组有 2+ 个条目,则其中 1+ 个条目将位于可移动存储上。

从Android 4.4(API 级别 19(开始,读取或写入应用私有外部存储目录中的文件(使用 getExternalFilesDir(( 访问(不需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限。因此,如果您的应用支持 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(开始,您可以通过调用 getExternalFilesDirs(( 来访问这两个位置,该 dirs(( 返回一个 File 数组,其中包含每个存储位置的条目。阵列中的第一个条目被视为主外部存储,除非它已满或不可用,否则应使用该位置。

如果您的应用支持 Android 4.3 及更低版本,则应使用支持库的静态方法 ContextCompat.getExternalFilesDirs((。这始终会返回一个 File 数组,但如果设备运行的是 Android 4.3 及更低版本,则它只包含一个用于主外部存储的条目(如果有第二个存储位置,则无法在 Android 4.3 及更低版本上访问它(。

查看官方文档以获取详细说明。

希望这有帮助。

这是一个上下文中的函数,您可以在其中获取所有装载的存储

ContextCompat.getExternalFilesDirs(context,Environment.YOUR_DIRECTORY);

因此,首先是您的主要内部存储,其次是已安装的SD卡(如果已安装(。您可以使用此函数返回SD卡目录,如果SD卡挂载了内部存储目录

File getDir(Context context){
File[] mountedStorage = ContextCompat.getExternalFilesDirs(context,Environment.DIRECTORY_PICTURES);
return mountedStorage[mountedStorage.length-1];
}

与 Kotlin

val dir:File = ContextCompat.getExternalFilesDirs(context,Environment.YOUR_DIRECTORY).last()

最新更新