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

时间:2015-06-28 05:24:12

标签: 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

然后我询问系统调用制造商特定目录的内容,并开始连接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/"

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

doInBackground()

output = new FileOutputStream(secondaryStorageDirectory + "myawesomefile.mp4");

然后我可以通过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        
                                                                   <

只是重申一点:

File folder = new File(externalStorageDirectory); //THIS LINE IS CRUCIAL!!
File folder = new File(secondaryStorageDirectory ); //THIS LINE DOES NOTHING?

所以我的问题是:

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

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

0 个答案:

没有答案