android eclipse模拟器sdcard权限被拒绝

时间:2014-02-15 19:48:37

标签: android eclipse

尝试将文件从资产复制到我的单元测试项目中的/ 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。 等等等

任何建议都会非常有用。

2 个答案:

答案 0 :(得分:0)

在您的清单文件中插入:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

答案 1 :(得分:0)

解决方案是在我的主应用程序中创建一个小服务来复制文件。在安装过程中从单元测试中调用此服务。使用if存在以防止在每次测试设置时复制文件。