Мне нужно получить 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
return 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" />
и добавил разрешения времени выполнения для камеры и хранилища.
Iтакже добавили 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();
}
}
}
поэтому он создаст каталог, если не будет существовать, но это не помогло мне.
поэтому я публикую это здесь, может быть, я что-то упускаю, и кто-то может мне помочь.