尝试从字符串路径解析 Uri 时为 Null

2023-11-30

我正在用这个FileUtils类来处理Uri:

public class FileUtils {
private FileUtils() {
}

private static final String TAG = "FileUtils";
private static final boolean DEBUG = false;

private static boolean isExternalStorageDocument(Uri uri) {
    return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

private static boolean isDownloadsDocument(Uri uri) {
    return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

private static boolean isMediaDocument(Uri uri) {
    return "com.android.providers.media.documents".equals(uri.getAuthority());
}


private static boolean isGooglePhotosUri(Uri uri) {
    return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}

private static String getDataColumn(Context context, Uri uri, String selection,
                                    String[] selectionArgs) {

    Cursor cursor = null;
    final String column = "_data";
    final String[] projection = {
            column
    };

    try {
        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                null);
        if (cursor != null && cursor.moveToFirst()) {
            if (DEBUG)
                DatabaseUtils.dumpCursor(cursor);

            final int column_index = cursor.getColumnIndexOrThrow(column);
            return cursor.getString(column_index);
        }
    } finally {
        if (cursor != null)
            cursor.close();
    }
    return null;
}

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public static String getPath(final Context context, final Uri uri) {

    if (DEBUG)
        Log.d(TAG + " File -",
                "Authority: " + uri.getAuthority() +
                        ", Fragment: " + uri.getFragment() +
                        ", Port: " + uri.getPort() +
                        ", Query: " + uri.getQuery() +
                        ", Scheme: " + uri.getScheme() +
                        ", Host: " + uri.getHost() +
                        ", Segments: " + uri.getPathSegments().toString()
        );

    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

    // DocumentProvider
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
        if (isExternalStorageDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            if ("primary".equalsIgnoreCase(type)) {
                return Environment.getExternalStorageDirectory() + "/" + split[1];
            }

        }
        // DownloadsProvider
        else if (isDownloadsDocument(uri)) {

            final String id = DocumentsContract.getDocumentId(uri);
            final Uri contentUri = ContentUris.withAppendedId(
                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

            return getDataColumn(context, contentUri, null, null);
        }
        // MediaProvider
        else if (isMediaDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            Uri contentUri = null;
            if ("image".equals(type)) {
                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }

            final String selection = "_id=?";
            final String[] selectionArgs = new String[]{
                    split[1]
            };

            return getDataColumn(context, contentUri, selection, selectionArgs);
        }
    }
    // MediaStore (and general)
    else if ("content".equalsIgnoreCase(uri.getScheme())) {

        // Return the remote address
        if (isGooglePhotosUri(uri))
            return uri.getLastPathSegment();

        return getDataColumn(context, uri, null, null);
    }
    // File
    else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }

    return null;
}

我把它称为我的MainActivity, 里面onActivityResult,从设备中选择视频后:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == SELECT_VIDEO_REQUEST && resultCode == RESULT_OK) {

        if (Build.VERSION.SDK_INT >= 19) {
            
            //Calling FileUtils class
            String sourcePath = FileUtils.getPath(getApplicationContext(), data.getData());
          
            Intent intent = new Intent();
            intent.setClass(MainActivity.this, PlayerActivity.class);
            intent.putExtra("videoUri", sourcePath);
            startActivity(intent);

        } else {
            //Not relevant to the question
            .......

        }
    }
    if (requestCode == SELECT_VIDEO_REQUEST && resultCode != RESULT_OK) {
        Toast.makeText(getApplicationContext(), "Failed to select video", Toast.LENGTH_LONG).show();
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }


}

In my PlayerActivity我得到了String并尝试解析Uri, 像这样:

//Getting String from Intent
mStringFilePath = getIntent().getStringExtra("videoUri");
//Parse Uri from String
mVideoUri = Uri.parse(mStringFilePath);

在我的设备上测试时,没有任何问题。我得到了正确的路径和Uri.parse工作正常。但我在我的 Crashlytics 上看到很多崩溃说 -nullpointerexception at line 59,指的是mVideoUri = Uri.parse(mStringFilePath);

我究竟做错了什么?为什么它在我的设备上运行,而在其他一些设备上返回 null?

Edit 1

我忘了添加<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />在我的清单中。我现在至少没有得到nullpointerexception,但我得到以下信息 -

java.io.FileNotFoundException: Not found (No such file or directory)

不知何故Uri当我从 SD 卡中选择文件时出现错误,有什么原因吗?


崩溃可能是由于 null String onmStringFilePath = getIntent().getStringExtra("videoUri"); since getIntent().getStringExtras()如果请求的 Extras 没有值,则不会抛出 nullpointerException,但也不会向分配的变量提供数据(即最终结果)mStringFilePath将为 null 来解决此问题,请确保 uri 解析的给定字符串包含在:

if(mStringFilePath != null){ mVideoUri = Uri.parse(mStringFilePath); }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试从字符串路径解析 Uri 时为 Null 的相关文章

  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 没有用于警告的设置器/字段 Firebase 数据库检索数据填充列表视图

    我只是想将 Firebase 数据库中的数据填充到我的列表视图中 日志显示正在检索数据 但适配器不会将值设置为列表中单个列表项中的文本 它只说 没有二传手 场地插入值 这让我觉得我的设置器没有正确制作 但 Android Studio 自动
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 在 Android 应用程序资源中使用 JSON 文件

    假设我的应用程序的原始资源文件夹中有一个包含 JSON 内容的文件 我如何将其读入应用程序 以便我可以解析 JSON See 开放原始资源 http developer android com reference android conte
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • UITextView 不调用 ShouldChangeTextInRange

    我使用自定义 UITextView 并需要在返回单击时隐藏键盘 我需要捕获具有文本视图的 ShouldChangeTextInRange 我不知道为什么 但是 方法未被调用 这是我的文本视图的代码 public class Placehol
  • 在 Android 中启用当前禁用的 Spinner

    我在 Android 上闲逛 而我的 Java 知识充其量是有限的 例如 我对它允许内联类这一事实感到困惑 我的问题如下 我有一个布局 其中有三个下拉菜单 我在 onCreate 中初始化了所有三个 第一个从字符串数组中获取值 然而 第二个
  • R - 使用 ggplot2 和栅格包的地理参考栅格图像的原始颜色

    我想使用原来的colortable of a gt gt 地理参考光栅图像 tif 文件 作为彩色比例在 ggplot ggplot2 绘制的地图中 由于找不到更简单的解决方案 我访问了colortable 槽从legend 加载的光栅图像
  • 使用Boost读写XML文件

    有没有什么好的方法 也是一个简单的方法 使用Boost来读写XML文件 我似乎找不到任何使用 Boost 读取 XML 文件的简单示例 您能给我指一个使用 Boost 读写 XML 文件的简单示例吗 如果不是 Boost 有什么好的 简单的
  • array_intersect 多维数组内部

    我有一个多维数组 可以根据用户输入增加 我想在数组内执行 array intersect 以获得键之间的公共值 就像例子 Array php gt Array 0 gt 36 1 gt 51 2 gt 116 3 gt 171 4 gt 2
  • 报告公式中的小数点四舍五入

    我的水晶报表需要将数字四舍五入到小数点后两位 我努力了Round 55 815 2 但它返回55 81代替55 82 我该如何解决这个问题 如果出于显示目的需要对小数进行四舍五入 只需使用 减少小数 图标即可
  • 列出Android设备上的所有图像

    我试图列出自 14 小时以来 Android 设备中的所有图像及其路径 但我无法 它一直给我 java lang RuntimeException 无法启动活动 ComponentInfo 错误 我不明白为什么 有什么帮助吗 package
  • tolower() 不工作

    下面的代码片段用于将字符串转换为小写 int main unsigned char s AbS d tolower s printf s n s return 0 我正在得到output as AbS d 为什么字符串没有被转换 tolow
  • 在 MATLAB 中扫描每一列,无需 for 循环

    I 2 1 A 7 11 8 17 我怎样才能在 A 中选择正确的值而不for loop I是每列的索引向量A 那是I 1 is 8 and I 2 11 Use sub2ind根据正确的行和列坐标生成线性索引 然后使用它们进行索引A 在这
  • 如何提取 git 子目录并从中创建子模块?

    几个月前我开始了一个项目 并将所有内容存储在主目录中 在我的主目录 Project 中 有几个包含不同内容的子目录 项目 论文包含用 LaTeX 编写的文档 Project sourcecode RailsApp 包含我的 Rails 应用
  • 从原点拉取时“git pull”命令之间的差异?

    这些命令之间有什么区别 1 git pull 2 git pull origin 3 git pull origin master 4 git pull origin master 5 git pull origin HEAD master
  • 在 Outlook 插件中,如何检查我们是否处于撰写模式或阅读模式?

    我正在创建一个 Outlook 加载项并在 React 应用程序中使用 OfficeJS API 在那里 我想加载一组特定的撰写模式功能和另一组阅读模式功能 所以我的问题是 如何查看我当前处于哪种模式 如果您不想为读取和撰写模式创建两个单独
  • Android改变Material高程阴影颜色

    是否可以更改 xml 高程属性产生的阴影颜色 我希望通过代码动态改变阴影 我知道这个问题很老了 可能作者不再需要答案了 我会把它留在这里 以便其他人可以找到它 Lollipop 的高程系统不支持彩色阴影 但是 如果您需要彩色阴影 可以使用
  • C非阻塞键盘输入

    我正在尝试用 C 在 Linux 上 编写一个程序 该程序循环直到用户按下某个键 但不需要按键来继续每个循环 有没有一种简单的方法可以做到这一点 我想我可以用select 但这似乎需要很多工作 Alternatively is there
  • iPhone:Airplay SDK有什么用?

    有人可以解释一下什么是Airplay SDK 何时使用它 如何在程序中使用等详细信息 我希望它用于将视频从 iPhone 传输到电视 Thanks 隔空播放软件开发工具包实际上是一个针对iPhone Android Symbian的跨平台游
  • 如何将dict数据写入表格格式

    如何以下表输出格式写入以下数据 字典列表 data date datetime date 2011 2 8 user u xxx status u P date datetime date 2011 2 8 user u yyy statu
  • 从日期计算一年中的第几天

    我需要计算给定日期的天数 一年有 366 天 然而 每个月都有不同的值 我必须分配这些值 有没有比我现在的方法更快的方法 include
  • 如何让 Java 测试容器在 Docker 多阶段构建中工作?

    我有一个类似的问题使用 Maven 在 gitlab 中运行 Docker 测试容器 区别在于 我的脚本不是直接运行 mvn 而是运行 docker 多阶段构建 在 docker 映像内部运行测试 不幸的是 这似乎不适用于 PostgreS
  • 使用 LINQ 连接字符串

    写老派最有效的方法是什么 StringBuilder sb new StringBuilder if strings Count gt 0 foreach string s in strings sb Append s sb Remove
  • 尝试从字符串路径解析 Uri 时为 Null

    我正在用这个FileUtils类来处理Uri public class FileUtils private FileUtils private static final String TAG FileUtils private static