#java #android
#java #Android
Вопрос:
Эта проблема возникает в Android 6.0.1, но не в Android 7.0. У меня есть этот класс FileKit для съемки с помощью камеры, и у него есть метод uriToBitmap()
, который превращает Uri в Bitmap. taken_photo_uri
сохраняет uri сделанной фотографии.
class FileKit{
public static Uri taken_photo_uri = null;
public static void takePhoto(RootActivity activity) {
open_camera_activity = activity;
if (ContextCompat.checkSelfPermission(MyApplicaiton.getContext(),
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
activity.setPermissionRequestInterface(getContext());
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQ_READ_PHOTO);
} else {
File output_image = new File(MyApplicaiton.getContext().getExternalCacheDir(), "output_image.jpg");
try {
if (output_image.exists()) {
output_image.delete();
}
output_image.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 24) {
taken_photo_uri = FileProvider.getUriForFile(MyApplicaiton.getContext(),
activity.getResources().getString(R.string.main_package),
output_image);
} else {
taken_photo_uri = Uri.fromFile(output_image);
}
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, taken_photo_uri);
activity.startActivityForResult(intent, TAKE_PHOTO);
}
}
public static Bitmap uriToBitmap(Uri uri) {
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(MyApplicaiton.getContext().getContentResolver().openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return bitmap;
}
Вот как я использую его в демонстрационном действии:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FileKit.takePhoto(activity);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode) {
case FileKit.TAKE_PHOTO:
if (resultCode == RESULT_OK) {
Bitmap bitmap = FileKit.uriToBitmap(FileKit.taken_photo_uri);
if (bitmap == null) {
GeneralUtil.showToast("null picture");
} else {
GeneralUtil.showToast("not null picture");
imageView.setImageBitmap(bitmap);
}
}
break;
}
}
В Android 7.0 все хорошо, но uriToBitmap(Uri uri)
возвращает null в Android 6.0.1. Как это исправить? Спасибо!
Ответ №1:
Посмотрите в
takePhoto(){
if (Build.VERSION.SDK_INT >= 24) {
taken_photo_uri = FileProvider.getUriForFile(MyApplicaiton.getContext(),
activity.getResources().getString(R.string.main_package),
output_image);
} else {
taken_photo_uri = Uri.fromFile(output_image);
}
}
Ваша проверка версии вызывает FileProvider.getUriForFile() на Nougat и выше. Из документов Android (https://developer.android.com/reference/android/os/Build .VERSION_CODES), getUriForFile() возвращает Uri, как и ожидалось. Однако в Marshmallow и ниже вы вызываете Uri.fromFile(), который, опять же, согласно документам Android (https://developer.android.com/reference/android/net/Uri.html#fromFile (java.io.File)) возвращает Uri с префиксом «file://».
Не зная много об Uri или Android конкретно, я бы сказал, что это может быть проблемой.
Комментарии:
1. Вы все правильно поняли, но я до сих пор не знал, как это исправить. В конце концов я использовал проект с открытым исходным кодом для решения моей проблемы. В любом случае спасибо за ответ.
2. Я думаю, вы могли бы просто удалить этот префикс, но я не знаком с URI. В любом случае, рад, что вы это поняли!