AndroidTest 拒绝访问外部存储的权限
Permission to Access External Storage Denied in AndroidTest
在我开始解释我的问题之前,我必须提到我是 Android 开发的新手。
我正在尝试为 Android 编写一个程序,它使用 OpenCV 的 Java API 进行一些数据处理。我正在为实现算法的 类 开发单元测试,这些 类 与任何 activity 都不相关。换句话说,我只想在处理活动之前测试方法的功能。
因为我需要访问 OpenCV 库,所以我在 Android Studio 的 androidTest 下编写了我的单元测试。程序中需要读取的包含数据的文件复制到/sdcard/DIR和/storage/emulated/0/DIR。我已将以下权限添加到 AndroidManifest.xml 以授予对外部存储的访问权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
但是,当我尝试从外部存储读取文件时,我得到
open failed: EACCES (Permission denied)
。请注意,我将 Environment.getExternalStorageDirectory().getAbsolutePath()
返回的路径与数据文件的名称连接起来,稍后使用 FileInputStream
来读取文件的内容。
我看到过类似的问题和答案,提到应该在运行时为 23 以上的 API 授予访问权限。但是因为我的方法没有任何活动,我想我不能请求运行时权限。
是否有任何其他目录可以用来放置不需要这些权限的数据文件?我认为 assets
作为一个选项,但我假设资产放在最终的 apk 中,如果我需要为不同的数据更改文件,我必须每次都创建一个新的 apk。
我应该如何授予对 /sdcard 的访问权限而没有任何 activity 在运行时询问用户权限?
我可以通过在我的 linux 机器上安装 OpenCV 库来进行本地测试而不是 androidTest 吗?
抱歉,android 不提供该类型的访问权限
您将需要创建一个 activity 来启动应用程序
我想如果你使用的是 marshmallow 设备,那么你将需要在运行时请求读取和写入外部存储的权限
您可以参考以下链接
https://developer.android.com/training/permissions/requesting.html
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)==
PackageManager.PERMISSION_GRANTED) {
//do the things} else {
requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
AnyNumber);
稍后在
中捕获这些请求
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == AnyNumber) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
}
}
}
我找到了解决此问题的临时方法。我在 MainActivity 中设计了一个按钮,当按下该按钮时,会询问用户是否允许访问我的文件所在的目录。之后,我可以 运行 androidTest 单元测试而不会遇到异常,因为此权限只需要授予一次。
在我开始解释我的问题之前,我必须提到我是 Android 开发的新手。
我正在尝试为 Android 编写一个程序,它使用 OpenCV 的 Java API 进行一些数据处理。我正在为实现算法的 类 开发单元测试,这些 类 与任何 activity 都不相关。换句话说,我只想在处理活动之前测试方法的功能。
因为我需要访问 OpenCV 库,所以我在 Android Studio 的 androidTest 下编写了我的单元测试。程序中需要读取的包含数据的文件复制到/sdcard/DIR和/storage/emulated/0/DIR。我已将以下权限添加到 AndroidManifest.xml 以授予对外部存储的访问权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
但是,当我尝试从外部存储读取文件时,我得到
open failed: EACCES (Permission denied)
。请注意,我将 Environment.getExternalStorageDirectory().getAbsolutePath()
返回的路径与数据文件的名称连接起来,稍后使用 FileInputStream
来读取文件的内容。
我看到过类似的问题和答案,提到应该在运行时为 23 以上的 API 授予访问权限。但是因为我的方法没有任何活动,我想我不能请求运行时权限。
是否有任何其他目录可以用来放置不需要这些权限的数据文件?我认为
assets
作为一个选项,但我假设资产放在最终的 apk 中,如果我需要为不同的数据更改文件,我必须每次都创建一个新的 apk。我应该如何授予对 /sdcard 的访问权限而没有任何 activity 在运行时询问用户权限?
我可以通过在我的 linux 机器上安装 OpenCV 库来进行本地测试而不是 androidTest 吗?
抱歉,android 不提供该类型的访问权限 您将需要创建一个 activity 来启动应用程序
我想如果你使用的是 marshmallow 设备,那么你将需要在运行时请求读取和写入外部存储的权限
您可以参考以下链接 https://developer.android.com/training/permissions/requesting.html
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)==
PackageManager.PERMISSION_GRANTED) {
//do the things} else {
requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
AnyNumber);
稍后在
中捕获这些请求 @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == AnyNumber) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
}
}
}
我找到了解决此问题的临时方法。我在 MainActivity 中设计了一个按钮,当按下该按钮时,会询问用户是否允许访问我的文件所在的目录。之后,我可以 运行 androidTest 单元测试而不会遇到异常,因为此权限只需要授予一次。