- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想为一个涉及写入外部存储的应用程序编写一个 AndroidTest
,但不知何故我无法使其工作。 (在Pixel2、Lg G6、Huawai P8等多款设备上测试)
所以我简化了一切,只是为了测试是否可以写入外部存储。我试验了 GrantPermissionRule以及在 Granter 上写我的文章,但完全没有成功。
我可能最终做了太多不必要的事情,所以这是我所做的:
AndroidStudio
中创建没有 Activity 的新项目>uses-permission
标签的AndroidManifest
PermissionRequester
以下是上面编号列表引用的 fragment
2.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.android.testpermissions">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="com.company.TestPermissions"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
</manifest>
3.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.android.testpermissions.test">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>
也试过
<manifest package="com.company.android.testpermissions">...
省略 'test' 后缀
4.
public class MyPermissionRequester {
public static final String TAG = MyPermissionRequester.class.getSimpleName();
public static void request(String... permissions) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
UiAutomation auto = InstrumentationRegistry.getInstrumentation().getUiAutomation();
String cmd = "pm grant " + InstrumentationRegistry.getTargetContext().getPackageName() + " %1$s";
String cmdTest = "pm grant " + InstrumentationRegistry.getContext().getPackageName() + " %1$s";
String currCmd;
for (String perm : permissions) {
execute(String.format(cmd, perm), auto);
execute(String.format(cmdTest, perm), auto);
}
}
GrantPermissionRule.grant(permissions);
}
private static void execute(String currCmd, UiAutomation auto){
Log.d(TAG, "exec cmd: " + currCmd);
auto.executeShellCommand(currCmd);
}
}
5.
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void sdcardTest(){
//check sdcard availability
Assert.assertEquals("Media is not mounted!", Environment.getExternalStorageState(), Environment.MEDIA_MOUNTED);
//get and check Permissions
MyPermissionRequester.request(Manifest.permission.WRITE_EXTERNAL_STORAGE);
int grantResult = ActivityCompat.checkSelfPermission(InstrumentationRegistry.getTargetContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
Assert.assertEquals(PackageManager.PERMISSION_GRANTED, grantResult);
grantResult = ActivityCompat.checkSelfPermission(InstrumentationRegistry.getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
Assert.assertEquals(PackageManager.PERMISSION_GRANTED, grantResult);
//finally try to create folder
File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "CompanyTest");
if (!f.exists()){
boolean mkdir = f.mkdirs();
Assert.assertTrue("Folder '"+f.getAbsolutePath() + "' not Present!", mkdir);
}
boolean delete = f.delete();
Assert.assertTrue("Folder '"+f.getAbsolutePath() + "' is Present!", delete);
}
}
测试的结果是:
junit.framework.AssertionFailedError: Folder ' /storage/emulated/0/Download/CompanyTest' not Present! at
junit.framework.Assert.fail(Assert.java:50) at
junit.framework.Assert.assertTrue(Assert.java:20) at
com.company.android.testpermissions.ExampleInstrumentedTest.sdcardTest(ExampleInstrumentedTest.java:69)
at java.lang.reflect.Method.invoke(Native Method) at ... (omitted rest coming from the TestRunner)
我在这里遗漏了什么或做错了什么?
最佳答案
经过大量痛苦尝试无效的东西后,我终于找到了解决方案:
谷歌声称
if your application already requests write access, it will automatically get read access as well.
https://developer.android.com/about/versions/android-4.1.html#Permissions
或在 WriteExternalStorage 文档中:
Note: If your app uses the WRITE_EXTERNAL_STORAGE permission, then it implicitly has permission to read the external storage as well.
https://developer.android.com/training/data-storage/files.html#WriteExternalStorage
或者在 list 权限中:
Any app that declares the WRITE_EXTERNAL_STORAGE permission is implicitly granted this permission.
https://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE
但事实并非如此!
如果我显式地将 READ_EXTERNAL_STORAGE
添加到我的 list 中并在运行时请求它,它会像我习惯的那样工作。
所以3.必须加上
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.android.testpermissions.test">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
测试应该是这样的:
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void sdcardTest(){
//check sdcard availability
Assert.assertEquals("Media is not mounted!", Environment.getExternalStorageState(), Environment.MEDIA_MOUNTED);
//get and check Permissions
MyPermissionRequester.request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE);
int grantResult = ActivityCompat.checkSelfPermission(InstrumentationRegistry.getTargetContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
Assert.assertEquals(PackageManager.PERMISSION_GRANTED, grantResult);
grantResult = ActivityCompat.checkSelfPermission(InstrumentationRegistry.getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
Assert.assertEquals(PackageManager.PERMISSION_GRANTED, grantResult);
//finally try to create folder
File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "CompanyTest");
if (!f.exists()){
boolean mkdir = f.mkdirs();
Assert.assertTrue("Folder '"+f.getAbsolutePath() + "' not Present!", mkdir);
}
boolean delete = f.delete();
Assert.assertTrue("Folder '"+f.getAbsolutePath() + "' is Present!", delete);
}
}
一切正常。
唯一剩下的问题是这是否/为什么是自 Android 8.1 以来的预期行为
关于java - 在 AndroidTest 中编写外部存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49198675/
您好,当我在 androidTest list 文件中重写应用程序时,它不起作用。这是我在 androidTest 文件夹中的 AndroidManifest.xml 文件: 这是 mai
我正在尝试在我的 android 项目中使用 Espresso 添加仪器化测试。 除了将 AndroidJUnitRunner 添加为 testInstrumentationRunner 之外,我还添
我在运行 androidTest 时遇到问题。它找不到我的测试。奇怪的是,它只适用于某个模块。我测试并配置其 build.gradle 文件的其他模块正在运行。这里有一些信息。非常感谢任何帮助! 输出
在开始解释我的问题之前,我必须说明我是 Android 开发的新手。 我正在尝试为 Android 编写一个程序,它使用 OpenCV 的 Java API 进行一些数据处理。我正在为实现算法的类开发
androidTest 是否支持风格和构建类型变体? flavorDimensions "foo" productFlavors { full { dimension "foo" }
在纵向和横向模式下运行我的测试套件的好方法是什么?是否已经有办法这样做,或者我是否必须实现解决方案? 最佳答案 当您创建 @Rule ActivityTestRule myActivity 时;你可以
我面临以下问题。我有三个项目。我称它们为项目 A、B 和 lib Project Lib -> androidTest -> utilityfile.kt Project A -> androi
我是 Robot 的忠实粉丝保持 UI 测试干净的模式。但是我怎样才能跨多个模块重用机器人类呢? :lib-with-ui . // has Robot classes in `src/android
我有一个应用程序,其中 androidTest配置已击中臭名昭著的dex 64k method limit应用程序和测试库依赖项都有助于方法计数。 为了使方法计数再次低于 64k,我想删除一些依赖项。
我正在尝试模拟一些对象,然后将它们注入(inject)演示者但不起作用 它说我有一个模拟的 lateInt 属性没有被初始化: 这是我的测试课 @Mock lateinit var s
我正在开发一款基于 Here SDK 的导航应用。现在,当我进行集成测试 (androidTest) 时,我需要在 Android 模拟器 (Nexus 10 API 28) 上模拟不同的 GPS 坐
我正在研究这个网站上的教程 http://www.youtube.com/watch?v=jSyy5TrUD5Q 我似乎在为讲师工作,但一旦我在模拟器上运行它,它就会说 很遗憾,AndroidTest
我的应用程序将 3 个 ContentProvider 数据源组合到一个 UI 中。我想确保所有内容都正确布置,因此我尝试为模拟内容提供者提供预定义数据(稍后截取该数据的屏幕截图,但这是第 2 步)。
我们的目标是使用 AndroidTest(AndroidJUnit4) 运行自动测试。 当 SDK >= 23 时,我们已使用此代码授予权限 public static void grantPermi
有没有办法从我的代码中访问 AndroidTest 和测试文件夹中的测试类?我可以访问放置在与我的 Activity 相同的文件夹中的测试,但不能从这些测试文件夹访问。 这里有一张图来解释我的意思:
我正在使用 Android Studio 1.1.0。我试图将我的单元测试和集成测试分开。集成测试位于文件夹 src/androidTest/java 中。我正在尝试在 src/test/java/
我正在 Bitrise 中配置一个工作流来为一个 Android 项目运行我的仪器测试。我不知道为什么,但 AndroidTest 资源目录在 Bitrise ui 测试期间不可用。我的 build.
我正在尝试设置一个任务,该任务将在 android gradle 插件中设置不同的运行器。 我的想法是: ./gradlew differentRunner connectedAndroidTest
我想为一个涉及写入外部存储的应用程序编写一个 AndroidTest,但不知何故我无法使其工作。 (在Pixel2、Lg G6、Huawai P8等多款设备上测试) 所以我简化了一切,只是为了测试是否
我的 Android 项目中有三种风格。我如何才能为我的仪器测试构建其中一个(“androidTest”构建 Artifact )? 当我使用 Android Studio 2.0 Beta 2 运行
我是一名优秀的程序员,十分优秀!