0

我正在编写一个测试程序,我想将我的一些测试结果序列化到一个文件中。我不断收到这个烦人的权限被拒绝异常。为了让事情变得更容易,我编写了一个小示例代码,但仍然得到相同的权限被拒绝警告。这是我的代码,我使用 getExternalStorageDirectory 来获取 /mnt/sdcard/ 目录:

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 文件进行黑盒测试怎么办。我无法更改字节码的权限,对吗?

4

3 回答 3

3

使用许可

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

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

于 2012-07-12T20:49:37.310 回答
1

更改此行:

File sdCard = Environment.getExternalStorageDirectory();

对此:

File sdCard = new File(Environment.getExternalStorageDirectory().getPath());
于 2012-07-12T20:02:31.183 回答
0

我遇到了同样的问题。为了解决这个问题,我不仅必须将权限标记添加到主清单,而且还必须将标记添加到包含单元测试的模块的清单。

权限标签:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
于 2015-03-28T18:42:20.143 回答