访问外部存储的权限在AndroidTest中被拒绝

时间:2017-04-15 01:28:17

标签: android opencv permissions storage

在我开始解释我的问题之前,我必须提到我是Android开发的新手。

我正在尝试编写一个Android程序,它使用OpenCV的Java API进行一些数据处理。我正在为实现算法的类开发单元测试,这些类与任何活动都没有关系。换句话说,我只想在处理活动之前测试方法的功能。

因为我需要访问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的访问权限?

  3. 我可以通过在我的linux机器上安装OpenCV库来进行本地测试,而不是androidTest吗?

3 个答案:

答案 0 :(得分:0)

很抱歉,但是android并没有提供这种类型的访问权限 您需要创建一个活动来启动应用程序

我认为如果您使用的是marshmallow设备,那么您将需要在运行时请求读取和写入外部存储的权限

您可以参考以下内容 https://developer.android.com/training/permissions/requesting.html

答案 1 :(得分:0)

 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) {
            }
        }
    }

答案 2 :(得分:0)

我发现了这个问题的临时解决方法。我在MainActivity中设计了一个按钮,当按下该按钮时,会询问用户是否有权访问我的文件所在的目录。之后,我可以在不面对异常的情况下运行androidTest单元测试,因为此权限只需要授予一次。