当前位置:

首页 > 编程开发 > Android PDFView权限重启失效解决方法

Android PDFView权限重启失效解决方法

本文针对Android应用中使用PDFView库打开PDF文件时,设备重启后出现SecurityException权限错误的问题,提供了详细的解决方案。主要原因是URI权限在重启后丢失,通过takePersistableUriPermissions()方法获取持久化URI权限,确保应用在重启后仍然能够访问PDF文件,从而避免权限问题。

本文目录

    解决Android PDFView重启后权限失效问题

    本文将深入探讨Android应用中使用PDFView库打开PDF文件时,设备重启后出现SecurityException权限错误的问题,并提供详细的解决方案。主要原因是URI权限在重启后丢失,导致应用无法再次访问已选择的PDF文件。通过使用takePersistableUriPermissions()方法获取持久化URI权限,可以确保应用在重启后仍然能够访问PDF文件,从而避免权限问题。

    当你在Android应用中使用barteksc/AndroidPdfViewer库打开PDF文件时,可能会遇到一个问题:当设备重启后,应用再次尝试打开之前保存的PDF文件URI时,会抛出SecurityException,提示缺少MANAGE_DOCUMENTS权限。这是因为通过ACTION_OPEN_DOCUMENT获取的URI权限在应用重启后会失效。

    解决这个问题,需要利用ContentResolver的takePersistableUriPermissions()方法来获取持久化的URI权限。以下是详细的步骤和代码示例:

    1. 移除不必要的Flag

    首先,在启动ACTION_OPEN_DOCUMENT Intent时,移除FLAG_GRANT_PERSISTABLE_URI_PERMISSION Flag,因为我们将在onActivityResult()中手动处理持久化权限。

    intent = new Intent();
    if (Build.VERSION.SDK_INT < 19){
        intent.setAction(Intent.ACTION_GET_CONTENT);
    } else {
        intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        //intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); // 移除此行
    }
    
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |  Intent.FLAG_GRANT_WRITE_URI_PERMISSION  );
    intent.setType("application/pdf");

    2. 在onActivityResult()中获取持久化URI权限

    在onActivityResult()方法中,当接收到ACTION_OPEN_DOCUMENT的结果时,调用takePersistableUriPermissions()方法。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent resultData) {
        super.onActivityResult(requestCode, resultCode, resultData);
        if (requestCode == 1002 && resultCode == Activity.RESULT_OK) {
            Uri uri;
    
            if (resultData != null) {
                uri = resultData.getData();
                String name = getFileName(uri);
    
                // 获取持久化URI权限
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    final int takeFlags = resultData.getFlags()
                            & (Intent.FLAG_GRANT_READ_URI_PERMISSION
                            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                    ContentResolver resolver = getContentResolver();
                    resolver.takePersistableUriPermission(uri, takeFlags);
                }
    
                db.insertRowAdmins(name, uri.toString(), R.drawable.book, 23, db.getNameTableId().get(positionTab));
                setNotify();
            }
        }
    }

    代码解释:

    • resultData.getFlags(): 获取 Intent 携带的 Flags。
    • & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION): 提取出读写权限相关的 Flag。
    • getContentResolver(): 获取 ContentResolver 实例。
    • resolver.takePersistableUriPermission(uri, takeFlags): 关键步骤,请求系统授予应用对该 URI 的持久化读写权限。

    3. 权限声明(AndroidManifest.xml)

    虽然MANAGE_DOCUMENTS权限看起来相关,但实际上,对于通过ACTION_OPEN_DOCUMENT获取的URI,并不需要此权限。确保你的Manifest文件中包含以下权限:

    如果你的应用需要写入PDF文件,还需要:

    4. 注意事项

    • 确保你的应用在处理URI时,始终检查URI的有效性。
    • 如果用户删除了文件,即使有持久化URI权限,也无法访问该文件。
    • 在保存URI到数据库之前,确保已经获取了持久化权限。

    总结

    通过移除不必要的Flag,并在onActivityResult()中使用takePersistableUriPermissions()方法,可以解决Android应用重启后PDFView库打开PDF文件时出现的SecurityException权限问题。 这种方法允许你的应用程序在重启后仍然能够访问用户选择的PDF文件,提供更好的用户体验。 记住,在处理文件URI时,始终要小心处理权限问题,并确保你的应用能够正确处理文件不存在的情况。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    opencode安装skills教程及本地配置方法
    opencode安装skills教程及本地配置方法

    遇到OpenCode Skills无法加载或配置无效?本文手把手教你完成Skills的安装、环境变量设置及本地调试,避开常见坑点,让AI助手更懂你的代码习惯。

    如何开启Visual Studio2022实时代码分析警告提示
    如何开启Visual Studio2022实时代码分析警告提示

    解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。

    如何在Visual Studio2022查看变量监视窗口调试程序
    如何在Visual Studio2022查看变量监视窗口调试程序

    详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。

    Visual Studio2017设置默认编码为UTF-8不带BOM
    Visual Studio2017设置默认编码为UTF-8不带BOM

    针对 Visual Studio 2017 缺乏全局默认编码选项的情况,详解如何利用 .editorconfig 设定项目级 UTF-8 无 BOM 规则,以及手动转换现有文件并校验字节的方法。

    Visual Studio2022F5调试提示启动项目未配置怎么修复
    Visual Studio2022F5调试提示启动项目未配置怎么修复

    解决 Visual Studio 2022 F5 调试报错问题,通过设置启动项目、检查解决方案属性及正确区分类库与应用项目,快速恢复调试功能。

    Visual Studio2022NuGet包还原失败离线处理方案
    Visual Studio2022NuGet包还原失败离线处理方案

    解决Visual Studio 2022离线环境中NuGet包还原失败的难题,涵盖依赖链分析、本地源配置、包集收集及隔离验证步骤,帮助开发者构建稳定的离线开发环境。

    Visual Studio2017大项目加载缓慢,优化加载性能技巧
    Visual Studio2017大项目加载缓慢,优化加载性能技巧

    解决Visual Studio 2017大型项目加载慢的实用指南。涵盖性能监测、扩展管理、文档恢复优化及版本兼容性检查,帮助开发者精准定位瓶颈并提升工作效率。

    Visual Studio2022设置多启动项目同时调试运行
    Visual Studio2022设置多启动项目同时调试运行

    详解 Visual Studio 2022 多启动项目配置方法,包括启动动作选择、顺序调整及调试技巧,帮助开发者高效调试分布式或前后端分离应用。

    fastapi下载文件接口实现教程
    fastapi下载文件接口实现教程

    深入解析在FastAPI框架中实现文件下载接口的完整方案,涵盖基于FileResponse的本地静态文件传输、基于StreamingResponse的分块流式传输、RFC 5987中文文件名编码规范、路径穿越安全防御及BackgroundTasks临时文件清理,并配备详细代码示例与架构解析图。

    码上飞 codeflying 平台功能介绍
    码上飞 codeflying 平台功能介绍

    了解码上飞CodeFlying如何利用自然语言生成应用。通过物品借用登记实例,学习需求解析、代码生成、测试优化及对话修改的核心操作流程。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。