Android getUriForFile获取Uri路径NullPointerException

时间:2025-01-26 12:57:47

Android7.0之后,之前相机拍照除了清单文件里的:

 <uses-permission android:name=""/>

依旧动态申请权限之外,正常运行工程点击拍照时,Uri路径突然就报了

 

我是运用下面方法获取uri

  public static Uri getUriForFile(@NonNull Context context, @NonNull String authority,
            @NonNull File file) {
        final PathStrategy strategy = getPathStrategy(context, authority);
        return (file);
    }

原因:Android不再允许在app中把file://Uri暴露给其他app
解决办法:
注释:为工程名

1.调用该方法方式:

Uri contentUri = (getContext(),"",tempFile);

2.清单文件里加上:

 <!--File uri 路径-->
        <provider
            android:name="."
            android:authorities=""
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name=".FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

3.android:resource="@xml/provider_paths"其中的xml 为res文件夹下自己定义的文件夹名,类推provider_paths为文件名,内容为:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:andro>
    <external-path name="camera_photos" path="."/>
</paths>

做完这些时,再点击camera时,完美运行。
另外,做照片裁剪时,相关的api也要重新调整,把之前的((file), "image/*");换成((,"",new File(imagePath));, "image/*"),完整如下:

private void crop(String imagePath) {
        File file = new File((this) + "/" + ()+"cc" + ".png");
        cropImagePath = ();
        Uri photoURI = (,"",new File(imagePath));
       // Uri cropURI = (,"",file);

        Intent intent = new Intent("");
        (Intent.FLAG_GRANT_READ_URI_PERMISSION);
        (photoURI, "image/*");

        ("crop", "true");
        ("aspectX", );
        ("aspectY", );
        ("outputX", );
        ("outputY", );
        ("return-data", false);
        (MediaStore.EXTRA_OUTPUT, (file));
        startActivityForResult(intent, IMAGE_CROP_CODE);
    }

不知道是否适合所有机型。