相机在 Nougat 7.0 中无法工作

2024-01-08

我的相机代码适用于所有 Android 版本,但在 Nougat 7.0 中出现以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference

它在除 Android 7.0 之外的所有其他 Android 版本上都能完美运行。我已授予相机和图库的运行时权限,但相机仍然无法工作。这是相关代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == RESULT_OK) {
        if(requestCode == Constants.CROPPED_PIC_REQUEST_CODE){
            CropImage.ActivityResult result = (CropImage.ActivityResult) data.getExtras().get(CropImage.CROP_IMAGE_EXTRA_RESULT);
            Uri selectedImageUri = result == null ? null : result.getUri();
            Bitmap bitmap = null;
            Log.d("SetUpProfile","Uri cropped is "+outputFileUri);
            bitmap = getBitmap(selectedImageUri);
    //                    bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri);
            circleImageView.setImageBitmap(bitmap);
            finalBitmap = bitmap;
        }
        else if (requestCode == Constants.YOUR_SELECT_PICTURE_REQUEST_CODE) {
            final boolean isCamera;
            if (data == null) {
                isCamera = true;
            } else {
                final String action = data.getAction();
                if (action == null) {
                    isCamera = false;
                } else {
                    isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                }
            }

            Uri selectedImageUri;
            if (isCamera) {
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
                String value = prefs.getString("path", "error");
                selectedImageUri = Uri.parse(value);
            } else {
                selectedImageUri = data == null ? null : data.getData();
            }

            Intent i = new Intent(Five.this,CropImageActivity.class);
            i.putExtra("ImageURI", selectedImageUri.toString());
            startActivityForResult(i,Constants.CROPPED_PIC_REQUEST_CODE);

        }
    }
}

这是我的日志猫:-

FATAL EXCEPTION: main
Process: com.sancsvision.wayndr, PID: 31570
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=11, result=-1, data=Intent {  }} to activity {com.sancsvision.wayndr/com.sancsvision.wayndr.Five}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference                     
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4053)              
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4096)        
    at android.app.ActivityThread.-wrap20(ActivityThread.java)                      
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1516)         
    at android.os.Handler.dispatchMessage(Handler.java:102)                     
    at android.os.Looper.loop(Looper.java:154)                      
    at android.app.ActivityThread.main(ActivityThread.java:6077)                        
    at java.lang.reflect.Method.invoke(Native Method)                       
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)      
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)                                                     
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference
    at com.sancsvision.wayndr.Five.onActivityResult(Five.java:259)
    at android.app.Activity.dispatchActivityResult(Activity.java:6917)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4049)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4096) 
    at android.app.ActivityThread.-wrap20(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1516) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

尝试一下,一旦你拍照并保存到 SD 卡,并且在 Nougat 中取回 URI 时,这并不是造成问题的意图......

在您的应用程序上实现 FileProvider 非常容易。首先,您需要在 AndroidManifest.xml 的标签下添加 FileProvider 标签,如下所示:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    <application
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>
    </application>
</manifest>

然后在res文件夹下的xml文件夹中创建provider_paths.xml文件。如果文件夹不存在,则可能需要创建。

res/xml/provider_paths.xml

 <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="external_files" path="."/>
    </paths>

完毕! FileProvider 现已声明并可供使用。

最后一步是更改 MainActivity.java 中的以下代码行

 Uri photoURI = Uri.fromFile(createImageFile());

to

Uri photoURI = FileProvider.getUriForFile(MainActivity.this,
        BuildConfig.APPLICATION_ID + ".provider",
        createImageFile());

并做了 !您的应用程序现在应该可以在任何 Android 版本(包括 Android Nougat)上完美运行。干杯!

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

相机在 Nougat 7.0 中无法工作 的相关文章

随机推荐

  • 通过适配器描述更改Mac地址

    我正在使用 Nate True 提供的优秀工具http devices natetrue com macshift http devices natetrue com macshift 它通过适配器名称更改 Mac 地址 这是源代码 con
  • 将 numpy.matrix 转换为 C 双指针的正确方法

    获取 numpy 矩阵作为采用双指针的 C 函数的参数的规范方法是什么 Context 我在用着numpy为了验证一些 C 代码 我有一个 C 函数 它需要一个const double const 我正在使用ctypes打电话给 so来自P
  • 我应该如何根据野田时间填充 IANA/奥尔森时区列表?

    我在应用程序中使用 NodaTime 我需要用户从下拉列表中选择他们的时区 我有以下软要求 1 该列表仅包含对当前和不久的将来真实地点合理有效的选择 历史的 晦涩的和通用的时区应该被过滤掉 2 该列表应首先按 UTC 偏移量排序 然后按时区
  • 操作不同数组(对象数组)索引时是否需要同步

    在 Java 的上下文中 我有这样的代码 MyObject array 在不同的线程中我有这样的代码 array i new MyObject val 如果我确保每个线程都使用不同的 值 i 那么我需要同步上述语句来处理竞争条件吗 仅当两个
  • 在不规则网格上进行插值

    所以 我有三个 numpy 数组 它们在网格上存储纬度 经度和一些属性值 也就是说 我有 LAT y x LON y x 和温度 T y x 对于 x 和 y 的某些限制 网格不一定是规则的 事实上 它是三极的 然后 我想将这些属性 温度
  • pm2 commad 总是卡在 [PM2] Spawning PM2 daemon with pm2_home=/home/$USER/.pm2

    我一直在关注这个问题 https github com Unitech pm2 issues 2799到现在我的问题还没有解决 有人可以帮忙吗 pm2的任何命令总是返回 PM2 Spawning PM2 daemon with pm2 ho
  • 在 Jackson ObjectMapper 上序列化时禁用 Base64 编码

    我在用Jackson 2 2 3 当我将一个对象序列化为 JSON 时 所有byte 属性被编码为base64在生成的 json 中 我如何禁用它 这是我的代码 数据持有者 java XmlAccessorType XmlAccessTyp
  • 带有可选参数并且没有尾部斜杠的应用程序状态

    state tabs map url map location id params location id value 1 views map tab templateUrl templates map html controller Ma
  • 使用数组引用名称属性

    我正在开发一个项目 需要我根据数组中位置的值选择工作表 我已填充desArr 字符串类型 带有值和desArr 0 包含我要引用的工作表的名称 为了避免用户更改选项卡名称并弄乱代码的问题 我尝试引用工作表的 CodeName 通常 我可以这
  • 如何对齐此列表中的每个单词?

    我的文件中有一个列表列表 aaaaa bbb ccccccccc aaaaa bbbbbb cccccc aaa bbb ccccccccc aaaaa bbb ccccccccc aaaaa bbbbbb cccccc aaa bbb c
  • 如何在 Node js 中访问 Laravel 环境变量?

    我试图在我的 socket io 服务器安装中访问 laravel 的 APP KEY 环境变量 但不知道如何访问任何 laravel 环境变量 任何帮助表示赞赏 检查此包中是否有 node jsdotenv https www npmjs
  • 找不到目标实体“某个实体”

    我正在使用 ZF2 与原则我收到此错误 在 Subject Entity Subject user 中找不到目标实体 Entity User 这是我的代码片段
  • 将 Maven 项目的依赖项复制到特定文件夹

    我试图在特定文件夹中获取 Maven 项目所需的所有 jar 我用过mvn dependency copy dependencies命令 它给了我里面需要的jar文件taget dependeny folder 虽然我可以使用 move 或
  • 将异常写入 Windows 日志文件

    我想捕获异常并将其记录在 Windows 日志文件中 如何打开并写入 Windows 日志 您可以使用系统 诊断 EventLog WriteEntry http msdn microsoft com en us library syste
  • 如何在OpenCV中检测已知物体?

    我尝试在窗口中实时绘制形状 屏幕上的形状如缠结 矩形 圆形 半圆形和 Z 使用黄色 尺寸和形状可能与原始图像不同 但程序知道所有原始形状 因为它们是预定义的 我想知道如何识别正确的形状 举个例子 有可能做到这一点的方法吗 我可以为此使用模板
  • 通过在 XSLT 中硬编码节点值来对节点进行分组

  • sass 的 webpack 实时热重载

    我正在为 React Starter 构建一个工作流程 并且希望在更改我的 scss 文件时自动重新加载我的浏览器 目前 当我在 index js 文件 设置为入口点 中进行更改时 webpack 将热重载 但是 当我在 scss 文件中更
  • 下载并缓存 UITableViewCell 中的图像

    注意 请勿使用图书馆 这对我来说很重要 值得学习 此外 关于这个问题有各种各样的答案 但我发现没有一个很好地解决了这个问题 请不要标记为重复 提前致谢 我遇到的问题是 如果您在表格中滚动得非常快 您会看到旧图像并闪烁 我读到的问题的解决方案
  • 将值插入到空的 multidim 中。 numpy 数组 [重复]

    这个问题在这里已经有答案了 我需要创建一个形状的空 numpy 数组 10 10 3 意味着我不知道将插入多少个元素 然后我有很多形状的 numpy 数组 1 10 10 3 我想将其一一插入到准备好的数组中 所以 标记将随着插入的元素而增
  • 相机在 Nougat 7.0 中无法工作

    我的相机代码适用于所有 Android 版本 但在 Nougat 7 0 中出现以下错误 java lang NullPointerException Attempt to invoke virtual method java lang S