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

为什么DocumentFile.getParentFile()在使用Uri创建之后返回null?

DocumentFile.getParentFile()方法是Android平台上用于获取文件的父目录的方法。在使用Uri创建DocumentFile对象之后,调用getParentFile()方法返回null的原因可能有以下几种:

  1. Uri指向的文件不存在:如果使用的Uri指向的文件在设备上不存在,那么调用getParentFile()方法将返回null。在使用Uri创建DocumentFile对象之前,可以先通过ContentResolver查询该Uri对应的文件是否存在。
  2. Uri指向的文件是根目录:如果使用的Uri指向的文件是设备的根目录,那么调用getParentFile()方法将返回null。根目录没有父目录,因此无法获取。
  3. Uri指向的文件是虚拟文件:Android的存储框架中,有些文件是虚拟文件,它们并不是实际的文件,而是代表了一些特殊的数据源或者内容提供者。对于这些虚拟文件,调用getParentFile()方法也会返回null。

综上所述,调用DocumentFile.getParentFile()方法返回null可能是因为Uri指向的文件不存在、是根目录,或者是虚拟文件。在使用该方法之前,可以先检查Uri对应的文件是否存在,并确保不是根目录或虚拟文件。

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

相关·内容

android:运行时权限工具类的封装

一、为什么封装? 众所周知,Android 从 6.0开始引入运行时权限机制,将权限分为了普通权限和危险权限 ,对于危险权限我们必须在使用的时候动态的去申请。...但是,我个人认为 某个权限被拒绝之后,直接给出提示,告知用户可能会影响哪些功能并给出重新配置权限的引导会更好一些。...FM 中暂未测试 > * * 注意,处理权限被拒绝有两种方式, * (1)一种是拒绝之后直接给出提示,提示用户拒绝之后将不能使用XX功能,如果是这种方式的话,就使用一个参数的构造,然后直接判断权限是否全都被允许...uri = Uri.fromParts("package", context.getPackageName(), null); intent.setData(uri);...FileProvider 解决7.0及以后系统中使用 Uri.fromUri() 获取URI之后调用相机崩溃的情况 * 6、getExternalCacheDir()获取当前APP对应的缓存目录,使用该方式不用申请读写

1.5K20
  • 【Android开发基础系列】数据持久化专题

    ,selectionArgs就是占位符实际参数集;下面的几种参数都很类似,columns表示要查询的列所有名称集,selection表示WHERE之后的条件语句,可以使用占位符,groupBy指定分组的列名...,使用默认值 super(context, DATABASE_NAME, null, DATABASE_VERSION); }     //数据库第一次被创建时onCreate会被调用     @Override...onCreate方法会被调用,我们可以执行创建表的语句,当系统发现版本变化之后,会调用onUpgrade方法,我们可以执行修改表结构等语句。        ...我们获取数据库实例时使用了getWritableDatabase()方法,也许朋友们会有疑问,getWritableDatabase()和getReadableDatabase()中,你为什么选择前者作为整个应用的数据库实例呢...,记得使用的时候保持一致就可以了;"content://com.bing.provider.myprovider/tablename";         D:如果URI中包含表示需要获取的记录的ID;

    43120

    鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)

    onCommand() Service 创建完成之后调用,该方法客户端每次启动该 Service 时都会调用,用户可以该方法中做一些调用统计、初始化类的操作。...最通用的前台服务就是音乐播放了,用手机的时候它会在通知栏创建,然后播放音乐,那么鸿蒙中需要怎么使用前台服务呢?...使用前台 Service 并不复杂,开发者只需 Service 创建的方法里,调用keepBackgroundRunning()将 Service 与通知绑定。...; } @Override public String getType(Uri uri) { return null; } } 创建的时候就生成了一些代码...通过dupFileDescriptor()函数复制待操作文件流的文件描述符,并将其返回,供远端应用使用

    2.7K53

    Android中Bitmap、File与Uri之间的简单记录

    = null) { String uriString = uri.toString(); int index = uriString.lastIndexOf("/"); //匹配 / 一个路径中最后出现位置...8.0 上运行的时候 选择照片之后Uri : content://media/external/images/media/568344 进行上面方法转换完之后: /storage/emulated...所得到的字符串使用默认名称分隔符来分隔名称序列中的名称。...如果此抽象路径名是空的抽象路径名,则返回当前用户目录的路径名字符串, 该目录由系统属性 user.dir 指定。否则,使用与系统有关的方式分析此路径名。...非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。 同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。

    4K10

    Android学习--跨程序共享数据之内容提供其探究

    ,同时还能保证被访问的数据的安全性,目前使用内容提供器是Android实现跨程序共享数据的标准方式。...不过在理解这个内容提供器之前,我们需要理解Android的运行时权限,这个就不需要我们解释什么是运行时权限了,因为我们之前其实已经使用过,比如“相机权限”,“照片权限”,“位置权限”等等!...字符串之后,我们还需要将它解析成Uri对象才能使用,解析的方法也很简单如下:       Uri uri = Uri.parse("content://com.example.app.provider/...,返回false表示失败,注意的是只有当ContentResolver尝试访问我们的数据库的时候内容提供器才会被初始化       query()       从内容提供器中查询数据,使用uri参数来确定查询哪张表...,具体的参数我们就不在说了,前面我们已经说过,查询的具体的结果就在cursor对象中存放返回       insert()       添加数据我们也就不再说了,成功之后返回一个用于表示这条记录的URI

    60130

    Spring Boot 中这个默认视图名有点意思,看懂直呼内行内行!

    4.1 Freemarker 先来看使用了 Freemarker 后为什么报循环调用的错。...根据前面两篇文章的分析,现在我们 Spring Boot 中默认使用的视图解析器是 ContentNegotiatingViewResolver,在这个视图解析器中会首先选出所有候选的 View,由于我们的代码中并不存在一个名为...,会去检查视图是否存在,结果发现视图吧不存在,导致最终返回 null。...这就是为什么当我们使用 Freemarker 依赖时报循环请求的异常。 4.2 Thymeleaf 再来看 Thymeleaf,使用 Thymeleaf 时报的异常是模版不存在。...templateResource 之后,会调用 templateResource.exists() 方法判断资源是否存在,也就是相应的模版文件是否存在,如果不存在就会返回 null,进而导致上一个方法抛出异常

    59310

    FileProvider你了解多少?透过FileProvider来看看四大组件之一ContentProvider!

    为什么限制应用间共享文件 打个比方,应用A有一个文件,绝对路径为file:///storage/emulated/0/Download/photo.jpg 现在应用A想通过其他应用来完成一些需求,比如拍照...具体方法就是调用getContentResolver()的相关方法,例如: Cursor cursor = getContentResolver().query(uri, null, null, null...该方法中,返回了File的name和length。 insert,插入方法。没有做任何事。 delete,删除方法。删除Uri对应的File。 update,更新方法。没有做任何事。...一般是使用默认格式: 如果是单条记录返回以vnd.android.cursor.item/ 为首的字符串 如果是多条记录返回vnd.android.cursor.dir/ 为首的字符串 具体怎么用呢?...拿到Content URI 该怎么使用

    80000

    Android:关于ContentProvider的知识都在这里了!

    即可操作 不同的ContentProvider 中的数据 外部进程通过 ContentResolver类 从而与ContentProvider类进行交互 4.2 为什么使用通过ContentResolver...//常量UriMatcher.NO_MATCH = 不匹配任何路径的返回码 // 即初始化时不匹配任何东西 // 步骤2:ContentProvider 中注册URI(addURI())...自定义 ContentProvider 类 注册 创建的 ContentProvider类 进程内访问 ContentProvider的数据 具体使用 步骤1:创建数据库类 关于数据库操作请看文章...---- 5.2 进程间进行数据共享 实例说明:本文需要创建2个进程,即创建两个工程,作用如下 ? 具体使用 进程1 使用步骤如下: 1. 创建数据库类 2....至此,关于ContentProvider进程内 & 进程间的使用讲解完毕。 ---- 6.

    2.4K32

    Carson带你学Android:关于ContentProvider的知识都在这里了!

    即可操作 不同的ContentProvider 中的数据 外部进程通过 ContentResolver类 从而与ContentProvider类进行交互 4.2 为什么使用通过ContentResolver...自定义 ContentProvider 类 注册 创建的 ContentProvider类 进程内访问 ContentProvider的数据 具体使用 步骤1:创建数据库类 关于数据库操作请看文章...// 该方法最下面 String table = getTableName(uri); // 向该表添加数据 db.insert(table, null...5.2 进程间进行数据共享 实例说明:本文需要创建2个进程,即创建两个工程,作用如下 具体使用 进程1 使用步骤如下: 创建数据库类 自定义 ContentProvider 类 注册 创建的 ContentProvider...我们准备好了一系列数据 运行需要访问数据的进程2 进程2中,我们先向ContentProvider中插入数据,再查询数据 至此,关于ContentProvider进程内 & 进程间的使用讲解完毕

    44810

    深入OKHttp之隧道

    1.不使用CONNECT 的隧道 不使用 CONNECT 的隧道,实现了数据包的重组和转发。代理收到客户端的请求后,会重新创建请求,并发送到目标服务器。...当目标服务器返回了数据之后,代理会对 response 进行解析,并且重新组装 response, 发送给客户端。...2.使用 CONNECT 的隧道 当客户端发起 CONNECT 请求的时候,就是告诉代理,先在代理服务器和目标服务器之间建立连接,这个连接建立起来之后,目标服务器会给代理一个回复,代理会把这个回复返回给客户端...到这里,我们就能理解为什么 HTTPS 在有 HTTP 代理的情况下为什么要通过 CONNECT 来建立 SSL 隧道,因为 HTTPS 的数据是加密后的数据,代理正常情况下无法对加密后的数据进行解密...如果 createTunnel 返回null ,说明隧道建立成功。

    83120

    Android内容服务ContentService原理浅析

    uid, pid, userHandle); } 比如:要查询content://A/B/C对应的ObserverNode,首先会找到Authority,找到A对应的ObserverNode,之后...A的children中查找Path=B的Node,然后B的Children中查找Path=C的Node,找到该Node之后,往这个node的ObserverEntry列表中添加一个对象,到这里就注册就完成了...这步之后,消息就通过Binder被传送给App端,APP端,Binder实体的onTransact被回调,并处理相应的事务: private static final class Transport...uri, int userId); } 之后其实就是调用ContentObserver的dispatchChange,dispatchChange可能是Binder线程中同步执行,也可能是发送到一个与...,为什么不能访问,并且pid=0, uid=1000 是怎么来的,其实这个时候是因为Binder机制中的一个小"BUG",需要用户自己避免,ContentProvider使用的时候会校验权限, /*

    1.2K50

    全面解析C#中的异步编程为什么要异步过去糟糕的体验一个新的方式Tasks基于任务的异步编程模型Async和await时间处理程序和无返回值的异步方法结束语

    .NET Framework5.0种,微软为我们系统了新的语言特性,让我们使用异步编程就像使用同步编程一样相近和简单,本文中将会解释以前版本的Framework中基于回调道德异步编程模型的一些限制以及新型的...为什么要异步 一直以来,使用远程资源的编程都是一个容易造成困惑的问题,不同于“本地资源”,远程资源的访问总会有很多意外的情况,网络环境的不稳定机器服务端的故障,会造成很多程序员完全不可控的问题,所以这也就要求程序员需要更多的去保护远程资源的调用...原始的代码返回了一个总数并且显示它,新的一步版本统计还没有完成之前返回给调用者。我们怎么样才可以得到一个结果返回给调用者,答案是:调用者必须支持一个回掉,我们可以统计完成之后调用它。...看起来await关键字阻塞了线程直到task完成下载的数据可用,其实不然,相反它标志了任务的回调,并且立即返回,当这个任务完成之后,它会执行回调。...时间处理程序和无返回值的异步方法 异步方法可以从其他异步方法使用await创建,但是异步在哪里结束?

    2.3K60

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

    最近抽空就做了一些简单的封装,方便以后使用。主要是用了建造者模式,链式调用,方便简单。可以自定义图片路径,附带裁剪和简单压缩功能。...:ACTION不同的Android版本中有所变化 拍照 拍照比较特殊的是因为Android7.0之后,对于URI的读取采用了Fileprovider的方式,所以要特殊处理。...res文件夹下创建xml文件夹,xml文件夹下面再创建拍照图片的存放路径,名称可以随便起,但是要记得取的时候要一致。...true的话,直接返回bitmap,为了统一压缩之后通过回调的形式返回,所以返回值为false,输出成outputUri。..., null);//把ByteArrayInputStream数据生成图片 return bitmap; } 总结 大致过程如上所示,但是一定要Android6.0之后申请动态权限,全部功能已经写了

    1K20

    鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)

    onCommand() Service 创建完成之后调用,该方法客户端每次启动该 Service 时都会调用,用户可以该方法中做一些调用统计、初始化类的操作。...最通用的前台服务就是音乐播放了,用手机的时候它会在通知栏创建,然后播放音乐,那么鸿蒙中需要怎么使用前台服务呢?...使用前台 Service 并不复杂,开发者只需 Service 创建的方法里,调用keepBackgroundRunning()将 Service 与通知绑定。...public String getType(Uri uri) { return null; } } 创建的时候就生成了一些代码,基本的增删改查、打开文件、获取...通过dupFileDescriptor()函数复制待操作文件流的文件描述符,并将其返回,供远端应用使用

    4.6K33

    透过FileProvider再看ContentProvider

    为什么限制应用间共享文件 打个比方,应用A有一个文件,绝对路径为file:///storage/emulated/0/Download/photo.jpg 现在应用A想通过其他应用来完成一些需求,...具体方法就是调用getContentResolver()的相关方法,例如: Cursor cursor = getContentResolver().query(uri, null, null, null...该方法中,返回了File的name和length。 insert,插入方法。没有做任何事。 delete,删除方法。删除Uri对应的File。 update,更新方法。没有做任何事。...一般是使用默认格式: 如果是单条记录返回以vnd.android.cursor.item/ 为首的字符串 如果是多条记录返回vnd.android.cursor.dir/ 为首的字符串 具体怎么用呢?...拿到Content URI 该怎么使用

    1.2K20
    领券