#java #android #android-intent #bitmap #camera
#java #Android #android-намерение #растровое изображение #камера
Вопрос:
Я пытаюсь запустить встроенную камеру, чтобы сделать снимок, у снимка, у которого будет имя, указанное действием, запускающим камеру. (код ниже)
-
Когда камера возвращается,
onActivityResult()
переходит прямо кresultCode == Activity.RESULT_CANCELED
. Любое объяснение этого и решения были бы с благодарностью приняты. -
Камера действительно делает снимок, я могу видеть его на своей SD-карте с помощью программы просмотра файлов, но его имя является стандартным с камеры. Как я могу сделать так, чтобы имя этого снятого изображения было тем, которое предоставлено действием?
Код намерения камеры
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File image = new File("Team image.jpg");
camera.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
camera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
camera.putExtra(MediaStore.Images.Media.TITLE, "Team image");
startActivityForResult(camera, PICTURE_RESULT);
код activityresult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode == PICTURE_RESULT){
if(resultCode == Activity.RESULT_OK) {
if(data!=null){
Bitmap image = BitmapFactory.decodeFile(data.getExtras().get(MediaStore.Images.Media.TITLE).toString());
grid.add(image);
images.addItem(image);
}
if(data==null){
Toast.makeText(Team_Viewer.this, "no data.", Toast.LENGTH_SHORT).show();
}
}
else if(resultCode == Activity.RESULT_CANCELED) {
Toast.makeText(Team_Viewer.this, "Picture could not be taken.", Toast.LENGTH_SHORT).show();
}
}
}
Ответ №1:
Отметили ли вы режим запуска вашей активности как «singleInstance»?
Это может вызвать вашу первую проблему.
Моя камера работает нормально, когда я удаляю «singleInstance».
Комментарии:
1. Это касалось моего. Спасибо.
2. У меня была та же проблема, что и у OP, это исправило ее. Спасибо! (Хотя это происходило только на устройствах до Lollipop)
Ответ №2:
Эти две проблемы, вероятно, связаны, имея отношение к тому, как вы создаете ссылку на файл, которая передается на камеру. Если вы хотите, чтобы ваш файл изображения был сохранен на SD-карту, вам необходимо создать ссылку на файл, которая включает полный путь к этому местоположению, а не только имя файла. Например, этот код сохранит файл изображения в корне SD-карты:
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File image = new File(Environment.getExternalStorageDirectory(),"TeamImage.jpg");
camera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
startActivityForResult(camera, PICTURE_RESULT);
Я также изменил ваше имя файла, чтобы не включать пробел; только потому, что я не уверен, что приложение камеры также не взорвется на этом фрагменте. Поскольку камера запутывается при попытке открыть и записать в ваше местоположение файла, вероятно, именно поэтому вы всегда возвращаетесь с RESULT_CANCELED
. Здесь вам не нужно разрешение WRITE_EXTERNAL_STORAGE, поскольку приложение камеры выполняет доступ к SD-карте.
Еще одно примечание: я не верю, что другие дополнения MediaStore могут быть переданы с этим намерением. Обычно, если вы хотите, чтобы к вашему изображению были прикреплены метаданные, вам необходимо вставить ссылку Uri с этими метаданными в MediaStore ContentProvider перед сохранением изображения на диск.
Надеюсь, это поможет!
Комментарии:
1. Большое вам спасибо, это была проблема!
Ответ №3:
Не уверен, что не так с вашим кодом, вот что работает для меня:
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA_PIC_REQUEST);
и
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case CAMERA_PIC_REQUEST:
Bitmap b = (Bitmap) data.getExtras().get("data");
if (b != null) {
updateThumbnail(b);
if (mBitmap != b) {
b.recycle();
}
}
break;
}
}
Комментарии:
1. Однако результирующее «растровое изображение» в этом случае имеет ужасно низкое разрешение.