为什么我请求 ACCESS_MEDIA_LOCATION 权限时没有显示权限框?

2024-03-12

我正在尝试实现 Android 10 的 ACCESS_MEDIA_LOCATION 权限,以便访问照片的位置。

首先,应用程序请求 READ_EXTERNAL_STORAGE 权限,以便使用 MediaStore 访问照片。

然后应用程序使用 ExifInterface 读取照片的位置。在 Android 10 中,ExifInterface 失败,因为它没有权限。

我尝试添加 ACCESS_MEDIA_LOCATION 的权限请求,但没有出现权限请求框。然而,随后获得了许可!

如果我在获得 READ_EXTERNAL_STORAGE 权限之前先请求 ACCESS_MEDIA_LOCATION,则会出现权限请求框。

如果我随后请求 READ_EXTERNAL_STORAGE 权限,则不会出现权限请求框,但随后又会授予权限。 (我知道这样做没有意义,但我只是想看看发生了什么。)

我真的很困惑。为了访问照片的位置,应该请求用户的许可,这是有道理的,但是如果之前已授予 READ_EXTERNAL_STORAGE,为什么 ACCESS_MEDIA_LOCATION 的权限框不会出现?为什么在未经用户同意的情况下授予权限?

我是否缺少某些内容会使权限框出现?

下面的代码片段。

安卓清单:

<manifest ...>

        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        …

片段1:

public class Fragment1 extends Fragment {
…
        public View onCreateView(...
                …
                Log.d(TAG, "Entering Fragment1 requestPermissions operation for permission READ_EXTERNAL_STORAGE");
                Log.d(TAG, "Permission ACCESS_MEDIA_LOCATION, " + this.requireContext().checkSelfPermission(Manifest.permission.ACCESS_MEDIA_LOCATION));
                Log.d(TAG, "Permission READ_EXTERNAL_STORAGE, " + this.requireContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE));

                String[] permission = {Manifest.permission.READ_EXTERNAL_STORAGE};
                this.requestPermissions(permission, 1);

                Log.d(TAG, "Exiting Fragment1 requestPermissions operation for permission READ_EXTERNAL_STORAGE");
                Log.d(TAG, "Permission ACCESS_MEDIA_LOCATION, " + this.requireContext().checkSelfPermission(Manifest.permission.ACCESS_MEDIA_LOCATION));
                Log.d(TAG, "Permission READ_EXTERNAL_STORAGE, " + this.requireContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE));

                ...



        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
                Log.d(TAG, "Fragment1 Request Permissions callback");

                for (int i = 0; i < permissions.length; i++)
                    Log.d(TAG, "Permission " + permissions[0] + ", " + grantResults[0] );

                Log.d(TAG, "Permission ACCESS_MEDIA_LOCATION, " + this.requireContext().checkSelfPermission(Manifest.permission.ACCESS_MEDIA_LOCATION));
                Log.d(TAG, "Permission READ_EXTERNAL_STORAGE, " + this.requireContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE));
    }

片段2:

public class Fragment2 extends Fragment {
        ...
        public View onCreate(...
                …
                Log.d(TAG, "Entering Fragment2 requestPermissions operation for permission ACCESS_MEDIA_LOCATION");
                Log.d(TAG, "Permission ACCESS_MEDIA_LOCATION, " + this.requireContext().checkSelfPermission(Manifest.permission.ACCESS_MEDIA_LOCATION));
                Log.d(TAG, "Permission READ_EXTERNAL_STORAGE, " + this.requireContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE));

                String[] permission = {Manifest.permission.ACCESS_MEDIA_LOCATION};
                this.requestPermissions(permission, 1);     // No permission box appears here :-(

                Log.d(TAG, "Exiting Fragment2 requestPermissions operation for permission ACCESS_MEDIA_LOCATION");
                Log.d(TAG, "Permission ACCESS_MEDIA_LOCATION, " + this.requireContext().checkSelfPermission(Manifest.permission.ACCESS_MEDIA_LOCATION));
                Log.d(TAG, "Permission READ_EXTERNAL_STORAGE, " + this.requireContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE));
                …
        
        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
                    Log.d(TAG, "Fragment2 Request Permissions callback");

                    for (int i = 0; i < permissions.length; i++)
                        Log.d(TAG, "Permission " + permissions[0] + ", " + grantResults[0] );

                    Log.d(TAG, "Permission ACCESS_MEDIA_LOCATION, " + this.requireContext().checkSelfPermission(Manifest.permission.ACCESS_MEDIA_LOCATION));
                    Log.d(TAG, "Permission READ_EXTERNAL_STORAGE, " + this.requireContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE));
        }

当在 Nexus 6 API 29 模拟器上运行时,会弹出 READ_EXTERNAL_STORAGE 的第一个 UI 框,然后我点击“允许”。然后我转到第二个片段,但调用 requestPermissions 时没有弹出 UI 框。

这是日志。可以看到,当调用requestPermissions时,权限是不允许的,但是当它到达回调时,权限已经被授予:

2020-10-20 12:17:38.154 8830-8830/com.example.example1 D/ContentValues: Entering Fragment1 requestPermissions operation for permission READ_EXTERNAL_STORAGE
2020-10-20 12:17:38.155 8830-8830/com.example.example1 D/ContentValues: Permission ACCESS_MEDIA_LOCATION, -1
2020-10-20 12:17:38.155 8830-8830/com.example.example1 D/ContentValues: Permission READ_EXTERNAL_STORAGE, -1
2020-10-20 12:17:38.162 8830-8830/com.example.example1 D/ContentValues: Exiting Fragment1 requestPermissions operation for permission READ_EXTERNAL_STORAGE
2020-10-20 12:17:38.163 8830-8830/com.example.example1 D/ContentValues: Permission ACCESS_MEDIA_LOCATION, -1
2020-10-20 12:17:38.164 8830-8830/com.example.example1 D/ContentValues: Permission READ_EXTERNAL_STORAGE, -1
2020-10-20 12:17:49.544 8830-8830/com.example.example1 D/ContentValues: Fragment1 Request Permissions callback
2020-10-20 12:17:49.544 8830-8830/com.example.example1 D/ContentValues: Permission android.permission.READ_EXTERNAL_STORAGE, 0
2020-10-20 12:17:49.545 8830-8830/com.example.example1 D/ContentValues: Permission ACCESS_MEDIA_LOCATION, -1
2020-10-20 12:17:49.546 8830-8830/com.example.example1 D/ContentValues: Permission READ_EXTERNAL_STORAGE, 0
2020-10-20 12:17:55.312 8830-8830/com.example.example1 D/ContentValues: Entering Fragment2 requestPermissions operation for permission ACCESS_MEDIA_LOCATION
2020-10-20 12:17:55.313 8830-8830/com.example.example1 D/ContentValues: Permission ACCESS_MEDIA_LOCATION, -1
2020-10-20 12:17:55.318 8830-8830/com.example.example1 D/ContentValues: Permission READ_EXTERNAL_STORAGE, 0
2020-10-20 12:17:55.327 8830-8830/com.example.example1 D/ContentValues: Exiting Fragment2 requestPermissions operation for permission ACCESS_MEDIA_LOCATION
2020-10-20 12:17:55.328 8830-8830/com.example.example1 D/ContentValues: Permission ACCESS_MEDIA_LOCATION, -1
2020-10-20 12:17:55.329 8830-8830/com.example.example1 D/ContentValues: Permission READ_EXTERNAL_STORAGE, 0
2020-10-20 12:17:55.621 8830-8830/com.example.example1 D/ContentValues: Fragment2 Request Permissions callback
2020-10-20 12:17:55.622 8830-8830/com.example.example1 D/ContentValues: Permission android.permission.ACCESS_MEDIA_LOCATION, 0
2020-10-20 12:17:55.623 8830-8830/com.example.example1 D/ContentValues: Permission ACCESS_MEDIA_LOCATION, 0
2020-10-20 12:17:55.623 8830-8830/com.example.example1 D/ContentValues: Permission READ_EXTERNAL_STORAGE, 0

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我请求 ACCESS_MEDIA_LOCATION 权限时没有显示权限框? 的相关文章

  • Android EditText 和 addTextChangedListener

    我目前正在将数据库管理器移植到 Android 由于性能原因 我喜欢 仅更新已修改的属性 我尝试使用 addTextChangedListener 执行此操作 以便将修改后的条目添加到列表中 但我的程序从未输入其任何方法 EditText
  • 如何访问 Android 心率传感器原始数据? (反射光,不是心跳)

    心率传感器上的 android sdk 仅返回计算出的 bpm 我对此不感兴趣 我需要访问 Android 心率传感器原始数据 例如就反射值的强度而言将会很大 因为心率传感器基本上使用 LED 并测量随时间变化的反射率 如果可能 访问由任何
  • 在工具栏下显示内容

    您好 我试图简单地将我的内容放在工具栏下方 但是当我运行我的应用程序时 某些内容本应位于工具栏下方 却隐藏在工具栏后面 我已经阅读了有关使用框架布局来尝试将其分离的内容 但我有点卡住了 我目前正在使用该软件提供的基本 android stu
  • Cordova - 启动后出现白屏,控制台中没有例外

    我已经离开我的 Cordova 应用程序一段时间了 但昨天刚刚进行了一次新的克隆 发现它出现了 死机白屏 症状 启动画面显示 程序加载 然后我就得到一个空白屏幕 更多细节 CLI 科尔多瓦 6 1 1 安卓 5 1 1 ios 4 1 1
  • 嵌套 XML 布局文件

    android 有没有办法从另一个布局文件引用 xml 布局文件 为了更好地解释 我有一个名为layout1 xml 和layout2 xml 的布局文件 我可以从layout1 xml引用layout2 xml吗 用这个
  • VOIP通话录音

    我正在开发一个在 android 中录制 VOIP 通话的项目 我没有找到任何解决方案 有很多应用程序支持手机上的 VOIP 录音 我找不到任何教程和帮助 立方体通话记录器 https play google com store apps
  • CoordinatorLayout 和 ImageView 在滚动时调整宽度的问题

    我正在尝试放置一个ImageView in a CollapsingToolbarLayout它在加载时占据整个屏幕 并且当您滚动内容时 16x9 分辨率图像宽度会调整大小 直到图像占据屏幕的整个宽度 那时 我希望图像具有视差app lay
  • 自动删除 Firebase 通知

    我有一个问题 我都读过让通知在 5 分钟后消失 https stackoverflow com questions 15648699 make notification disappear after 5 minutes and 几秒钟后清
  • 什么是 Android 测试协调器?

    谷歌最近发布了Android测试支持库1 0 读完后overview https android developers googleblog com 2017 07 android testing support library 10 is
  • Android 和 Google 地图内部片段以及其他控件和 viewpager

    我是android编程新手 我有一个带有 3 个页面 片段 的小应用程序 使用 pageradapter 和 viewpager 在它们之间滑动 其中一个页面包含复选框 和其他控件 和地图 我的问题是程序在启动时崩溃 Fragment co
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 在 Android 中加密/解密字符串的简单方法

    我的问题是如何加密String String AndroidId Override public void onCreate Bundle savedInstanceState super onCreate savedInstanceSta
  • AndEngine MenuScene - 无法单击按钮

    我有一个关于 android 和 andengine 的小问题 这是我的主菜单的源代码 AbstractScene is extending Scene public class MainMenuScene extends Abstract
  • Android 操作项上的通知徽章

    我想在操作栏中放置的购物车图像上添加一个通知徽章 并以编程方式操作它 有帮助吗 您可以显示自定义MenuItem on ActionBar通过创建一个custom layout for MenuItem 要设置自定义布局 您必须使用菜单项属
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 以 HTML 格式发送电子邮件

    我想发送 HTML 格式的电子邮件 如下图所示 我怎样才能做到这一点 请帮我 提前致谢 String body new String table tr td br header td tr br br Get b Best Score b
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • TabLayout 的不同 tabMode

    我正在使用 ViewPager 和 TabLayout 如果选项卡可以放置在显示 tabMode 上 则它们必须是 app tabMode fixed else app tabMode scrollable 我怎样才能做到这一点 我不明白你
  • Android AppWidgetManager 方法 updateAppWidget 无法设置意图、加载数据。而且它是随机发生的

    我的小部件由 2 个按钮和一个显示数据的列表视图组成 大多数时候 当调用小部件提供程序的 onUpdate 方法时 一切都会正常加载 每个人都很高兴 但是我注意到有时在调用更新方法后 小部件完全无法加载其数据 列表视图为空 所有按钮均无响应

随机推荐