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 授予访问权限。但是因为我的方法没有任何活动,我想我不能请求运行时权限。

  1. 是否有任何其他目录可以用来放置不需要这些权限的数据文件?我认为 assets 作为一个选项,但我假设资产放在最终的 apk 中,如果我需要为不同的数据更改文件,我必须每次都创建一个新的 apk。

  2. 我应该如何授予对 /sdcard 的访问权限而没有任何 activity 在运行时询问用户权限?

  3. 我可以通过在我的 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 单元测试而不会遇到异常,因为此权限只需要授予一次。