我花了几个小时现在正在寻找(和尝试)许多不同的方法,在获得无数“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?
所以我的问题是:
不可否认,我对Android编程比较陌生,所以我甚至不确定这种方法是正确的还是只是一个幸运的黑客?但它现在似乎在我的应用程序中工作。