Android: Application se bloque sur onActivityResult tout en utilisant l'Appareil photo de l'Intention
Je suis en utilisant la caméra de l'intention de capturer des images dans mon Application. Le problème de mon application se bloque sur Android 5.0.2
tout en utilisant l'appareil photo. Je suis en utilisant l'intention de fragment. Ci-dessous mon code à l'intérieur de fragment:
Méthode pour prendre la photo
private void takePhoto() {
mHighQualityImageUri = Util.generateTimeStampPhotoFileUri(getActivity());
Log.d(UploadPicturesFragment.class.getSimpleName(),
"URI: " + mHighQualityImageUri.toString());
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mHighQualityImageUri);
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
}
onActivityResult dans mon fragment
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_IMAGE_CAPTURE) {
Log.d(UploadPicturesFragment.class.getSimpleName(),
"IMAGE URI NOT NULL: " + (mHighQualityImageUri == null));
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(),
mHighQualityImageUri);
DroomUtil.beginCrop(mHighQualityImageUri, getActivity(), this, true, bitmap.getWidth(),
bitmap.getHeight());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Journal De Trace
12-29 10:28:03.491: E/AndroidRuntime(9780): java.lang.RuntimeException: Unable to resume activity {in.droom/in.droom.activity.MainActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:2, request=1, result=-1, data=null} to activity {in.droom/in.droom.activity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3224)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3257)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2479)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.app.ActivityThread.access$800(ActivityThread.java:144)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.os.Handler.dispatchMessage(Handler.java:102)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.os.Looper.loop(Looper.java:155)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.app.ActivityThread.main(ActivityThread.java:5702)
12-29 10:28:03.491: E/AndroidRuntime(9780): at java.lang.reflect.Method.invoke(Native Method)
12-29 10:28:03.491: E/AndroidRuntime(9780): at java.lang.reflect.Method.invoke(Method.java:372)
12-29 10:28:03.491: E/AndroidRuntime(9780): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
12-29 10:28:03.491: E/AndroidRuntime(9780): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
12-29 10:28:03.491: E/AndroidRuntime(9780): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:2, request=1, result=-1, data=null} to activity {in.droom/in.droom.activity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.app.ActivityThread.deliverResults(ActivityThread.java:3881)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3197)
12-29 10:28:03.491: E/AndroidRuntime(9780): ... 11 more
12-29 10:28:03.491: E/AndroidRuntime(9780): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.content.ContentResolver.openInputStream(ContentResolver.java:651)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:1019)
12-29 10:28:03.491: E/AndroidRuntime(9780): at in.droom.fragments.UploadPicturesFragment.onActivityResult(UploadPicturesFragment.java:395)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.app.Activity.dispatchActivityResult(Activity.java:6164)
12-29 10:28:03.491: E/AndroidRuntime(9780): at android.app.ActivityThread.deliverResults(ActivityThread.java:3877)
12-29 10:28:03.491: E/AndroidRuntime(9780): ... 12 more
La ligne no. 395 est:
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(),
mHighQualityImageUri);
- stackoverflow.com/a/11351580/4067759
- Je pense que vous êtes en train de terminer votre activité quelque part
- Mais le problème est que sur Android 5.0.2 seulement.
- toute classe comme obsolète??
- Pas de. Ce que j'ai trouvé parfois, lorsque l'appareil photo s'ouvre, il semble que ses changements d'orientation de paysage à portrait. Mon application est en mode protrait
- est Uri arriver imprimé dans les journaux, dans les deux cas??
- Parfois, il est imprimé et parfois, il devient nulle
- Je reçois aussi des null dans un but parfois. Dans mon cas, si je tourne mon appareil lorsque l'appareil photo s'ouvre je obtenir la valeur null dans onActivityResult
- stackoverflow.com/a/6147919/1168654
- J'ai lu votre déclaration au sujet de l'orientation portrait, Michael Herbig réponse a une solution de rechange pour la fixation de la difficulté de la Caméra (sur certains appareils). D'autre part, c'est une bonne idée que vous vérifier sur les Bundle exemple, de l'Activité et de Résultat, s'il est différent de null. Cette action susceptible de conjurer les accidents.
Vous devez vous connecter pour publier un commentaire.
Qui signifie
mHighQualityImageUri
estnull
, selon toute vraisemblance. Cela se produit si vous n'avez pas à accrocher à cetteUri
à l'aide deonSaveInstanceState()
. Il est tout à fait possible que votre processus sera terminé pendant que votre application est en arrière-plan et de l'application appareil photo est au premier plan.Suivez les étapes ci-dessous afin de prendre une photo de la caméra et de l'écran sur
ImageView
1) Début De La Caméra Intention
2) Rappel onActivityResult Fonction
3) decodeUri Fonction
4) getPath de l'Image
Enfin Dans le Manifeste de définir l'autorisation
Remarque: Si vous utilisez de la guimauve (Android 6.0), vous devez définir des contrôles d'Autorisation avant d'utiliser l'app appareil photo. Vous pouvez lire sur Android Demander des Autorisations au Moment de l'Exécution
Tout d'abord, vérifiez si
data
estnull
dansonActivityResult
par l'ajout d'un code supplémentaire qui empêchera votre application d'être écrasé, à l'instar de ceAlors Considérer Cette leçon Qui explique comment prendre des photos à l'aide d'une photo existante de l'application.
Il y a une référence complète sur Demandant l'autorisation caméra à l'aide de uses-feature tag , L'obtention d'une vignette, Enregistrement photo en grand format, Et beaucoup plus qui peuvent être très utiles à l'accomplissement de votre Tâche ...
Sur android, j'ai vu des différents dispositifs exibit des comportements différents pour le choix de l'image avec l'appareil photo et galerie. J'ai trouver la meilleure façon est de:
Cette méthode de faire de votre code indépendant du retour à l'Uri dans l'intention puisque vous possédez de l'Uri. Aussi, cette charge galerie d'image pick trop avec de petites modifications.
Je vois que vous avez orientation du périphérique aussi des problèmes avec l'appareil photo. Cette (malheureusement) doit être traitée dans votre application une acquisition d'une image dans un post étape de traitement. J'ai souligné le code ci-dessous ainsi. Surtout, les questions de l'orientation qui s'est passé sur les appareils Samsung, où seule la caméra de capturer des images en mode paysage.
De créer une Uri de l'image:
Note : il est important que vous persistez
mAttachmentUri
de l'utilisation partagée des préférences ou de l'activité bundle avec onSaveInstanceState() sinon les Uri peuvent être perdues lorsque votre application est assassiné.L'obtention de l'appareil photo objectif:
Lecture de l'image:
Fournisseur de contenu:
Pour le fournisseur de contenu mise en oeuvre, vous pouvez utiliser un android FileProvider ou de mettre en œuvre un fournisseur de contenu comme ci-dessous. Ce fournisseur de contenu d'ouvrir un fichier dans vos applications conteneur pour l'application appareil photo à écrire à.
Pour résumer, ce code devrait fonctionner sur la plupart des appareils testés et ne la correction de l'image reçue de la caméra si nécessaire.
Que par les journaux
Il indique clairement que vous appelez
getScheme()
sur un objet null. Donc, avant le traitement, vous devez vérifier la valeur null intention de données.Également, en commençant avec Android M, vous devez demander à l'utilisateur de la Caméra de l'autorisation. En l'absence d'autorisation caméra, app crash.
Pour savoir comment travailler avec l'autorisation de l'architecture, de regard sur elle: http://developer.android.com/training/permissions/index.html
Ici est ce que je fais souvent dans mes projets, veuillez jeter un oeil. Espérons que cela aide!
Fragment de classe:
Utils classe:
Je pense que, si vous êtes en utilisant l'intention de fragment et si votre aide
getActivity()
assurez-vous que vous avez branché votre fragment de votre activité sinon, il peut vous jeter pointeur null.
donc dans mon cas, j'ai utilisé une solution de contournement pour obtenir le contexte, qui vous pouvez utiliser
créer une variable global
View rootView
et l'initialiserOnViewCreated() method
et vous pouvez les utiliser en conséquence.