所以我使用 Android Crop 库 ( https://github.com/jdamcd/android-crop ) 允许用户拍照然后裁剪它。
我需要创建两个文件:一个包含来自相机的原始图像,另一个包含裁剪后的图像。为此,我定义了两个文件和两个 URI,然后将它们传递到 Android Crop 库中:
// Camera file.
Calendar calendar = Calendar.getInstance();
cameraCaptureFile = new File(getExternalCacheDir(), "camera-capture-" + calendar.getTime().getTime() + ".tmp");
cameraCaptureUri = FileProvider.getUriForFile(this, getPackageName() + ".provider", cameraCaptureFile);
grantUriPermission(getPackageName(), cameraCaptureUri, FLAG_GRANT_WRITE_URI_PERMISSION & FLAG_GRANT_READ_URI_PERMISSION);
// Cropped file.
croppedFile = new File(getExternalCacheDir(), "cropped.png");
croppedFileUri = FileProvider.getUriForFile(this, getPackageName() + ".provider", croppedFile);
grantUriPermission(getPackageName(), croppedFileUri, FLAG_GRANT_WRITE_URI_PERMISSION & FLAG_GRANT_READ_URI_PERMISSION);
// Start cropping library.
Crop.of(cameraCaptureUri, croppedFileUri)
// Cropping complete lets get our cropped file.
File croppedPng = new File(croppedFileUri.getPath());
问题是croppedPng.exists() 总是返回false;但是,当我进入设备存储浏览器并导航到 Android/data/com.mycompany/cache 时,原始文件和裁剪文件都按预期存在。
我不太确定该怎么做,因为我的应用程序能够创建这两个文件,但它无法读取它们?没有意义。
只是为了完成这里是我与此问题相关的其他配置:
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>
AndroidManifest.xml
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mycompany.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>