В моем приложении, я пытаюсь сделать снимок, сохранить его, и добавить его в ImageView с этим кодом, я получил от Android Developers tutorialAndroid несовместимая картина экономией с getExternalFilesDir
private static final int REQUEST_IMAGE_CAPTURE = 1;
private String lastImagePath;
//Create temporary image file using getExternalFilesDir()
private File createImageFile() throws IOException{
String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timestamp + "_";
File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
lastImagePath = image.getAbsolutePath();
return image;
}
//Start picture intent and save to file
private void takePicture(){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photoFile = null;
if(takePictureIntent.resolveActivity(getActivity().getPackageManager())!= null){
try{
photoFile = createImageFile();
}catch (IOException e){
Log.e(TAG, "Error Creating image file");
e.printStackTrace();
}
if (photoFile !=null){
Log.e(TAG, photoFile.getAbsolutePath());
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK){
//Ensure the path has been set
if(lastImagePath !=null){
Log.e(TAG, "LastImagePath: " + lastImagePath);
//DEBUG:see if it actually created the file
File file = new File(lastImagePath);
if(file.exists()){
Log.e(TAG, "File exists");
}
//Decode file
Bitmap image = BitmapFactory.decodeFile(lastImagePath);
//DEBUG: see if image is null
if(image == null){
Log.e(TAG, "Image is null");
}else{
Log.e(TAG, "Image is not null");
}
//convert full sized image to thumbnail and add it to imageView
Bitmap thumbnail = ThumbnailUtils.extractThumbnail(image, 200, 200);
image1.setImageBitmap(thumbnail);
}else{
Log.e(TAG, "lastImagePath is null");
}
}
}
Иногда этот код работает Ожидается и берет изображение, сохраняет его, загружает обратно в программу и добавляет его в представление изображения. Но в других случаях он вообще не работает и, похоже, не может получить изображение.
Вот выход LogCat для успешного захвата изображения, где изображение появляется в ImageView
05-04 17:27:49.218 4964-4964/com.noah.stickynotes_clientside E/SUBMIT_FRAGMENT: /storage/emulated/0/Android/data/com.noah.stickynotes_clientside/files/Pictures/JPEG_20160504_172748_-1847663626.jpg
05-04 17:28:03.886 4964-4964/com.noah.stickynotes_clientside E/SUBMIT_FRAGMENT: LastImagePath: /storage/emulated/0/Android/data/com.noah.stickynotes_clientside/files/Pictures/JPEG_20160504_172748_-1847663626.jpg
05-04 17:28:04.359 4964-4964/com.noah.stickynotes_clientside E/SUBMIT_FRAGMENT: File exists
05-04 17:28:04.825 4964-4964/com.noah.stickynotes_clientside E/SUBMIT_FRAGMENT: Image is not null
А вот выход LogCat для захвата неудавшихся изображений, где нет изображения в ImageView
05-04 17:29:00.070 4964-4964/com.noah.stickynotes_clientside E/SUBMIT_FRAGMENT: /storage/emulated/0/Android/data/com.noah.stickynotes_clientside/files/Pictures/JPEG_20160504_172900_-1359930406.jpg
05-04 17:29:06.581 4964-4964/com.noah.stickynotes_clientside E/SUBMIT_FRAGMENT: LastImagePath: /storage/emulated/0/Android/data/com.noah.stickynotes_clientside/files/Pictures/JPEG_20160504_172900_-1359930406.jpg
05-04 17:29:06.583 4964-4964/com.noah.stickynotes_clientside E/SUBMIT_FRAGMENT: File exists
05-04 17:29:06.583 4964-4964/com.noah.stickynotes_clientside E/SUBMIT_FRAGMENT: Image is null
Это, кажется, работает случайным образом и не работает 80% времени. Я использую getExternalFilesDir, потому что хочу, чтобы фотографии были приватными для приложения. Я также добавил разрешение WRITE_EXTERNAL_STORAGE в мой файл манифеста.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Я также понимаю, что я мог бы использовать эскиз из изображения, но я хочу, чтобы иметь полное изображение размера, потому что я буду добавлять его в класс позже.
У кого-нибудь есть идеи о том, что происходит не так?
Спасибо за ваш быстрый ответ, но я все еще немного смущен. Я реализовал концепцию сохранения местоположения файла в 'Bundle' в' onSaveInstanceState() ', но кажется, что функция никогда не вызвана. Я не знаю, связано ли это с тем, что код в OP находится в фрагменте, который не является активным, или если это повлияет на мою проблему вообще. –
@NoahLutz: «но кажется, что функция никогда не называется» - она должна, всякий раз, когда ваше приложение идет в фоновом режиме (т. Е. Останавливается, но не уничтожается). Вам даже не нужно запускать камеру для этого. Просто нажмите ДОМОЙ, когда ваш объект + фрагмент находится на переднем плане. «Я не знаю, связано ли это с тем, что код в OP находится в фрагменте, который не является активным, или если бы это повлияло на мою проблему вообще», - у фрагментов есть свой 'onSaveInstanceState()', который должен быть вызван. – CommonsWare
Итак, я получил 'onSaveInstanceState()' для выполнения и сохранения местоположения в комплекте, по какой-то причине apk не удалось развернуть первый раз, но теперь он работает! Спасибо! –