Моя камера Android Uri возвращает нулевое значение, но исправление Samsung на месте, помощь?
Итак, я знаю о проблеме с камерой на устройствах Samsung. Вам нужно создать Uri, прежде чем вызвать камеру так:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, m_username);
mImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
В этом примере создается Uri для камеры для хранения данных. Мое приложение имеет функцию камеры в двух местах. Оба идентичны (прямая копия), но в одном действии объект mImageUri
становится нулевым во время процесса камеры, а в другом - нет. Последний работает отлично, но первый дает нулевое значение, которое, в свою очередь, мешает мне сохранять изображение, просматривать его и т.д. Я предоставил код onResult ниже:
case CAMERA_PIC_REQUEST :
if(resultCode == RESULT_OK) {
if(intent != null) {
//For non-Samsung devices
Log.e("Intent value:", intent.toString());
mImageUri = intent.getData();
}
mAvatar = BitmapStatic.createImage(mImageUri, this);
Drawable draw = new BitmapDrawable(getResources(), mAvatar);
m_photoButtonE.setImageDrawable(draw);
m_imageChanged = true;
}
break;
Вышеприведенный пример относится к рабочему действию. Ниже приведена информация о том, что это не работает:
//On pressing the "Take Photo" button:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, mUsername);
mImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
if(mImageUri == null) {
Log.e("image uri is null", "what?");
}
else {
Log.e("oh nevermind", "image uri is NOT null");
}
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
//On Result:
case CAMERA_PIC_REQUEST :
if(resultCode == RESULT_OK) {
if(intent != null) {
Log.e("Intent value:", intent.toString());
mImageUri = intent.getData();
}
else {
Log.e("Intent is null", "yep it is.");
if(mImageUri == null) {
Log.e("nullcheck on memberimageuri", "its null");
}
else {
Log.e("nullcheckon memberimage", mImageUri.toString());
}
}
mImage = BitmapStatic.createImage(mImageUri, this);
Drawable draw = new BitmapDrawable(getResources(), mImage);
mPhotoPreview.setImageDrawable(draw);
}
break;
Обратите внимание на файлы журнала, которые я разместил в этом втором примере. Когда я нажимаю кнопку "Take Picture", нулевая проверка объекта mImageUri
возвращает true. Таким образом, этот объект не является нулевым. Но где-то во время процесса съемки это значение становится нулевым. Вторая проверка во время onResult() возвращает false. Опять же, это почти идентично моей настройке в другой деятельности, где она отлично работает.
Любые мысли?
Ответы
Ответ 1
Ваша активность уничтожается во время операции "Активность камеры" и впоследствии воссоздается. Вы должны использовать onSaveInstanceState/onRestoreInstanceState механизм в ваша активность для сохранения URI изображения (и любых других данных) при перезапуске активности.
Вот так:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mImageUri != null) {
outState.putString("cameraImageUri", mImageUri.toString());
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState.containsKey("cameraImageUri")) {
mImageUri = Uri.parse(savedInstanceState.getString("cameraImageUri"));
}
}
Ответ 2
Я могу предложить сначала создать начальный (временный) файл, а затем передать Uri в Intent.
В функции "onActivityResult()" у вас будет файл с заполненным изображением.
File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "folderName");
dir.mkdirs();
if (dir.exists()) {
try {
imageFile = File.createTempFile("IMG_", ".jpg", dir);
} catch (IOException e) {
e.printStackTrace();
}
}
if (imageFile != null) {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
activity.startActivityForResult(cameraIntent, REQUEST_CODE);
}