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

Android Studio - Java: ACTION_OPEN_DOCUMENT导致无效的Uri

基础概念

ACTION_OPEN_DOCUMENT 是 Android 中的一个 Intent 动作,用于打开文件选择器,让用户选择一个或多个文件。这个动作允许应用请求访问用户选择的文件,而不需要知道文件的存储位置或路径。返回的 Uri 是一个内容 Uri,它指向用户选择的文件。

相关优势

  1. 权限管理:使用 ACTION_OPEN_DOCUMENT 可以避免直接访问文件系统,从而减少权限需求。
  2. 跨应用共享:通过内容 Uri,可以安全地与其他应用共享文件。
  3. 数据保护:用户可以选择只允许应用读取文件,而不是完全访问文件。

类型

  • 单选:用户只能选择一个文件。
  • 多选:用户可以选择多个文件。

应用场景

  • 文件上传:用户可以从设备中选择一个文件上传到服务器。
  • 图片处理:用户可以选择一张图片进行编辑或处理。
  • 文档阅读:用户可以选择一个文档进行阅读或编辑。

常见问题及解决方法

无效的 Uri

问题描述:使用 ACTION_OPEN_DOCUMENT 后,返回的 Uri 是无效的,导致无法访问文件。

原因

  1. 权限问题:应用没有获取到读取文件的权限。
  2. Uri 解析问题:Uri 格式不正确或无法解析。
  3. 文件不存在:选择的文件已被删除或移动。

解决方法

  1. 检查权限: 确保在 AndroidManifest.xml 中声明了读取文件的权限,并在运行时请求权限。
  2. 检查权限: 确保在 AndroidManifest.xml 中声明了读取文件的权限,并在运行时请求权限。
  3. 请求权限的代码:
  4. 请求权限的代码:
  5. 验证 Uri: 使用 ContentResolver 验证 Uri 是否有效。
  6. 验证 Uri: 使用 ContentResolver 验证 Uri 是否有效。
  7. 处理文件不存在的情况: 在读取文件之前,检查文件是否存在。
  8. 处理文件不存在的情况: 在读取文件之前,检查文件是否存在。

示例代码

以下是一个完整的示例,展示了如何使用 ACTION_OPEN_DOCUMENT 并处理返回的 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);

        findViewById(R.id.btn_open_document).setOnClickListener(v -> openDocument());
    }

    private void openDocument() {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        startActivityForResult(intent, REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null) {
            Uri uri = data.getData();
            if (uri != null) {
                checkUri(uri);
            }
        }
    }

    private void checkUri(Uri uri) {
        ContentResolver contentResolver = getContentResolver();
        try {
            InputStream inputStream = contentResolver.openInputStream(uri);
            if (inputStream != null) {
                // Uri 有效,可以进行文件操作
                inputStream.close();
            } else {
                // Uri 无效
                Toast.makeText(this, "Invalid Uri", Toast.LENGTH_SHORT).show();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

参考链接

通过以上步骤,可以有效解决 ACTION_OPEN_DOCUMENT 导致的无效 Uri 问题。

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

相关·内容

升级Android Studio 导致 `Error:Failed to notify project evaluation listener.`

升级Android Studio 导致 Error:Failed to notify project evaluation listener.解决办法 最近升级Android Studio和sdk后,...[s49wbf1rj1.png] 使用gradlew build --debug看了下输出信息, 没有找到有用. ctrl + shift + alt + s查看下项目配置, 发现项目提示ndk does...not contain any platforms, 如下图: [gmd58n06cz.png] 想了下, 升级Android Studio时候, 顺带升级了ndk等sdk tools, 会不会是这个导致...打开ndk-bundle, 发现有两个目录, 分别是android-ndk-r17和android-ndk-r17b, 其中android-ndk-r17b是可用ndk, android-ndk-r17...图片如下: [uq4aygmltz.png] 想了下, 是不是ndk版本太高, gradle不支持导致错误, 将ndk修改为原来编译RN时android-ndk-r10e, 这次彻底解决问题.

7.1K30
  • Android 11 应用兼容性适配,看这篇就够了

    Android/obb/ 目录及其所有子目录。 2 兼容性影响 如果应用指定AndroidR为运行平台,则不再能使用SAF访问上述指出目录,可能导致业务逻辑异常。...4 使用intent action – ACTION_OPEN_DOCUMENT检查Android/data/和Android/obb/目录是否都不显示。...2 兼容性影响 如果您应用以Android11为目标平台,若用户长时间不使用,当用户再次使用时,若应用没有权限校验逻辑则会导致与回收权限相关业务失效。...(java.lang.String, int, java.lang.String, java.lang.String, java.lang.String) instead. 3 请求新公共 API.../studio/command-line/apksigner AndroidStudio签名介绍: https://developer.android.google.cn/studio/publish

    12.7K42

    Android11 (API30)适配

    Android/obb/ 目录及其所有子目录。 2 兼容性影响 如果应用指定AndroidR为运行平台,则不再能使用SAF访问上述指出目录,可能导致业务逻辑异常。...4 使用intent action - ACTION_OPEN_DOCUMENT检查Android/data/和Android/obb/目录是否都不显示。...2 兼容性影响 如果您应用以Android11为目标平台,若用户长时间不使用,当用户再次使用时,若应用没有权限校验逻辑则会导致与回收权限相关业务失效。...(java.lang.String, int, java.lang.String, java.lang.String, java.lang.String) instead. 3 请求新公共 API 如果您无法为应用中某项功能找到使用非.../studio/command-line/apksigner AndroidStudio签名介绍: https://developer.android.google.cn/studio/publish/

    7.8K11

    AndroidQ分区存储权限变更及适配实现

    如果您提供一组配套应用(例如短信应用和个人资料应用),请使用 content:// URI 设置文件共享。已经建议将此工作流作为一项安全最佳做法。...通过调用 ACTION_OPEN_DOCUMENT intent 能选择要打开文件, intent 会打开系统文件选择器应用。...显示应用所支持类型文件,intent 中需要包含Intent.EXTRA_MIME_TYPES extra GitHub 上 ActionOpenDocument 示例说明了如何使用 ACTION_OPEN_DOCUMENT...照片中位置信息 我们拍摄照片一般在Exif元数据中包含了位置信息,在Android Q 以前我们可以方便获取到图片位置信息,Android Q 会默认对您应用隐藏此类信息。...在 MediaStore 对象中调用setRequireOriginal(),在调用时传入照片 URI

    1.5K31

    Android 分区存储常见问题解答

    A: 如果您应用安装在 Android 10 设备上,并设置了 android:requestLegacyStorage="true",那在设备升级至 Android 11 后,此设置会继续保持旧存储访问方式...但如果您想用就可以用,ACTION_OPEN_DOCUMENT 最早可支持至 Android KitKat (API 19),而 ACTION_GET_CONTENT 则支持至 API 1,二者使用都是系统文件选择器...当然也可以使用 ACTION_OPEN_DOCUMENT 来打开一个现有文件。..." android:maxSdkVersion="29" /> 如要访问其他应用添加文档,或者在您应用卸载重装后访问其卸载前添加文档,就需要通过 ACTION_OPEN_DOCUMENT Intent...如果您使用这种方式,使用 AndroidX FileProvider 来将 file:// Uri 自动转换为 content:// Uri 可能会对您有所帮助。

    1.1K10

    解决android studio 打开java文件 内容全变了问题

    问题描述: 某天打开项目的activityjava文件界面突然变成下面这样了,但是用Notepad++打开代码什么都正常,不知道什么原因造成 ?...补充知识:Android Studio 打开后无故爆红后解决办法,简单粗暴 有效治疗AndroidStudio大姨妈方法。...今天打开AndroidSutudio后表示一脸蒙蔽,项目无故爆红,我本以为是哪里代码有错导致 报错,于是乎逐个检查,但是并没有发现任何问题,然后CelarProduct,ReBuildProduct...导致代码爆红,清完之后你会发现你Local History历史记录会是一片空白,解决前你需要确保代码是没有问题。...以上这篇解决android studio 打开java文件 内容全变了问题就是小编分享给大家全部内容了,希望能给大家一个参考。

    1.1K20

    ContentProvider再探——Document Provider

    Client app:一个普通客户端软件,通过触发ACTION_OPEN_DOCUMENT 和/或 ACTION_CREATE_DOCUMENT就可以接收到来自于Document provider返回内容...当客户端触发了ACTION_OPEN_DOCUMENT或ACTION_CREATE_DOCUMENTIntent,就会发生上述交互。...Authority为包名+provider类型名,如: com.example.android.storageprovider.documents android:exported属性值为ture...4.4 获取资源路径问题 其实这个SAF我们用得较多地方无非是获取图片Uri而已,而从上面的例子我们也发现了: 我们这样获取链接是这样: content://com.android.providers.media.documents...如果是以前版本:uri可能是这样: content://media/external/images/media/image%3A69983 别人总结Android4.4中获取资源路径问题 public

    94530

    Android大坑集锦

    一、 ImageView.setImageUri(Uri)显示不出图片 网上有这样各种解决方案: ****将targetSdkVersion给注释掉 targetSdkVersion和minSdkVersion...若依然出现这样问题,可尝试重启Android Studio,若问题依旧,那我也不知道了-_-#,可以试着修改一下abiFilters参数。...三、 DrawerLayout must be measured with MeasureSpec.EXACTLY 这个问题出现原因多是: 多个可滑动控件在同一个布局界面中嵌套使用,导致滑动冲突...大小,可以显示其内容 mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 六、 Android Studio...方法三:拔掉手机,重插并重启Android Studio。 若方法三不行,建议你去买彩票吧!中了五百万就可以不用苦逼地写代码了。

    1.2K40

    Android Studio无法执行Javamain方法问题及解决方法

    Android Studio升级到哦最新版3.6.1后,新建了个项目,发现无法执行Javamain方法。...解决方案: 方案一:暂时替代方案 Run “XXX.main()” with Coverage 方案二:修改.idea/gradle.xml文件 Android Studio使用gradle作为构建工具...根据配置字面意思理解,这个设置意思是不委托gradle进行构建。现实效果也是加了这行配置之后就是jvm执行Javamain方法了,而不是gradle当做task来执行了。...知识点补充,参考方法 Android Studio 3.0 无法运行Java代码main() 方法解决方案 Android Studio 升级到3.0 以后发现 运行Java 代码中main()方法时候...总结 到此这篇关于Android Studio无法执行Java main方法问题文章就介绍到这了,更多相关android studio无法执行java main方法内容请搜索ZaLou.Cn以前文章或继续浏览下面的相关文章希望大家以后多多支持

    3.3K10

    Android Studio 升级到3.0 提示 java.lang.NoClassDefFoundError解决方法

    一般出现这个错都是使用provided导致 例如,我旧配置如下: Project build.gradle文件: buildscript { dependencies { classpath...:android-apt:1.8' } } Module build.gradle文件: apply plugin: 'com.android.library' apply plugin: 'android-apt...android-apt android-apt是由一位开发者自己开发apt框架,源代码托管在这里,随着Android Gradle 插件 2.2 版本发布,Android Gradle 插件提供了名为...annotationProcessor 功能来完全代替 android-apt ,自此android-apt 作者在官网发表声明最新Android Gradle插件现在已经支持annotationProcessor...总结 以上所述是小编给大家介绍Android Studio 升级到3.0 提示 java.lang.NoClassDefFoundError,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家

    53420

    AndroidQ兼容性适配指南

    从后台启动 Activity 限制 创建高优先级通知 Android10中, 当App无前台显示Activity时,其启动Activity会被系统拦截, 导致启动无效。...binding.editDocumentBtn.setOnClickListener { editFileActivityResult.launch( // ACTION_OPEN_DOCUMENT...let { val uri = it //小米8 Android9 抛出java.lang.UnsupportedOperationException:...注意:从MediaStore接口中查询到DATA字段将在Android Q开始废弃,不应该利用它来访问文件或者判断文件是否存在;从 MediaStore接口或者SAF获取到文件Uri后,请利用Uri打开...这些APP 如果直接通过路径方式将文件保存到了外部存储上,例如外部存储根目录,那么APP被卸载后重新安装,新APP获得Filtered View视图,无法直接通过路径访问到旧数据,导致数据丢失。

    7.1K30

    【实操干货】创建一个用在图像内部进行对象检测Android应用程序

    步骤2:制作Android应用程序 1.如果尚未安装,请下载并安装Android Studio,如果是,请单击“是”以下载和安装SDK。...链接:https://developer.android.com/studio 2.打开Android Studio,然后单击:启动一个新Android Studio项目 3.选择清空活动 ?...10.我们需要列出模型输出类 转到app > java 在第一个文件夹中,将新Java类名称命名为ModelClasses。...android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.net.Uri...(为此,您需要启用USB调试(http://developer.android.com/studio/run/emulator))。 运行应用程序后,它外观应类似于页面顶部GIF。

    1.2K10

    Android Studio开发实战 从零基础到App上线》本书内容问题答疑

    回答:最新android studio已经集成了draw9patch.bat功能,所以sdk就去掉了该文件。...6、关于第4章和第5章购物车商品图片在部分手机上无法显示问题 问题:为什么第四章购物车显示不了商品图片? 回答:这是Android7.0默认不分配sd卡存储权限导致。...回答:Android7.0目前发现主要有三个地方影响到本书源码,介绍如下: 1)部分手机上无法正常显示购物车图片,这是Android7.0默认不分配sd卡存储权限导致。...解决办法参见上一点说明“关于第4章和第5章购物车商品图片在部分手机上无法显示问题”。 2)Android7.0能拍照但不能保存,这是因为Android7.0默认禁止访问sd卡导致。...回答:打包时出现选项V1和V2,这是Android Studio2.3之后新增功能,本书基于Android Studio2.2,当时还没有V1和V2。

    1.2K30

    Android 渗透测试学习手册 第三章 Android 应用逆向和审计

    .dex文件是由 Java 字节码转换 Dalvik 字节码,使其对移动平台优化和高效。 这个免费工具只是将 Android 应用程序中存在.dex文件转换为相应.jar文件。...在右侧窗格中,我们可以看到 Java 应用程序 Java 源代码和所有方法。 请注意,重新编译过程会为你提供原始 Java 源代码近似版本。...我们可以从官方下载链接http://www.virtuous-ten-studio.com/下载 VTS。...内容提供者 URI 命名标准惯例是以content://开始。 如果 Android API 版本低于 17,则内容供应器默认属性是始终导出。...不受信任输入通常会导致应用程序中其他安全风险,如客户端注入。

    1.1K10

    【错误记录】Android Studio 4.2.1 编译报错 ( 设置支持 Java 和 Kotlin 版本 | java.lang.BootstrapMethodError )

    文章目录 一、报错信息 二、解决方案 一、报错信息 ---- 更新了 Android Studio 到 4.2.1 , 打开之前老项目 , 部分界面是由 Kotlin 开发 , 进入 Kotlin...开发界面报错 , 进入 Java 开发界面正常 ; 此外 , Kotlin 升级到了 1.5.0 ; Android Studio 4.2.1 编译报错 , 凡是调用到 Kotlin Activity...界面 , 都爆如下异常 ; Java 代码 Activity 正常运行 ; 2021-06-02 15:10:31.521 32223-32223/com.example.demo E/AndroidRuntime...:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 二、解决方案 ---- 创建一个最新应用..., 查看具体配置与 老项目的 配置区别 : plugins { id 'com.android.application' id 'kotlin-android' } android

    69410

    Android 存储概览

    存储区 Android 一开始就将存储区分为内部存储和外部存储,对应手机自带存储和可插拔 sd 卡(可类比于 PC 硬盘和 U盘)。...sd 卡大容量手机,应该会打印出如下信息: /storage/emulated/0/Android/data/packname/files/mounted /storage/B3E4-1711/Android...除访问自己媒体文件外,访问其它应用媒体文件需要权限——在 Android 11(API 30)或更高版本中,需要 READ_EXTERNAL_STORAGE;在 Android 10(API 29)...使用存储访问框架涉及以下步骤: 应用调用包含存储相关操作 intent(ACTION_CREATE_DOCUMENT保存文件;ACTION_OPEN_DOCUMENT打开文件;ACTION_OPEN_DOCUMENT_TREE...用户看到一个系统选择器,供其浏览文档提供器并选择将执行存储相关操作位置或文档。 应用获得对代表用户所选位置或文档 URI 读写访问权限。利用该 URI,应用可以在选择位置执行操作。

    8510

    使用 Android Studio 检测内存泄漏与解决内存泄漏问题

    Studio后,Android Studio凭借着自己良好内存优化,酷炫UI主题,强大自动补全提示以及Gradle编译支持正逐步取代Eclipse,成为主流Android开发IDE。...Android Studio在为我们提供了良好编码体验同时,也提供了许多对App性能分析工具,让开发者可以更方便分析App性能。...到最后,部分没有直接或者间接引用到GC Roots就是需要回收垃圾,会被GC回收掉。而内存泄漏出现原因就是存在了无效引用,导致本来需要被GC对象没有被回收掉。...内存泄漏检测 打开Android Studio,编译代码,在模拟器或者真机上运行App,然后点击 ,在Android Monitor下点击Monitor对应Tab,进入如下界面  在Memory...一栏中,可以观察不同时间App内存动态使用情况,点击 可以手动触发GC,点击 可以进入HPROF Viewer界面,查看JavaHeap,如下图 Reference Tree代表指向该实例引用,

    1.6K70
    领券