Java 在SD卡上创建文件

Java 在SD卡上创建文件,java,android,Java,Android,我在将数据库备份到SD卡时遇到问题。 目标SDK:25 电话:23 另外,Environment.getExternalStorageDirectory()方法对我来说工作不正常(因为它返回内部存储路径) 我正在使用另一种方法获取SD卡的路径,该路径返回我: /mnt/media_rw/8209-21EA 当getExternalStorageDirectory()返回时: /存储/模拟/0 我通过ES访问了/mnt/media_rw/8209-21EA,这是我手机上SD卡的真实路径 至少ES正

我在将数据库备份到SD卡时遇到问题。 目标SDK:25 电话:23

另外,Environment.getExternalStorageDirectory()方法对我来说工作不正常(因为它返回内部存储路径)

我正在使用另一种方法获取SD卡的路径,该路径返回我: /mnt/media_rw/8209-21EA

当getExternalStorageDirectory()返回时: /存储/模拟/0

我通过ES访问了/mnt/media_rw/8209-21EA,这是我手机上SD卡的真实路径

至少ES正在使用/storage/8209-21EA/path访问我的SD

所以,当我试图在上调用“file.mkdirs()”时

此方法给我“false”,并且不创建任何文件夹

我正在使用此代码获取权限:

if (ContextCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {

                if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                } else {
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            1);

                }
            }


在我的清单文件中


有什么办法让它工作吗?

用这个来获取SD卡路径

Context.getExternalFilesDirs();
请注意,如果在访问期间未安装或移动SD卡,则可能返回null。此外,您可能需要将这些权限添加到清单文件中:

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

另外,Environment.getExternalStorageDirectory()方法对我来说工作不正常(因为它返回内部存储路径)

不是,这两个都不是

至少ES正在使用/storage/8209-21EA/path访问我的SD

除非您的设备上预先安装了“ES”,否则它与您一样没有使用可移动存储的更多权限

因此,当我试图在
file=new文件(getRemovebleSDCardPath()+“/data/com.indi.passwords”)上调用“file.mkdirs()”此方法给我“false”,并且不创建任何文件夹

对。您不能直接访问可移动存储上的任意位置

我正在使用此代码获取权限:

if (ContextCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {

                if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                } else {
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            1);

                }
            }
这些权限与可移动存储无关

有没有办法让它工作起来

如果“that”是您现有的代码,那么这是不可能的,除非在根设备上

如果“那”是将一些数据写入可移动存储器,则您可以选择:

  • 使用
    getExternalFilesDirs()
    getExternalCacheDirs()
    ,或
    getExternalMediaDirs()
    ,在
    上下文中使用所有方法。如果它们在数组返回值中返回2+个项目,则第二个和后续的项目位于可移动存储上。您可以在没有任何权限的情况下读取和写入这些位置

  • 或者,使用
    ACTION\u CREATE\u DOCUMENT
    允许用户选择将数据放置在何处,这些数据可能是可移动存储,也可能不是可移动存储。在
    ContentResolver
    上调用
    openOutputStream()。使用该
    OutputStream
    编写内容


可能是多余的,但我的直觉告诉我,您可能也想添加读取权限。它在SDK 22上工作,没有“读取”perm,但谢谢:)我将添加emFile path[]=新文件[10];路径=getExternalFilesDirs(null);文件路径[]=新文件[10];路径=getExternalFilesDirs(null);路径[1]对我很有用,非常感谢。如果我不想在卸载应用程序时删除我的数据库,该怎么办?@Maciek:告诉用户在卸载应用程序之前弹出他们的可移动存储。您没有直接文件系统到可移动存储上的任何位置,在卸载应用程序后,文件将保留在该位置。
ACTION\u CREATE\u DOCUMENT
方法可以在卸载应用程序后保留您的内容,但您无法控制内容的去向,您只能访问流,不能访问文件系统。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />