在Android 4.4 KitKat及更高版本上创建和写入可移动SD卡目录的正确方法?

在Android 4.4 KitKat及更高版本上创建和写入可移动SD卡目录的正确方法?,android,android-4.4-kitkat,Android,Android 4.4 Kitkat,在收到无数“eacces权限被拒绝”错误后,我花了数小时寻找(并尝试)多种不同的方法将一些文件写入我的4.4 Android KitKat可移动SD卡。现在看来,谷歌对SD卡上的文件系统的访问受到限制,您只能写入应用程序拥有的目录(例如:/Android/data/com.mycompany.myapp/files/) 最后,我能够在可移动SD卡上创建一个可以写入的目录。然而,我很好奇,为什么为了访问可移动SD卡上的这个自有目录,我首先必须使用外部目录的路径创建一个新的文件对象 我的实施: 首先

在收到无数“eacces权限被拒绝”错误后,我花了数小时寻找(并尝试)多种不同的方法将一些文件写入我的4.4 Android KitKat可移动SD卡。现在看来,谷歌对SD卡上的文件系统的访问受到限制,您只能写入应用程序拥有的目录(例如:/Android/data/com.mycompany.myapp/files/)

最后,我能够在可移动SD卡上创建一个可以写入的目录。然而,我很好奇,为什么为了访问可移动SD卡上的这个自有目录,我首先必须使用外部目录的路径创建一个新的文件对象

我的实施:

首先,我创建两个global来容纳外部路径和可移动路径的字符串

main活动

public class MainActivity extends ActionBarActivity {
    String externalStorageDirectory;//path to owned external storage files
    String secondaryStorageDirectory ;//path to owned removable storage files
然后我询问系统特定于制造商的目录被称为什么,并开始连接externalStorage和removableStorage变量的绝对路径。我还创建了一个新的文件对象,该对象使用外部应用程序拥有的目录的路径初始化

onCreate()

最后,我能够将一个文件写入我的应用程序拥有的可移动SD卡目录。更具体地说,我使用AsyncTask下载并保存文件,方法#1

doInBackground()

然后我可以通过adb外壳导航到可移动SD卡目录,我可以看到我的文件

Adb外壳输出:

//internal storage
shell@QTAQZ3:/storage/emulated/0/Android/data/com.mycompany.myapp/files $ ls
s                                                                             <

//removable SD card
shell@QTAQZ3:/storage/external/Android/data/com.mycompany.myapp/files $ ls
ls
myawesomefile.mp4        
                                                                   <
因此,我的问题是:

  • 当我创建文件对象实例时,发生了什么使这些目录可用
  • 为什么在这种情况下调用mkdir()或mkdirs()似乎是不必要的,因为在创建文件对象时dirs神奇地出现了
  • 为什么我只能在设置后才能看到我的应用程序的辅助(可移动)目录 是否将文件复制到外部(不可移动)路径

诚然,我对Android编程还比较陌生,所以我甚至不确定这种方法是正确的还是只是一个幸运的黑客?但目前它似乎在我的应用程序中起作用。

请查看getExternalFilesDirs()。。。。肮脏。。。!请准确地说出所有值。还有你提到的两条路。请显示如何将内容写入文件的完整代码。不要强迫我们阅读其他文章。'internalStorageDirectory=this.getExternalFilesDir(nu..'请不要将外部重命名为内部。非常混乱。Android设备有内部和外部内存。如果可以放入micro SD卡,它也有可移动内存。如果需要,也可以使用辅助外部。因为还有一个函数getExternalStorageDirectory()您从FilesDir重命名到存储器的情况更糟。“首先,我创建了两个全局文件来存放内部和外部路径的字符串。”。不需要。您可以在需要时确定它们。只有当您想在它们上创建自己的目录时,才可以为这些目录的完整路径创建全局文件。@greenapps嘿,谢谢您的指点去掉internal=external..lol.我重命名了这些变量并更新了我的帖子。另外,我本想发布更多与我的AsyncTask配置相关的代码,但我觉得这个问题有点离题。另外,谢谢,我将查看GetExternalFileDirs()
output = new FileOutputStream(secondaryStorageDirectory + "myawesomefile.mp4");
//internal storage
shell@QTAQZ3:/storage/emulated/0/Android/data/com.mycompany.myapp/files $ ls
s                                                                             <

//removable SD card
shell@QTAQZ3:/storage/external/Android/data/com.mycompany.myapp/files $ ls
ls
myawesomefile.mp4        
                                                                   <
File folder = new File(externalStorageDirectory); //THIS LINE IS CRUCIAL!!
File folder = new File(secondaryStorageDirectory ); //THIS LINE DOES NOTHING?