繁体   English   中英

Android没有保存到SD卡

[英]Android not saving to SD card

我想将文本文件保存到我插入运行棒棒糖的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);

编辑:我认为问题是有多个外部存储。 一个是永久的,一个是临时的。 问题是如何访问第二个。

首先,我们需要了解内部存储,外部存储(又称主外部存储)和辅助外部存储之间的区别?

内部存储:用户无法访问的存储,除非是通过已安装的应用程序(或通过生根设备)。 示例:data / data / app_packageName

主外部存储:在内置的共享存储中,“用户可以通过插入USB电缆并将其作为驱动器安装在主机上”进行访问。 示例:当我们说Nexus 5 32 GB时。

辅助外部存储:可移动存储。 示例:SD卡。

getExternalStorageDirectory ()

它将返回主外部存储目录的路径

要访问可移动SD(辅助外部存储),有以下API:

getExternalFilesDirs(), getExternalCacheDirs(),getExternalMediaDirs()

查看文档以获取更多信息

如果Android设备在此处指导处理多个外部存储时,我们可以使用以下代码来检测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" />

我想将文本文件保存到我插入运行棒棒糖的HTC One M8的SD卡中

欢迎您在Context上尝试getExternalFilesDirs()getExternalCacheDirs()getExternalMediaDirs() 请注意方法名称的复数形式。 对于这些方法,如果它们返回多个条目,则第二个和后续条目应位于可移动介质上,指向可以读取和写入的目录,而无需任何特定权限(例如, WRITE_EXTERNAL_STORAGE )。

在这些位置之外,对于Android 4.4+附带的设备, 您无法访问可移动存储

我认为这是因为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实际上是sdcard路径。

尝试阅读如何获取Android 4.0+的外部SD卡路径? 这也许可以帮到你很多。

UPDATE

我试过这段代码:

    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卡。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM