尝试将文件从资产复制到我的单元测试项目中的/ sdcard时,我收到“open filed:EACCES(Permission denied)”错误。我花了最后两个小时通过搜索挖掘并尝试了许多变化。可能会遗漏一些愚蠢的小细节,希望有人会看到它。
我正在使用ADT build v22.3.0-887826。构建目标是Google API 2.2平台。尝试4.4.2,结果相同。 AVD是4.4.2。
LogCat是:
MediaPlayerServiceTest(3324): copy test files
MediaPlayerServiceTest(3324): File copy testfile.mp3 exception. java.io.FileNotFoundException: /storage/sdcard/testfiles/testfile.mp3: open failed: EACCES (Permission denied)
我正在测试一个管理媒体播放器的服务,所以课程是
public class MediaPlayerServiceTest extends ServiceTestCase<MediaPlayerService>
代码很简单。请注意,canWrite()方法必须返回true。
Log.i(TAG,"copy test files");
File sdcard = Environment.getExternalStorageDirectory();
if (sdcard == null) {
Log.i(TAG,"no sdcard");
} else {
if (sdcard.canWrite()) {
Log.i(TAG,"cannot write to sdcard");
} else {
final String fileName = "BBPro_Confirm.mp3";
final String dest = sdcard.getAbsolutePath() + "/testfiles/" + fileName;
if (new File(dest).exists()){
Log.d(TAG, "No need to copy file " + fileName);
} else {
try {
InputStream localInputStream = mTestAppContext.getAssets().open(fileName);
FileOutputStream outFile = new FileOutputStream(dest);
} catch (IOException localIOException) {
Log.d(TAG, "File copy " + fileName + " exception. " + localIOException.toString());
}
}
}
}
尝试了许多关于使用权限的变体。目前的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="zookey.GPS.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="zookey.GPS" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="android.test.runner" />
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
</manifest>
我可以从adb访问sdcard并创建了一个testfiles子目录来验证我是否可以更新它。访问/ storage / sdcard /时无关紧要,但也尝试重新安装SD卡并使用/ sdcard /.
root@generic:/storage/sdcard # ls -l
ls -l
drwxrwx--- root sdcard_r 2014-02-15 13:06 Alarms
drwxrwx--x root sdcard_r 2014-02-15 13:07 Android
drwxrwx--- root sdcard_r 2014-02-15 13:06 DCIM
drwxrwx--- root sdcard_r 2014-02-15 13:06 Download
drwxrwx--- root sdcard_r 2014-02-15 13:05 LOST.DIR
drwxrwx--- root sdcard_r 2014-02-15 13:06 Movies
drwxrwx--- root sdcard_r 2014-02-15 13:06 Music
drwxrwx--- root sdcard_r 2014-02-15 13:06 Notifications
drwxrwx--- root sdcard_r 2014-02-15 13:06 Pictures
drwxrwx--- root sdcard_r 2014-02-15 13:06 Podcasts
drwxrwx--- root sdcard_r 2014-02-15 13:06 Ringtones
drwxrwx--- root sdcard_r 2014-02-15 13:24 testfiles
root@generic:/storage/sdcard #
我成功将文件推送到/ storage / sdcard:
C:\Users\Bruce\android-sdks\platform-tools>adb -s emulator-5554 push F:\BBPro_link.mp3 /storage/sdcard/testfiles
100 KB/s (5464 bytes in 0.053s)
多次重建ADV。 等等等
任何建议都会非常有用。
答案 0 :(得分:0)
在您的清单文件中插入:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
答案 1 :(得分:0)
解决方案是在我的主应用程序中创建一个小服务来复制文件。在安装过程中从单元测试中调用此服务。使用if存在以防止在每次测试设置时复制文件。