即使在测试用例方法中,我也无法写入外部存储(在ActivityInstrumentationTestCase2的子类中):
public void testWriteToStorage() throws Throwable {
File file = new File(Environment.getExternalStorageDirectory(), "test");
new FileOutputStream(file); // error thrown here
}
错误:
java.io.FileNotFoundException: /storage/emulated/0/test: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:452)
at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
at com.unacademy.activity.GalleryTestCase.testWriteToStorage(GalleryTestCase.java:49)
at java.lang.reflect.Method.invoke(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:115)
at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77)
at junit.framework.TestResult.run(TestResult.java:118)
at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55)
at junit.framework.TestCase.run(TestCase.java:124)
at android.support.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.java:63)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at android.support.test.internal.runner.junit3.DelegatingTestSuite.run(DelegatingTestSuite.java:103)
at android.support.test.internal.runner.junit3.AndroidTestSuite.run(AndroidTestSuite.java:69)
at android.support.test.internal.runner.junit3.JUnit38ClassRunner.run(JUnit38ClassRunner.java:90)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:240)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
at libcore.io.IoBridge.open(IoBridge.java:438)
... 32 more
我在清单中有写入外部存储的权限,我知道在API 23之后,危险权限需要在运行时获得用户的同意。
但这不在Application
上下文中;它在仪器上下文中。此外,它适用于AWS设备场示例应用程序。尽我所能,我从那里复制了完全相同的代码,但它在这里仍然失败。
注意:我只是想截图并存储在外部存储中,以便AWS Device Farm将其拾取。如果有人设法以其他方式做到这一点,请告诉我;这也会很有帮助。
我通过提供存储权限来使其工作。终端(在运行测试用例之前),如
亚行总理授予com.example.abhishek.testandroid.permission.WRITE_EXTERNAL_STORAGE
我想到的一件事是,您的目标是M,并且可能没有在运行时处理权限请求。
正如您所说,在M中,WRITE\u EXTERNAL\u STORAGE被视为危险的权限,但权限处理也发生了变化。在M之前,权限是在清单中声明的,并且在安装应用程序时被用户接受。在M中,您还必须在运行时请求权限。
请检查此库,它将帮助您处理M中的权限。
https://github.com/aitorvs/allowme
我还建议您尽可能避免使用外部存储,甚至更好,完全避免使用存储权限。查看Ian Lake的精彩演讲。
https://www.youtube.com/watch?v=C28pvd2plBA
在这一点上我得到了警告: 如何让它保存文件?当我在Eclipse上创建它时,这是可行的,但是现在我更新并移到了Android Studio中,它似乎坏了一些东西。
我正在创建一个FileManager应用程序,我正在创建复制和剪切功能,它在内部设备存储中运行良好,但当我尝试在外部存储中复制某些内容时,它会说权限被拒绝。我拥有所有授予的写入权限。 如何在外部存储器中写入?
我想使用公共外部存储在设备中写入映像。因此,我有1)在清单中写入权限标签,2)在需要时使用请求权限。但我仍然有这个例外:。 为什么?我已经读过了https://developer.android.com/guide/topics/permissions/overview#normal-很危险,但这不能回答我的问题。 我已授予Android设备的存储权限。因此,我的条件if(permissionCh
有没有人遇到过这样的情况:当我对一个用户使用管理策略时,它可以工作,但当我使用内联策略时,它说访问被拒绝。我为IAM用户授予了对bucket读取访问权限,即它只能访问bucket。 我也试过这个
我试图用docker运行一个简单的命令,读取我的主目录中的文件,并在本地机器上的同一目录中写入输出文件(