【发布时间】:2018-12-24 12:21:40
【问题描述】:
我需要从图像位图中获取uri所以我使用这个方法来获取uri
public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
fixMediaDir();
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
但 MediaStore.Images.Media.insertImage 在某些设备中返回 null
注意:我已向清单添加权限
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
并为相机和存储添加了运行时权限。
我还在清单中添加了FileProvider:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mvc.imagepicker.provider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"
tools:replace="android:resource"/>
</provider>
注意,提供者的权限是 "com.mvc.imagepicker.provider",因为我使用 Mariovc/ImagePicker 并使用与他相同的权限。
我在其他帖子中看到,有人提到在调用之前添加此代码
MediaStore.Images.Media.insertImage
public void fixMediaDir() {
File sdcard = Environment.getExternalStorageDirectory();
Log.d("a111", "sdcard: "+sdcard);
if (sdcard != null) {
File mediaDir = new File(sdcard, "DCIM/Camera");
if (!mediaDir.exists()) {
mediaDir.mkdirs();
}
}
}
所以如果不存在,它会创建一个目录,但它没有帮助我。
所以我在这里发布这个也许我错过了其他东西,有人可以帮助我。
【问题讨论】:
-
请使用
FileProvider。 -
我忘了提,但我在清单中添加了文件提供程序
-
好吧,那么也许使用
FileProvider,而不是insertImage()。 -
我正在使用 ImagePicker,它返回一个 bitmp 图像,我正在尝试从位图中获取 uri。但正如我所说,我从 getImageUri 方法中得到了一个异常。 @CommonsWare 你能告诉我如何使用 FileProvider 而不是 insertImage 来获取图像 uri 吗?
-
将位图写入文件。使用
FileProvider提供文件。使用FileProvider.getUriForFile()将Uri交给其他应用程序。