Android si blocca dopo l'intento della camera

Ho pubblicato un'applicazione e una delle funzionalità fondamentali è quella di consentire all'utente di scattare una foto e di salvare quella foto in una specifica cartella sul proprio archivio esterno.

Tutto sembra funzionare bene, ma ho ottenuto due rapporti ora che affermano che dopo aver scattato una foto e facendo clic su "Fatto" per uscire dalla camera (e tornare all'attività), l'applicazione è forzata chiusa, portndo l'utente torna alla schermata iniziale.

  • Comportmento button con le tabs e ActivityGroup
  • Client di posta aperta Android
  • Come può BottomSheetBehavior, AppBarLayout.ScrollingViewBehavior e AppBarLayout.Behavior lavorare insieme in unison?
  • Cambiare lo background RemoteView ImageView
  • Dove è l'anteprima di layout di Android Studio?
  • Come eseguire il programma Android senza aprire l'applicazione?
  • Ciò accade su un Samsung Nexus S e la Tab Galaxy. Di seguito ho inviato il mio codice per mostrare che ho impostato la mia intenzione e come gestisco il salvataggio e la visualizzazione della foto in onActivityResult (). Qualsiasi guida su ciò che potrebbe causare la crash dopo aver fatto clic su "Fatto" per uscire dall'applicazione della camera, sarebbe molto apprezzato!

    Ancora una volta, questo sembra funzionare bene sulla maggior parte dei dispositivi, ma mi chiedevo se il loro è un approccio più efficiente e universale che dovrei assumere. Grazie

    Come sparo l'intento della camera

    case ACTION_BAR_CAMERA: // numbered image name fileName = "image_" + String.valueOf(numImages) + ".jpg"; output = new File(direct + File.separator + fileName); // create // output while (output.exists()) { // while the file exists numImages++; // increment number of images fileName = "image_" + String.valueOf(numImages) + ".jpg"; output = new File(outputFolder, fileName); } camera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); uriSavedImage = Uri.fromFile(output); // get Uri of the output camera.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); //pass in Uri to camera intent startActivityForResult(camera, 1); break; default: return super.onHandleActionBarItemClick(item, position); } return true; } 

    Come ho impostato suActivityResult ()

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { // If data was passed successfully Bundle extras = data.getExtras(); //Bundle extras = data.getBundleExtra(MediaStore.EXTRA_OUTPUT); /*ad = new AlertDialog.Builder(this).create(); ad.setIcon(android.R.drawable.ic_menu_camera); ad.setTitle("Save Image"); ad.setMessage("Save This Image To Album?"); ad.setButton("Ok", this); ad.show();*/ bmp = (Bitmap) extras.get("data"); // Set the bitmap to the bundle // of data that was just // received image.setImageBitmap(bmp); // Set imageview to image that was // captured image.setScaleType(ScaleType.FIT_XY); } } 

  • ProGuard per Android e GSON
  • Scorri per Toggle per Android
  • Problema ritagliato a schermo in un gioco 2-D unitario
  • Il movimento di Swipe non funziona in YouTubePlayerView in modalità a schermo integer
  • Elaborare più di un button su Android Widget
  • Aggiungere una serie di pulsanti a un GridView in un'applicazione Android
  • 7 Solutions collect form web for “Android si blocca dopo l'intento della camera”

    Innanzitutto diciamo chiaramente – abbiamo due opzioni per catturare i dati di image in onActivityResult da Camera:

    1. Avviare la camera passando la posizione esatta Uri dell'image where si desidera salvare.

    2. Avviare la camera solo non passare alcun Loaction Uri.


    1. IN PRIMA CASA:

    Avviare la camera passando l'image Uri where si desidera salvare:

     String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/picture.jpg"; File imageFile = new File(imageFilePath); Uri imageFileUri = Uri.fromFile(imageFile); // convert path to Uri Intent it = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); it.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri); startActivityForResult(it, CAMERA_RESULT); 

    In onActivityResult riceve l'image come:

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (RESULT_OK == resultCode) { iv = (ImageView) findViewById(R.id.ReturnedImageView); // Decode it for real BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); bmpFactoryOptions.inJustDecodeBounds = false; //imageFilePath image path which you pass with intent Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions); // Display it iv.setImageBitmap(bmp); } } 

    2. IN SECOND CASO:

    Avviare la camera senza l'image di passaggio Uri, se si desidera ricevere l'image in Intent (dati):

     Intent it = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(it, CAMERA_RESULT); 

    In onActivityResult recive l'image come:

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (RESULT_OK == resultCode) { // Get Extra from the intent Bundle extras = data.getExtras(); // Get the returned image from extra Bitmap bmp = (Bitmap) extras.get("data"); iv = (ImageView) findViewById(R.id.ReturnedImageView); iv.setImageBitmap(bmp); } } 


    ***** Happy Coding !!!! *****

    Sul button button della camera fare clic su questo evento:

     final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(this))); startActivityForResult(intent, TAKE_PHOTO_CODE); declare TAKE_PHOTO_CODE globally as: private static final int TAKE_PHOTO_CODE = 1; 

    Aggiungi function getTempFile nel codice che aiuterà a salvare l'image denominata myImage.png che hai scattato nella scheda sdcard sotto la cartella denominata come nome del pacchetto della tua applicazione.

     private File getTempFile(Context context) { final File path = new File(Environment.getExternalStorageDirectory(), context.getPackageName()); if (!path.exists()) { path.mkdir(); } return new File(path, "myImage.png"); } 

    Ora sulla function OnActivityResult aggiungere questo:

     if (requestCode == TAKE_PHOTO_CODE) { final File file = getTempFile(this); try { Uri uri = Uri.fromFile(file); Bitmap captureBmp = Media.getBitmap(getContentResolver(), uri); image.setImageBitmap(captureBmp); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 

    nel caso in cui si ottiene problemi di memory che aggiungere codice di seguito:

     @Override protected void onPause() { image.setImageURI(null); super.onPause(); } 

    Spero che questo ti aiuterà

    Sospetto che 3 problemi positivi possono aver creato il tuo problema:

    1. Alcuni dispositivi restituiscono null quando si chiamano extras.get("data"); in metodo onActivityResult modo che il tuo problema possa essere un NullPointerException . Per risolvere questo problema, è necessario passare l'ubicazione URI esatta per indicare l'applicazione della camera where vuoi che lo memorizzi e l'uso in onActivityResult per recuperare l'image come Bitmap .

    2. Alcuni altri dispositivi restituiscono un Bitmap full size quando extras.get("data"); in onActivityResult . Se la bitmap è troppo grande che può provocare un OutOfMemmoryError , forse è necessario decodificare l'image in size ridotte per non prendere così tanto mucchio di memmory. Questi due link possono aiutarti in questa situazione:

      http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

      BitmapFactory OOM mi guida i dadi

    3. Forse la tua attività viene distrutta dal GC modo da poter utilizzare onSavedInstanceState e onRestoreInstanceState per salvare i dati di Activity . Vedere la risposta di questo post precedente per ulteriori informazioni.

    Non so se hai già affrontato questi problemi.

    Spero possa aiutare:)

    Innanzitutto, assicurati di controllare il codice di richiesta, potrebbe essere il risultato di qualcun altro. In secondo luogo, non utilizzare i dati dell'intento. Bitmap – se niente, è piccolo, ma siccome si fornisce il path per memorizzare l'image catturata, non dovrebbe nemless essere presente (vedi qui ). Memorizzate dunque l'URL fornito come path del file di output e leggete Bitmap da lì quando hai ricevuto RESULT_OK per la tua richiesta:

      ... // save your file uri, not necessarily static mUriSavedImage = Uri.fromFile(output); startActivityForResult(camera, MY_REQUEST_CODE); /* Make a String like "com.myname.MY_REQUEST_CODE" and hash it into int to give it a bit of uniqueness */ } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == MY_REQUEST_CODE) { if (resultCode == RESULT_OK) { Bitmap bmp = BitmapFactory.decodeFile(mUriSavedImage); if (bmp != null) { image.setImageBitmap(bmp); // Set imageview to image that was // captured image.setScaleType(ScaleType.FIT_XY); } else { Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show(); } } } else { super.onActivityResult(requestCode, resultCode, data); } } 

    Ho affrontato lo stesso problema. A quanto pare la soluzione è quella di rendere il uriSavedImage statico. Non so se questo è il modo migliore. Ma questo funziona per me.

    Segui i passaggi forniti in questo link . Spero che questo sia utile per te.

    O

    Richiedere la tua image senza schiantarsi

    Scrivere il codice riportto di seguito in MainActivity

     // Storage for camera image URI components private final static String CAPTURED_PHOTO_PATH_KEY = "mCurrentPhotoPath"; private final static String CAPTURED_PHOTO_URI_KEY = "mCapturedImageURI"; // Required for camera operations in order to save the image file on resume. private String mCurrentPhotoPath = null; private Uri mCapturedImageURI = null; @Override public void onSaveInstanceState(Bundle savedInstanceState) { if (mCurrentPhotoPath != null) { savedInstanceState.putString(CAPTURED_PHOTO_PATH_KEY, mCurrentPhotoPath); } if (mCapturedImageURI != null) { savedInstanceState.putString(CAPTURED_PHOTO_URI_KEY, mCapturedImageURI.toString()); } super.onSaveInstanceState(savedInstanceState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { if (savedInstanceState.containsKey(CAPTURED_PHOTO_PATH_KEY)) { mCurrentPhotoPath = savedInstanceState.getString(CAPTURED_PHOTO_PATH_KEY); } if (savedInstanceState.containsKey(CAPTURED_PHOTO_URI_KEY)) { mCapturedImageURI = Uri.parse(savedInstanceState.getString(CAPTURED_PHOTO_URI_KEY)); } super.onRestoreInstanceState(savedInstanceState); } 

    Ciao a tutti so che la risposta è stata data, ma come questa è anche una delle soluzioni di soluzione più semplici che abbia mai trovato

    Ecco l'esempio che sta preoccupando per il dispositivo!

    AndroidCameraUtils – Scarica il progetto e dal progetto di libreria inserendolo sotto è lo snippet di codice che puoi usare!

    private void setupCameraIntentHelper () {mCameraIntentHelper = nuovo CameraIntentHelper (questo nuovo CameraIntentHelperCallback () {@Override public void onPhotoUriFound (Data dateCameraIntentStarted, Uri photoUri, int rotateXDegrees) {messageView.setText (getString (R.string.activity_camera_intent_photo_uri_found) + photoUri.toString ());

      Bitmap photo = BitmapHelper.readBitmap(CameraIntentActivity.this, photoUri); if (photo != null) { photo = BitmapHelper.shrinkBitmap(photo, 300, rotateXDegrees); ImageView imageView = (ImageView) findViewById(de.ecotastic.android.camerautil.sample.R.id.activity_camera_intent_image_view); imageView.setImageBitmap(photo); } } @Override public void deletePhotoWithUri(Uri photoUri) { BitmapHelper.deleteImageWithUriIfExists(photoUri, CameraIntentActivity.this); } @Override public void onSdCardNotMounted() { Toast.makeText(getApplicationContext(), getString(R.string.error_sd_card_not_mounted), Toast.LENGTH_LONG).show(); } @Override public void onCanceled() { Toast.makeText(getApplicationContext(), getString(R.string.warning_camera_intent_canceled), Toast.LENGTH_LONG).show(); } @Override public void onCouldNotTakePhoto() { Toast.makeText(getApplicationContext(), getString(R.string.error_could_not_take_photo), Toast.LENGTH_LONG).show(); } @Override public void onPhotoUriNotFound() { messageView.setText(getString(R.string.activity_camera_intent_photo_uri_not_found)); } @Override public void logException(Exception e) { Toast.makeText(getApplicationContext(), getString(R.string.error_sth_went_wrong), Toast.LENGTH_LONG).show(); Log.d(getClass().getName(), e.getMessage()); } }); 

    }

     @Override protected void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); mCameraIntentHelper.onSaveInstanceState(savedInstanceState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mCameraIntentHelper.onRestoreInstanceState(savedInstanceState); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); mCameraIntentHelper.onActivityResult(requestCode, resultCode, intent); } } 

    NOTA : – Ho provato molti esempi per utils della macchina fotografica e del corso ci sono altri modi per gestirlo ma per principianti e persone che non sono troppo familiari con i concetti di base sarebbe più comodità con questo progetto. Grazie!

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