在Android 4.4 KitKat上创建和写入可移动SD卡目录的正确方法是什么?

Log*_*ic1 6 android android-4.4-kitkat

我花了几个小时现在正在寻找(和尝试)许多不同的方法,在获得无数"eacces permission denied"错误后,将一些文件写入我的4.4 Android KitKat的可移动SD卡.现在似乎Google对SD卡上的文件系统的访问权限有限,您只能写入应用程序拥有的目录(例如:/Android/data/com.mycompany.myapp/files/).

最后,我得到了一些工作,可以在可移动SD卡上创建一个可以写入的目录.但是我很好奇为什么为了获得对可移动SD卡上的这个拥有目录的访问,我首先必须使用外部目录的路径创建一个新的文件对象?

我的实施:

首先,我创建两个全局变量来容纳外部和可移动路径的字符串.

MainActivity

public class MainActivity extends ActionBarActivity {
    String externalStorageDirectory;//path to owned external storage files
    String secondaryStorageDirectory ;//path to owned removable storage files
Run Code Online (Sandbox Code Playgroud)

然后我询问系统调用制造商特定目录的内容,并开始连接externalStorage和removableStorage变量的绝对路径.我还创建了一个新的File对象,该对象使用外部应用程序拥有的目录的路径进行初始化.

onCreate()

externalStorageDirectory = this.getExternalFilesDir(null).toString();//build absolute path to the app owned external directory
File folder = new File(externalStorageDirectory ); //THIS LINE IS CRUCIAL!!
Log.d("DEBUG", " - External Path" + externalStorageDirectory );// "/storage/emulated/0/Android/data/com.mycompany.myapp/files"


String ownedDirectory = "/Android/data/" + this.getPackageName() + "/files/";
secondaryStorageDirectory = System.getenv("SECONDARY_STORAGE").toString() + ownedDirectory;//build absolute path to the app owned removable directory
Log.d("DEBUG", " - Removable Path"+secondaryStorageDirectory );// "/storage/external/Android/data/com.mycompany.myapp/files/"
Run Code Online (Sandbox Code Playgroud)

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

doInBackground()

output = new FileOutputStream(secondaryStorageDirectory + "myawesomefile.mp4");
Run Code Online (Sandbox Code Playgroud)

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

Adb shell输出:

//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        
                                                                   <
Run Code Online (Sandbox Code Playgroud)

只是重申一点:

File folder = new File(externalStorageDirectory); //THIS LINE IS CRUCIAL!!
File folder = new File(secondaryStorageDirectory ); //THIS LINE DOES NOTHING?
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

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

不可否认,我对Android编程相对较新,所以我甚至不确定这种方法是正确的还是只是一个幸运的黑客?但它似乎现在在我的应用程序中工作.