android - 无法授予仪器测试清单中声明的权限
问题描述
我在 android 中自动化 UI 并面临下一个问题:我有 Android Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest package="ru.me.widgets"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET"/>
...
</manifest>
和 Android 测试清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest package="ru.me.widgets.test"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round">
</application>
</manifest>
我有使用外部存储器的 saveScreenshot 方法:
protected final void saveScreenshot() {
Bitmap bitmap = InstrumentationRegistry.getInstrumentation().getUiAutomation().takeScreenshot();
File screenshotFile = getScreenshotFile();
try (FileOutputStream outputStream = new FileOutputStream(screenshotFile)) {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
Log.i(mTag, "Saved screenshot: " + screenshotFile.getAbsolutePath());
} catch (IOException e) {
Log.e(mTag, "Could not save screenshot", e);
}
}
private File getScreenshotFile() {
String path = isExternalWritable(InstrumentationRegistry.getContext())
? Environment.getExternalStorageDirectory().toString()
: Environment.getDataDirectory().toString();
Date thisMoment = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
String filename = "screen-" + mTag + "-" + sdf.format(thisMoment) + SCREENSHOT_EXTENSION;
return new File(path + "/" + filename);
}
private boolean isExternalWritable(Context context) {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
if (context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == 0) {
return true;
}
Log.i(mTag, "No rights for writing to external storage!");
return false;
}
else if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
Log.i(mTag, "External storage is in ONLY_READ mode!");
return false;
}
Log.i(mTag, "External storage is not mounted!");
return false;
}
安装应用程序后,我运行 UI 测试,我可以在设备设置中找到额外的测试应用程序。我授予 EXTERNAL_WRITE 权限,但仍然出现错误:
06-18 12:22:19.998 5566-5582/ru.me.widgets I/DemoActivityTest: No rights for writing to external storage!
06-18 12:22:20.001 5566-5582/ru.me.widgets E/DemoActivityTest: Could not save screenshot
java.io.FileNotFoundException: /data/screen-DemoActivityTest-2018-06-18_12:22:19.png (Permission denied)
如何在我的 UI 测试中保存屏幕截图?为什么在设置中授予外部写入权限后出现“权限被拒绝”错误?如果我在清单中设置 sharedUserId,一切正常,但我认为这是解决问题的错误方法。
此外,将来我需要使用 GrandPermissionRule 自动授予权限。但它只有在我在 App Manifest 中设置权限时才有效,而不是在 Android Test Manifest 中。
解决方案
对于 Android 6.0 或更高版本,您必须将基于代码的请求权限添加到此 Activity 中,而不仅仅是在 Manifest 中授予权限。
给你参考,希望对你有所帮助: https ://developer.android.com/training/permissions/requesting
推荐阅读
- tensorflow - 如何在 Google Colab 中降级 Cuda 和 cuDNN 版本?
- azure - 如何在 Kubernetes 上获取或设置非匿名 Azure 函数的密钥
- javascript - 在javascript es6中链接静态和非静态方法
- python - 由 Gluon-TS 示例生成的预测约为 0
- node.js - 使用passport.js返回的访问令牌的正确方法是什么?
- powershell - powershell中双引号字符串中的转义字符
- php - 三元运算符仅运行条件的第一部分
- optaplanner - OptaPlanner VRP 示例规划实体混淆
- r - R中蒙特卡罗模拟中矩阵的平均计算
- regex - 如何提取字符串中两个单词之间的大写字母和数字?