Risparmio image incoerente di Android con getExternalFilesDir

Nella mia applicazione cerco di scattare una foto, salvo, e aggiungerlo ad un ImageView con questo codice che ho ricevuto dall'istruzione Android Developers

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"); } } } 

A volte questo codice funziona come previsto e prende un'image, lo salva, lo riport nel programma e lo aggiunge alla visualizzazione dell'image. Ma altre volte, non funziona affatto e sembra non riuscire a prendere l'image.

  • Come gestire le modifiche di visibilità per un widget / widget personalizzato di android
  • adb non può avviare daemon, errore CreateProcess, errore 2
  • Monitorare i valori delle impostazioni del sistema Android
  • Android salva le impostazioni / i dati app nella memory interna / esterna
  • Visualizzazione di un file MS Word in View (dire TextView) in Android
  • Errore di connessione dell'ingresso Android
  • Ecco l'output di logcat per una cattura di immagini di successo in cui l'image viene visualizzata in 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 

    Ecco l'output logcat per una cattura di immagini non rioutput in cui non c'è alcuna image nell'ApplicationView

     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 

    Questo sembra funzionare a caso e fallisce l'80% del tempo. Sto utilizzando getExternalFilesDir perché voglio che le foto siano private per l'applicazione. Ho anche aggiunto l'authorization WRITE_EXTERNAL_STORAGE al mio file Manifest.

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

    Capisco anche che potrei usare la miniatura dell'image, ma voglio avere l'image a pieno titolo perché lo aggiungerò ad una class in seguito.

    Qualcuno ha delle idee su cosa sta andando male?

  • come incorporare Turn by turn navigation sul mio google
  • Apri applicazione Android dall'URL utilizzando il filter intent non funzionante
  • Scaricare nuovamente 9.0.83 Google Play Services manualmente per evitare DynamiteModule: Imansible caricare il descrittore del module
  • getCurrentTextColor da un TextView restituisce un colore strano
  • Perché i miei "post" caricano in diverse size in recyclerview di android?
  • dispatchPopulateAccessibilityEvent non viene triggersto
  • One Solution collect form web for “Risparmio image incoerente di Android con getExternalFilesDir”

    Il process viene terminato mentre la tua applicazione è in background. Questo è normale per Android, anche se non ci si può aspettare qui. Devi tenere il tuo EXTRA_OUTPUT nel Bundle dello stato di istanza salvato.

    Si noti inoltre che dal momento che il file: valori Uri sono vietati , si consiglia di passare all'utilizzo di FileProvider .

    Questa applicazione di esempio dimostra entrambe queste cose. Certo, il codice è più complicato:

     /*** Copyright (c) 2008-2016 CommonsWare, LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. From _The Busy Coder's Guide to Android Development_ https://commonsware.com/Android */ package com.commonsware.android.camcon; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.support.v4.content.FileProvider; import java.io.File; import java.util.List; public class CameraContentDemoActivity extends Activity { private static final String EXTRA_FILENAME= "com.commonsware.android.camcon.EXTRA_FILENAME"; private static final String FILENAME="CameraContentDemo.jpeg"; private static final int CONTENT_REQUEST=1337; private static final String AUTHORITY= BuildConfig.APPLICATION_ID+".provider"; private static final String PHOTOS="photos"; private File output=null; private Uri outputUri=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (savedInstanceState==null) { output=new File(new File(getFilesDir(), PHOTOS), FILENAME); if (output.exists()) { output.delete(); } else { output.getParentFile().mkdirs(); } } else { output=(File)savedInstanceState.getSerializable(EXTRA_FILENAME); } outputUri=FileProvider.getUriForFile(this, AUTHORITY, output); if (savedInstanceState==null) { i.putExtra(MediaStore.EXTRA_OUTPUT, outputUri); if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) { i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } else { List<ResolveInfo> resInfoList= getPackageManager() .queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resInfoList) { String packageName = resolveInfo.activityInfo.packageName; grantUriPermission(packageName, outputUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } } startActivityForResult(i, CONTENT_REQUEST); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable(EXTRA_FILENAME, output); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CONTENT_REQUEST) { if (resultCode == RESULT_OK) { Intent i=new Intent(Intent.ACTION_VIEW); i.setDataAndType(outputUri, "image/jpeg"); i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(i); finish(); } } } } 

    Per quanto riguarda il tuo problema, salvo la posizione di output nel Bundle in onSaveInstanceState() e l'utilizzo nuovamente in onCreate() se ho un Bundle che viene ripristinato.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.