【问题标题】:Permission to Access External Storage Denied in AndroidTestAndroidTest 中拒绝访问外部存储的权限
【发布时间】:2017-04-15 01:28:17
【问题描述】:

在我开始解释我的问题之前,我必须提到我是 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 吗?

【问题讨论】:

    标签: android opencv permissions storage


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:
       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) {
                  }
              }
          }
      

      【讨论】:

      • 在没有 UI 的情况下如何授予权限? requestPermissions 不需要 UI 吗?
      • 早期版本的 Android 是可能的,但在 marshmallow 之后权限将是动态的,安装时不会询问
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-29
        • 2020-10-31
        • 1970-01-01
        • 2017-07-26
        • 1970-01-01
        • 2021-12-18
        相关资源
        最近更新 更多