无法在 Android 10 中从 Intent 打开文件

2024-01-04

我正在尝试从 Intent.ACTION_GET_CONTENT 访问文件,当我在我的设备(Android 8)上尝试它时,它工作得很好。但是,当我在朋友的设备(Android 10)上尝试它时,它不起作用。当我尝试从 Word 打开文件时,它一直显示“无法打开文件。请尝试将文件保存在设备上,然后打开它。”当我打开pdf文件时,它不显示任何内容,只是黑屏。

btn_add OnClick 监听器

        btn_add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String[] mimeTypes = {"application/vnd.google-apps.document", "application/pdf", "application/vnd.google-apps.form",
                    "application/vnd.google-apps.presentation", "application/vnd.google-apps.spreadsheet",
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                    "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                    "application/x-excel"};
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "*/*");
                if (mimeTypes.length > 0) {
                    intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
                }
            } else {
                String mimeTypesStr = "";

                for (String mimeType : mimeTypes) {
                    mimeTypesStr += mimeType + "|";
                }
                intent.setType(mimeTypesStr.substring(0, mimeTypesStr.length() - 1));
            }                startActivityForResult(intent, 100);
        }
    });

活动结果

                titleArrays = new ArrayList<>();
                ItemAdapter adapter = new ItemAdapter(titleArrays);
                RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
                recyclerView.setLayoutManager(layoutManager);
                recyclerView.setAdapter(adapter);
                Log.d("Id: ", ""+id);

                hashMap.put(id, data.getData());
                returnCursor =
                        getContentResolver().query(data.getData(), null, null, null, null);
                nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
                returnCursor.moveToFirst();
                titleHashmap.put(id, returnCursor.getString(nameIndex));
                for (int i : hashMap.keySet()){
                    titleArrays.add(new ItemProperty(hashMap.get(i), titleHashmap.get(i)));
                }
                img_file.setImageResource(0);

                id++;
                // Item OnClick
                adapter.setOnItemClickListener(new ItemAdapter.OnItemClickListener() {
                    @Override
                    public void onItemClick(int position) {
                        Log.d("Position: ", ""+position);
                        Intent intent = new Intent(Intent.ACTION_VIEW, titleArrays.get(position).getUri());
                        startActivity(intent);
                    }
                });

我想知道我做错了什么。如果大家知道的话请告诉我。谢谢!


所以,我最终通过以下方式解决了这个问题通用软件 https://stackoverflow.com/users/115145/commonsware操作说明!我添加了Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION to my Action_VIEW Intent并改变了我的ACTION_GET_CONTENT to ACTION_OPEN_DOCUMENT

btn_add OnClick 监听器

    String[] mimeTypes = {"application/vnd.google-apps.document", "application/pdf", "application/vnd.google-apps.form",
                    "application/vnd.google-apps.presentation", "application/vnd.google-apps.spreadsheet",
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                    "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                    "application/x-excel"};
            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "*/*");
                if (mimeTypes.length > 0) {
                    intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
                }
            } else {
                String mimeTypesStr = "";

                for (String mimeType : mimeTypes) {
                    mimeTypesStr += mimeType + "|";
                }
                intent.setType(mimeTypesStr.substring(0, mimeTypesStr.length() - 1));
            }
            startActivityForResult(intent, 100);

活动结果

if (resultCode == RESULT_OK) {
                titleArrays = new ArrayList<>();
                ItemAdapter adapter = new ItemAdapter(titleArrays);
                RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
                recyclerView.setLayoutManager(layoutManager);
                recyclerView.setAdapter(adapter);
                Log.d("Id: ", ""+id);

                hashMap.put(id, data.getData());
                returnCursor =
                        getContentResolver().query(data.getData(), null, null, null, null);
                nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
                returnCursor.moveToFirst();
                titleHashmap.put(id, returnCursor.getString(nameIndex));
                for (int i : hashMap.keySet()){
                    titleArrays.add(new ItemProperty(hashMap.get(i), titleHashmap.get(i)));
                }
                img_file.setImageResource(0);

                id++;
                // Item OnClick
                adapter.setOnItemClickListener(new ItemAdapter.OnItemClickListener() {
                    @Override
                    public void onItemClick(int position) {
                        Log.d("Position: ", ""+position);
                        Intent intent = new Intent(Intent.ACTION_VIEW, titleArrays.get(position).getUri());
                        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                        startActivity(intent);
                    }
                });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 Android 10 中从 Intent 打开文件 的相关文章

  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • 如何在 Spring 中使 @PropertyResource 优先于任何其他 application.properties ?

    我正在尝试在类路径之外添加外部配置属性资源 它应该覆盖任何现有的属性 但以下方法不起作用 SpringBootApplication PropertySource d app properties public class MyClass
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • Android应用主题更换流畅

    我正在开发一个提供白天和夜间主题的项目 我正在更改主题 夜间主题 AppCompatDelegate setDefaultNightMode AppCompatDelegate MODE NIGHT YES 日主题 AppCompatDel
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • Android 为什么这不会抛出错误的线程异常?

    我的印象是视图只能从主线程操作 但是 为什么这不会崩溃 public class MainActivity extends Activity TextView tv Override protected void onCreate Bund
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • Android Studio代理设置构建错误

    每当我尝试在 Android Studio 中构建应用程序时 都会收到以下错误 Error 169 254 16 169 254 16 Will ignore proxy settings for these hosts 我收到错误 5 次
  • 以编程方式向 LinearLayout 添加边框

    我该如何添加以编程方式LinearLayout 的边框 假设我们创建了这个布局 LinearLayout TitleLayout new LinearLayout getApplicationContext TitleLayout setO
  • React Native HTTPS Api 调用在 IOS 中有效,但在 Android 中无效

    所以基本上我所做的就是简单地对启用了 HTTPS 的 UAT 服务器进行简单的 Axios 调用 我已经在 IOS 中测试了整个应用程序 API 调用工作正常 但一旦我在 Android 中测试了相同的应用程序 在真正的 Android 设
  • 部署 .war 时出现 Glassfish 服务器错误:部署期间发生错误:准备应用程序时出现异常:资源无效

    我正在使用以下内容 NetBeans IDE 7 3 内部版本 201306052037 爪哇 1 7 0 17 Java HotSpot TM 64 位服务器虚拟机 23 7 b01 NetBeans 集成 GlassFish Serve
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • 在线性布局内的 ScrollView 内并排对齐 TextView

    我有一个带有滚动视图的线性布局 我想保留它的当前格式 但只需将 textView2a 和 textView3a 并排放置 而不会破坏我当前的布局格式 我已经包含了我最近的尝试 但它们似乎不正确 提前致谢 Java菜鸟 当前有效的 XML
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐

  • Dafny 没有条件可以触发谓词

    我有以下用于 tic tac toe 游戏的 Dafny 代码片段 用于检查玩家 1 是否在棋盘上有获胜行 predicate isWinRowForPlayer1 board array2
  • 为什么我不能在 Groovy 脚本中的 @Grab 声明之后执行方法调用?

    我正在尝试构建一个 DSL 并使用 Global AST Transform 来完成它 该脚本正在编译groovyc很好 但我希望能够让用户使用 Grab Grape 来提取 JAR 并让它作为常规脚本立即执行 然后我发现我无法正确执行此操
  • 将字符串转换为长度为 1 的列表

    我创建了一个需要列表才能正常工作的方法 但是 您可以发送列表或简单的字符串 我想将该字符串转换为包含整个字符串作为元素的列表 例如 如果我有 I am a string 我想将其转换为 I am a string 我能够这样做 I am a
  • 使用准备好的语句进行选择查询时出现 SQL 异常

    StringBuilder sqlQry new StringBuilder sqlQry append SELECT LIB PATH append FROM OBJ append INNER JOIN SRC ON SRC MBR OB
  • JavaScript 闭包如何工作?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 您如何向了解 JavaScript 闭包所包含的概念 例如函数 变量等 但不了解闭包本身
  • R 中的按行排序

    我想知道如何使用 R 在 csv 中进行按行排序 这是我拥有的以下数据 Name English Math French John 56 78 86 Sam 79 97 86 Viru 93 44 34 我想对上述数据集执行按行排序 就像下
  • 如何在 xslt 中包含 javaScript 文件

    如何在 xslt 文件中包含 导入 javaScript 文件 库 如果你需要在转换中使用javascript 例如 它包含一组在转换中调用的扩展函数 您需要使用适当的扩展元素 例如
  • “使用未经检查或不安全的操作”[重复]

    这个问题在这里已经有答案了 为什么每次编译时都会出现 使用未经检查或不安全的操作 错误 代码有什么问题吗 我从本教程复制了完全相同的代码http www mkyong com java json simple example read an
  • 如何获取matplotlib树图中形状的坐标?

    我有工作树形图 我需要获取此树形图每个形状的坐标 例如之后将它们放入 GeoJSON 中 有没有任何函数可以帮助我解决这个问题 或者我将从这个树状图的 svg 版本中获取所有坐标 With ax squarify plot ax patch
  • 无法将大型 html5 画布 POST 到服务器?

    我有一块画布 你可以在上面作画 我需要将其内容保存到服务器 以便稍后可以恢复 为了做到这一点 我xMLHttpReq send the encodeURIComponent canvasP toDataURL via a xMLHttpRe
  • 在 OpenCV C++ 中绘制一条穿过斑点的曲线

    我试图画一条穿过给定斑点的线 下面是一个给定的例子 我想要一条在水平方向上穿过多个斑点的曲线 如下所示 就如例子 import cv2 import numpy as np img cv2 imread image jpg gray cv2
  • 从 Microsoft Groove 音乐应用获取当前播放的曲目信息

    我想在我自己的应用程序中获取 Microsoft Groove 应用程序中当前播放曲目的曲目信息 我说的是 Groove APP 而不是 REST Api 我的第一个方法是尝试获得Windows Media Playback Backgro
  • R Leaflet:将多个组分配给一个图层以过滤数据并更改表示的列

    我试图在 R 传单中找到一种方法来包含覆盖按钮 该按钮可以过滤掉数据中的组 我还需要包括单选按钮 用于切换数据中表示的列 我似乎无法找到使用 addLayersControl 函数在 R 传单中执行此操作的方法 我最初认为可以将多个组添加到
  • KeyDown :识别多个键

    How can I determine in KeyDown that CtrlUp was pressed private void listView1 KeyDown object sender KeyEventArgs e if e
  • 如何通过unicode where条件选择数据?

    我想获取位于 TableAdapter 中的以下 SQL 语句的数据库 SELECT FROM Student WHERE Chinese Name Param C 调用的示例代码如下 GetDataByChinese Name 你好 但我
  • 使用 Net/http 以 JSON 格式发布 Ruby 数据

    我有这个红宝石文件 require net http require json require uri test data newAcctJson type Credit Card nickname MoreTesting rewards
  • Material2 自动完成的值不显示

    我试图让自动完成功能显示对象的一个 参数 但保存另一个参数 到目前为止它似乎没有表现出来 代码来自 Material2 Autocomplete 网站 自动完成 https material angular io components co
  • 使用@Profile决定执行测试类

    根据https stackoverflow com a 33042872 4106030 https stackoverflow com a 33042872 4106030我们不应该使用 Profile让 spring 配置文件决定是否执
  • 当数据为 POSIXct 时,ggplotly() 不显示 geom_vline / geom_hline

    我正在尝试制作带有 时间标记 的图表 这些时间标记是某些日期的垂直线 时间数据为 POSIXct 格式 我想使用 Plotly 出色的交互界面并在其中使用我的 ggplot 对象 问题是使用 ggplotly 后这些 时间标记 不会显示 我
  • 无法在 Android 10 中从 Intent 打开文件

    我正在尝试从 Intent ACTION GET CONTENT 访问文件 当我在我的设备 Android 8 上尝试它时 它工作得很好 但是 当我在朋友的设备 Android 10 上尝试它时 它不起作用 当我尝试从 Word 打开文件时