Android测试:存储状态已挂载,已声明写入外部存储权限,但仍可';t写入emulator';SD卡

Android测试:存储状态已挂载,已声明写入外部存储权限,但仍可';t写入emulator';SD卡,android,testing,permission-denied,Android,Testing,Permission Denied,我正在编写一个测试程序,我想将一些测试结果序列化到一个文件中。我总是收到这个讨厌的拒绝许可的例外。为了使事情更简单,我编写了一个小示例代码,但仍然得到相同的权限拒绝警告。这是我的代码,我使用getExternalStorageDirectory获取/mnt/sdcard/目录: private void writetry(){ try { File sdCard = Environment.getExternalStorageDirectory();

我正在编写一个测试程序,我想将一些测试结果序列化到一个文件中。我总是收到这个讨厌的拒绝许可的例外。为了使事情更简单,我编写了一个小示例代码,但仍然得到相同的权限拒绝警告。这是我的代码,我使用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)
07-12 12:28:47.288:D/can write(253):false
07-12:28:47.288:D/外部存储状态(253):已安装
07-12:28:47.297:W/System.err(253):java.io.FileNotFoundException:/sdcard/VisitedScreen.temp
07-12:28:47.437:W/System.err(253):位于org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:244)
07-12:28:47.437:W/System.err(253):位于java.io.FileOutputStream。(FileOutputStream.java:97)
07-12:28:47.437:W/System.err(253):位于java.io.FileOutputStream。(FileOutputStream.java:69)
我将我的Junit测试清单文件声明为:(实际上,它是设置权限的错误位置)


任何建议都将不胜感激

补充:我将相同的代码复制到一个普通的android程序中,它可以工作,并且sdCard.canWrite()返回true。但在Android Junit测试项目中,它不起作用。有人知道为什么吗

问题解决:谢谢你们所有的回复。这是因为我没有在原始的Android程序中添加。我还注意到,我不需要向Junit测试项目添加任何权限。非常有趣的是,写操作发生在测试项目中,但在原始项目中需要权限。我想知道如果我在对一个.apk文件进行黑盒测试会怎么样。我无法从字节码更改权限,对吗?

更改此行:

File sdCard = Environment.getExternalStorageDirectory();
为此:

File sdCard = new File(Environment.getExternalStorageDirectory().getPath());
更改此行:

File sdCard = Environment.getExternalStorageDirectory();
为此:

File sdCard = new File(Environment.getExternalStorageDirectory().getPath());
使用权限

<?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>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

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

使用权限

<?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>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


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

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

权限标签:

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

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

权限标签:

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



原因一目了然,SD卡处于只读状态。再看一遍。为什么“D/can write”显示
false
,然后紧接着,“D/ExternalStorageState”显示“mounted”?当应用程序在模拟器中运行时,您是否正在装载存储?OP:您能否重新编辑您的问题,以明确说明该清单是测试项目的一部分还是主项目的一部分?。。。请参见米拉诺回答下面的@Devunwired评论:)@t0mm13b谢谢你提醒我。我重新编辑了这个问题。原因是一看,SD卡处于只读状态。再看一遍。为什么“D/can write”显示
false
,然后紧接着,“D/ExternalStorageState”显示“mounted”?当应用程序在模拟器中运行时,您是否正在装载存储?OP:您能否重新编辑您的问题,以明确说明该清单是测试项目的一部分还是主项目的一部分?。。。请参见米拉诺回答下面的@Devunwired评论:)@t0mm13b谢谢你提醒我。我重新编辑了问题。谢谢!但是sdCard.canWrite()仍然返回false。在我将空文件推送到/sdcard/之后,filenotfound异常仍然存在。这两个语句之间的唯一区别似乎是将目录从/mnt/sdcard/更改为/sdcard/您使用的android emulator版本是什么?听起来仿真器上的SD卡是只读的?你们能检查一下吗?我检查一下,我可以将文件推送到emulator的SD卡目录,所以我想这不是emulator的问题。然而,我发现代码在正常的Android项目中成功执行。在Android Junit测试项目中,它仍然抛出了这个验证。你知道这两者有什么区别吗?谢谢谢谢但是sdCard.canWrite()仍然返回false。在我将空文件推送到/sdcard/之后,filenotfound异常仍然存在。这两个语句之间的唯一区别似乎是将目录从/mnt/sdcard/更改为/sdcard/您使用的android emulator版本是什么?听起来仿真器上的SD卡是只读的?你们能检查一下吗?我检查一下,我可以将文件推送到emulator的SD卡目录,所以我想这不是emulator的问题。然而,我发现代码在正常的Android项目中成功执行。在Android Junit测试项目中,它仍然抛出了这个验证。你知道这两者有什么区别吗?谢谢@t0mm13b我们不能假设。上面的清单是针对测试项目的,此权限需要存在于主项目中。OP应该已经澄清清单是测试项目的一部分,而不是主项目-很好!在上面的评论中询问OP?:)查看仪器和使用库标签,很可能是测试的主要原因,谢谢@dtmilano我还想知道,如果我正在测试一个apk文件,我应该怎么做?测试中的应用程序和测试必须使用相同的证书签名,所以您不能使用此方法测试第三方apk。另一方面,测试将能够独立于AUT写入其数据目录。@t0mm13b我们不能假设这一点。上面的清单是针对测试项目的,此权限需要存在于主项目中。OP应该已经澄清