Android的测试:存储状态下安装时,WRITE_EXTERNAL_STORAGE许可已经声明,但

2019-09-19 10:02发布

我正在写一个测试程序,我想序列化我的一些测试结果到一个文件中。 我一直得到这恼人的许可被拒绝例外。 为了方便起见,我写了一个小样本代码,并仍然得到同样的许可被拒绝警告。 这里是我的代码,我使用getExternalStorageDirectory获得的/ mnt / SD卡/目录:

private void writetry(){
        try {
            File sdCard = Environment.getExternalStorageDirectory();
            Log.d("can write", String.valueOf(sdCard.canWrite()));
            Log.d("ExternalStorageState", Environment.getExternalStorageState());
            File file = new File(sdCard, "VisitedScreen.temp");
            //file.createNewFile();
            FileOutputStream f = new FileOutputStream(file);
             byte[] buf = "Hello".getBytes();
             f.write(buf);
             f.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

这里是什么logcat的打印出来:

07-12 12:28:47.288: D/can write(253): false
07-12 12:28:47.288: D/ExternalStorageState(253): mounted
07-12 12:28:47.297: W/System.err(253): java.io.FileNotFoundException: /sdcard/VisitedScreen.temp
07-12 12:28:47.437: W/System.err(253):  at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:244)
07-12 12:28:47.437: W/System.err(253):  at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
07-12 12:28:47.437: W/System.err(253):  at java.io.FileOutputStream.<init>(FileOutputStream.java:69)

我宣布我的JUnit进行测试清单文件(其实这是错误的地点设置权限)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.mandaria.tippytipper.test"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" />

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="net.mandaria.tippytipper" />

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>


</manifest>

任何建议表示赞赏!

补充:我相同的代码复制到一个正常的Android程序,它的工作原理,以及sdCard.canWrite()返回true。 但在Android的Junit的测试项目中它不工作。 任何人都知道这是为什么?

问题解决:感谢所有那些你已经回答。 这是因为我没有在原生Android程序添加。 我还注意到,我不需要任何许可添加到JUnit测试项目。 这是非常有趣的是,写操作在测试项目中发生的事情,但允许在原项目所需。 我想知道如果我在做什么针对.apk文件黑盒测试。 我无法改变从字节码正确的权限?

Answer 1:

用途许可权

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

应添加到您的主项目的清单。 请记住,测试在同一进程作为主要的应用程序运行。



Answer 2:

改变这一行:

File sdCard = Environment.getExternalStorageDirectory();

为此:

File sdCard = new File(Environment.getExternalStorageDirectory().getPath());


Answer 3:

我遇到了同样的问题。 为了解决这个问题我不仅要允许标记添加到主清单,但我也不得不将标签加入到包含单元测试模块的清单。

许可标签:

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


文章来源: Android Testing: The storage state is mounted, the WRITE_EXTERNAL_STORAGE permission has been declared, but still can't write to emulator's sdcard