首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Android 11中从最近使用的文件夹中选择PDF文件时,会出现NulllPointException:Uri

在Android 11中,当你尝试从最近使用的文件夹中选择PDF文件时遇到NullPointerException: Uri错误,这通常是由于URI处理不当或权限问题引起的。以下是解决这个问题的详细步骤和原因分析:

基础概念

  • URI(Uniform Resource Identifier):用于标识资源的字符串,常用于访问文件、网络资源等。
  • NullPointerException:Java中常见的运行时异常,表示尝试访问一个空对象的属性或方法。

可能的原因

  1. 权限问题:Android 11对文件访问权限有更严格的要求,需要显式请求存储权限。
  2. URI解析问题:URI可能为空或格式不正确,导致解析失败。
  3. 文件选择器问题:文件选择器返回的URI可能不正确或不完整。

解决方法

1. 请求存储权限

在Android 11中,需要显式请求存储权限。可以在AndroidManifest.xml中添加以下权限声明:

代码语言:txt
复制
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然后在代码中请求权限:

代码语言:txt
复制
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
}

2. 处理URI

确保URI不为空且格式正确。可以在获取URI后进行检查:

代码语言:txt
复制
Uri selectedUri = data.getData();
if (selectedUri != null) {
    // 处理URI
} else {
    Log.e("URI Error", "Selected URI is null");
}

3. 使用ContentResolver解析URI

使用ContentResolver来解析URI并读取文件内容:

代码语言:txt
复制
try {
    ContentResolver contentResolver = getContentResolver();
    InputStream inputStream = contentResolver.openInputStream(selectedUri);
    if (inputStream != null) {
        // 读取文件内容
        inputStream.close();
    } else {
        Log.e("File Error", "Failed to open input stream");
    }
} catch (IOException e) {
    e.printStackTrace();
}

示例代码

以下是一个完整的示例代码,展示了如何请求权限并处理URI:

代码语言:txt
复制
public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE = 123;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
        } else {
            openFilePicker();
        }
    }

    private void openFilePicker() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("application/pdf");
        startActivityForResult(intent, REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
            Uri selectedUri = data.getData();
            if (selectedUri != null) {
                try {
                    ContentResolver contentResolver = getContentResolver();
                    InputStream inputStream = contentResolver.openInputStream(selectedUri);
                    if (inputStream != null) {
                        // 读取文件内容
                        inputStream.close();
                    } else {
                        Log.e("File Error", "Failed to open input stream");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("URI Error", "Selected URI is null");
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            openFilePicker();
        } else {
            Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
        }
    }
}

参考链接

通过以上步骤,你应该能够解决在Android 11中选择PDF文件时出现的NullPointerException: Uri错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android | 作用域存储适配

以前我们访问内存卡文件可以通过 Uri.fromFile ,将 File 转换成 Uri 对象,这个 uri 对象表示这本地真实路径。...就是 Android 系统对 SD 卡做了很大限制, 10.0 开始,每个程序只能有权自己外置存储空间关联目录下读取和创建相应文件,也称作沙箱。...但是这个文件夹文件随着应用卸载而被随之删除。 ​ 那如果需要访问其他目录怎么办呢,比如获取相册图片,向相册添加一张图片。...为此,Android 系统针对系统文件类型进行了分类**:图片,音频,视频 这三类文件可以通过 MediaStore API 来进行访问,这种称为共享空间,其他系统文件需要使用 系统文件选择器来进行访问...上传文件 需要将文件复制到沙箱,然后进行上传操作 1,使用文件选择器,选择文件 val mimeTypes = arrayOf( FileIntentUtils.getMap("doc"

74420

干货 | 携程Android 10适配踩坑指南

随着Android系统版本不断地迭代更新,每个版本中都会加入很多新API进去,但是新增API老版系统并不存在,因此这就出现了一个向下兼容问题。...如果取值为 false ,表示不迁移依赖包到AndroidX,但在使用依赖包内容可能会出现问题,如果你项目中没有使用任何三方依赖,此项可以设置为 false。...,未申请存储权限,通过ContentResolver查询不到文件Uri,即使通过其他方式获取到文件Uri,读取或创建文件抛出异常; MediaStore API不能够访问其他应用创建非媒体文件(pdf...主要是公共目录下创建文件文件夹拿到本地路径uri,不同Uri,可以保存到不同公共目录。...,其获取设备ID直接返回null targetSdkVersion>=29 应用,其获取设备ID直接抛出异常SecurityException 如果您App希望Android 10

3.3K77
  • Android 10(Q)11(R) 分区存储适配

    这些应用可能会在磁盘存储大量文件,即使应用被卸载了还会依然存在。另外,这些应用还可能读取其他应用一些敏感文件数据。...调用 Storage Access Framework API :启动系统文件选择器向用户申请操作指定文件访问方式: ?...使用直接文件路径和原生库访问文件 为了帮助您应用更顺畅地使用第三方媒体库,Android 11 允许您使用除 MediaStore API 之外 API 访问共享存储空间中媒体文件。...Q:我可以媒体集文件夹下创建文档,就可以避开权限问题了? A:官方文档上写了只能创建相应类型媒体/文件,具体如何限制,没有说明。...总结 Android 10提出分区存储之后到现在已经一年多了,所以Google 强制推行态度到现在 targetSDK >=30 才强制启用分区存储来看,Google 还是渐渐地选择给开发者留更多时间

    2.3K30

    Android7.0后FileProvider升级安装包导致FileUriExposedException异常

    最近在鼓捣应用升级遇到了安装失败问题,抛出了“apk exposed beyond app through Intent.getData()”异常,网上一顿谷歌百度后晓得了,是谷歌Android7.0...uri文件地址改变,使用FileProvider可以生成content://Uri来替代file://Uri 官方解答:出于用户隐私安全考虑,谷歌——(对于面向 Android 7.0 应用,Android.../> 3.上面的resource属性资源文件res下新建一个xml文件夹,最后xmll文件夹中新建file_paths.xml文件。...file_path.png 4.最后代码调用安装apk,此处要判断区分7.0以后和之前版本,因为Android7.0之前使用FileProvider这个方式也异常。...context) { //此处file应为apk下载完整路径文件,这里下载了外部存储私有缓存文件夹下, // 你可以选择其他存储地址如:外置SD卡等,但是要注意与

    2.5K31

    相册适配 Android 11 绕那些弯路

    image.png 一、背景 最近公司相册组件被业务方反馈了新问题, targetSdk=30 Android 10 手机上运行相册,缩略图会加载不出来,于是就开启了这次趟坑之路。...`,这明显为外部存储空间中文件夹,且不是应用专属文件,这时图片加载框架层就会抛出异常java.io.FileNotFoundException。...v=RjyYCUW-9tY&feature=youtu.be image.png 视频对我们有用信息大概是这样, Android 10 时候,很多开发者都反应了类似的问题,使用一些 native...,无法使用 File Api,造成了很多困难。...,确实找到了一小段不起眼文字 使用直接文件路径和原生库访问文件 为了帮助您应用更顺畅地使用第三方媒体库,Android 11 允许您使用除 MediaStore API 之外 API 通过直接文件路径访问共享存储空间中媒体文件

    1.7K30

    android渗透测试学习笔记

    download 签名 检查应用程序签名 $ jarsigner -verify -certs -verbose testing.apk 解压缩.apk文件 解析META-INF文件夹出现CERT.RSA...init之后,它挂载Android系统运行一些重要目录 /dev /sys /proc init配置文件init.rc和init....[device-name].rc获取自己配置,某些情况下位于相同位置.sh文件获取自己配置 $ls -l | grep 'init' # cat init.rc 加载使用属性 location...一旦完成整个引导过程,系统发送BOOT_COMPLETED广播,许多应用程序可能使用称为广播接收器Android应用程序组件来监听。...,意味着ContentProvider泄漏数据并存在漏洞 修复漏洞创建ContentProvider指定参数android:exported=false,或者创建一些新权限,另一个应用程序访问供应器之前必须请求它

    80230

    Android 允许其他应用启动您Activity

    实际上这并不是一个新知识点,只不过出现不是很频繁,而我也实际开发中用过,因此这里就写出来,做个笔记。...这就是要到达效果,运行看看。 四、获取文件路径   当我们通过这种方式打开自己App时候,Activity是会收到一个Uri,我们可以通过Uir拿到文件路径。...path } } 这就是非常简单代码,没啥好说,下面运行一下看看: 你可以看到控制台也打印了路径: 五、文件写入   光是知道这个文件路径还是不够,要想操作这个文件,我们需要将此文件微信应用文件夹写入到自己应用目录下...然后通过Uri到此文件微信应用路径和文件名称。...然后自己应用目录下创建文件,通过微信文件输入流和当前应用文件输出流,将数据输入流写到输出流,这里还有一个write()函数,代码如下: private fun write(inputStream

    1.2K50

    Android图片或拍照选择图片功能实例代码

    前言 一般公司都有更换用户头像功能,需要从图库中选择图片或者拍照,基本还会对图片进行裁剪。最近抽空就做了一些简单封装,方便以后使用。主要是用了建造者模式,链式调用,方便简单。...图库图片 /** * 图片类型文件选择图片 * * @param activity */ private void takeImageFromAlbum(Activity activity...res文件夹下创建xml文件夹,xml文件夹下面再创建拍照图片存放路径,名称可以随便起,但是要记得取时候要一致。...图片旋转角度处理 有些手机拍照或者选取图片时候会出现图片有旋转角度问题,所以要根据旋转角度来重新生成新图片,符合要求。...onActivityResult处理关于图片选择结果回调,然后再根据类型处理不同结果 /** * 代理Activity返回值过程然后 * * @param requestCode

    1K20

    Android7.0版本影响开发改进分析

    DownloadManager不再按文件名分享私人存储文件。老App访问COLUMN_LOCAL_FILENAME可能出现无法访问路径。...:必须是true,表示授予 URI 临时访问权限 exported:必须是false resource:@xml/file_paths是我们接下来要添加文件 res目录下新建一个xml文件夹...使用应用本地版本来替代使用 libcrypto.so SSL_ctrl 符号 注解保留 Android 7.0注解可见性被忽略修复错误。这种问题将启用本不应被允许运行时访问注解。...否则,当用户最近使用记录恢复运行App,App将会出现崩溃现象。您应测试应用以确保不会发生此行为。要进行此测试,您可以通过DDMS手动终止应用,可以造成相同崩溃现象。...你可以通过更改字体大小 (Setting Display Font size) 并随后最近使用记录恢复运行应用,来验证App行为。 3.

    86310

    Android基础】AndroidIntent详解

    因为每一个Acticity任务不一样,所以经常互各个Activity之间进行跳转,Android这个动作是靠Intent来完成。...Android5.0(API 21),系统抛出异常当你用隐式Intent去调用bindService()方法。...你可以在你应用程序自定义action,但是大部分时候你只使用在Intent定义action。...想要了解更多action可以查看Intent源码或者api,Intent定义了很多action,除了Android framework,在别处也定义了很多action,比如在Settings应用...下面的例子是创建一个Serviceapp,名字叫DownloadService,功能是网络上下载文件,你可以通过下面的代码来启动它: // Executed in an Activity, so

    1.6K70

    AndroidQ(10)分区存储完美适配方法

    前言 最近时间在做AndroidQ适配,截止到今天AndroidQ分区存储适配完成,期间出现很多坑,目前网上帖子大部分都是概述变更内容,接下来几篇帖子都是对分区存储实际经验代码总结,填坑经验,特此记录一下...这里需要注意:适配AndroidQ时候还要兼容Q系统版本以下使用SDK_VERSION区分 背景 存储权限 Android Q仍然使用READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE...APP私有目录 地址:/storage/emulated/0/Android/data/包名/files 私有目录存放app私有文件随着App卸载而删除。...适配指导 AndroidQ中使用ContentResolver进行文件增删改查 1、获取(创建)自身目录下文件夹 获取及创建,如果手机没有对应文件夹,则系统自动生成 //自身目录下创建...uri,不同Uri,可以保存到不同公共目录

    1.5K40

    Android deeplink漏洞

    ,允许网站 URL 立即打开应用程序相应内容(无需用户手动选择应用程序)。...如果用户不希望应用程序成为默认处理程序,他们可以设备系统设置覆盖此行为。...接管 绕过本地身份验证 应用程序可以本地身份验证(密码/生物识别)之前处理深层链接,有时这可能导致直接用户没有本地身份验证情况下被推送到活动。...应用程序使用以下命令加入硬编码临时文件夹file.pdf:/data/data/com.vulnerable-app/tempfiles/file.pdf 应用程序从中下载 PDF 文件https:...//website.com/file.pdf并将其保存到/data/data/com.vulnerable-app/temp-files/file.pdf 应用程序为用户打开下载文件 在这种情况下,攻击者可以使用路径遍历重写包内任意文件

    63040

    AndroidQ兼容性适配指南

    确保没有后台位置信息更新情况下优雅降级 使用 Android 10 引入权限在后台获取位置信息 了解详情 ✅ 系统执行后台 Activity 针对后台启动 Activity 实施了限制 不需要用户互动就启动...分区存储模型下,SD卡公共目录是不让访问,除了共享媒体那几个文件夹。...借助 SAF,用户可轻松在其所有首选文档存储提供程序浏览并打开文档、图像及其他文件。用户可通过易用标准界面,以统一方式在所有应用和提供程序浏览文件,以及访问最近使用文件。...解决方法1: 参见使用MediaStore访问公共目录和使用SAF选择单个文件使用MediaStore接口访问公共目录多媒体文件,或者使用 SAF访问公共目录任意文件。...无法正确分享文件 问题原因: APP将App-specific目录私有文件分享给其他APP使用了file://类型 Uri

    7K30

    常用控件之ImageView使用(一)

    简单使用 下面我们简单介绍 ImageView使用(再此示例,需要使用到一个ic_luffy.png图片,需要放到res文件夹下drawable文件夹): ?...对于 android:scaleType属性,因为关于图像在 ImageView显示效果,所以有如下属性值可以选择: matrix:使用 matrix方式进行缩放。...加载SD卡图片 在上述,只是简单介绍加载资源文件图片以及ImageView一些基本属性,接下来,我们为大家讲解如何加载SD卡图片,并且我们考虑到部分小伙伴对Android很感兴趣,但是都是使用自己手机来进行调试...//而绝对路径就是你SD卡最上层文件夹(就好比还未双击C盘) //而/xmkh表示文件夹(相当于C盘一个文件夹名字...而且一些小伙伴阔能使用是自己手机,相册都不知道在哪个文件夹下,没关系,接下来我们就教你如何相册中选取照片并通过 ImageView进行加载!!

    1.7K20

    MTK Android平台开发流程

    /mkmmpackage/app/sudoku 5.设置eclipse选择启动不同AVD设置方式: eclipse右击指定app文件夹选择Runas- Runconfigrations,弹出界面选择...GCC是自由软件发展过程著名例子,由自由软件基金以GPL协议发布。GCC是大多数类Unix操作系统(如Linux、BSD、MacOSX等)标准编译器,GCC同样适用于微软Windows。...文件,找到MTK_THEMENANAGER_APP这个关键字, 如下这个判断,添加自己资源包名字 ifeq($(strip$(MTK_THEMEMANAGER_APP)),yes) PRODUCT_PACKAGES...,使用第二步得到端口号 4.请在需要调试地方设置断点,然后调试 42.如何确认一个应用程序安装位置 android:installLocation=”internalOnly” android:installLocation...控制屏幕点亮与关闭 Android通过各种Lock锁对电源进行控制,需要注意是加锁和解锁必须成对出现

    3K40

    Android适配全面总结(二)----版本适配

    列出危险权限,并且应用程序已经同一权限组具有另一个危险权限,系统立即授予权限,而不会与用户进行任何交互。...一个Uri允许你获取临时权限去读写文件,当使用含有UriIntent,可以使用Intent.setFlags来添加临时权限。... (二)配置你要获取文件所在文件夹 --> 创建一个xml文件,比如file_demo.xml,文件内容如下: <paths xmlns:android...手机拍照取uri处理 if(Build.VERSION.SDK_INT<24){ //7.0如果用Uri.fromFile(XXX)闪退,所以这里要特别做一个判断。...此权限与其他运行时权限一样,会与应用绑定,安装进行提示,确保用户授予使用安装来源权限后,此权限才会提示用户安装应用。

    2.3K10

    Android基础】Android利用Intent与其他应用交互

    前言: 上一篇博客给大家聊了Intent定义,分类、属性和功能,相信大家对于IntentAndroid作用已经清楚,这一篇博客将会给大家聊Intent用法。...比如你应用程序需要给用户显示一个地理位置地图上,你不必在你应用程序实现地图功能,而是创建一个显示这个地理位置Intent,发送出去,Android系统启动那些可以处理这个请求应用程序。...还比如:你用百度云盘下载了一个pdf文档,你点击打开这个文档时候百度云盘是无法打开,但是也许你系统上安装有其他能打开pdf文档阅读器,这个时候就会弹出一个对话框,列举了可以打开pdf文档应用程序...MIME类型就是设定某种扩展名文件用一种应用程序来打开方式类型,当该扩展名文件被访问时候,浏览器自动使用指定应用程序来打开。多用于指定一些客户端自定义文件名,以及一些媒体文件打开方式。...Android通过文件MIME类型来判断有哪些应用程序可以处理这些文件,并使用其中某一个应用程序(如果有多个可选应用程序,则用户必须指定一个)处理之。

    906100

    webview拉起拍照和录像爬坑终结篇

    对于iOS环境上,简单两个配置就OK啦 即只需配置里加上摄像头和麦克风使用权限。...这里,用户h5上点击文件,我们以下环节实现WebChromeClient,基于不同Androidapi版本回调函数会被触发: public class EssWebChromeClient...表示 file 类型 元素中用户可以选择文件类型。每个唯一文件类型说明符可以采用下列形式之一: 一个以英文句号(".")开头合法不区分大小写文件名扩展名。...step2、好了,当用户点击选择文件,已经触发了我们WebChromeClient选择文件回调,接下来,我们实现原生拉起想起拍照或者是: public void recordVideoForApiBelow21...name="my_images" path="Android/data/com.tencent.xxx/files/Pictures" /> 因为我们拍照存储临时文件,防止相册

    3.9K40
    领券