2011-07-08 3 views
2

i ont le problème en utilisant l'appareil photo dans mon application Androidapplication Crashed lorsque vous appuyez sur le bouton Précédent sur l'appareil photo Android Intention

j'ai un formulaire pour enregistrer les données, il y a un bouton pour Prendre une photo avec l'appareil photo et l'image capturée à partir la caméra sera placée sur ImageView dans mon formulaire.

il n'y a pas de problème à appeler l'intention de la caméra et de placer l'image sous la forme

mon problème est: dans l'application de la caméra, si j'appuyez sur le bouton de retour (retour à la forme) ma demande écrasements.

pourquoi?

c'est le code sur mon bouton qui appelle la caméra

btn_takepic.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View arg0) {    
     Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 
    } 
}); 

c'est mon onActivityResult

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    final EditText et_foto = (EditText) findViewById(R.id.et_foto); 
    if(requestCode == CAMERA_PIC_REQUEST) {   
      Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
     ImageView image = (ImageView) findViewById(R.id.imv_foto); 
     image.setImageBitmap(thumbnail); 
     //toastkeun(data.getExtras().get("data").toString()); 
    } 

    super.onActivityResult(requestCode, resultCode, data); 
} 

je teste sur l'appareil réel ceci est mon LogCat

07-08 16:05:26.187: ERROR/AndroidRuntime(12116): FATAL EXCEPTION: main 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3515) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread.access$2800(ActivityThread.java:125) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.os.Looper.loop(Looper.java:123) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at dalvik.system.NativeStart.main(Native Method) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): Caused by: java.lang.NullPointerException 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at com.ngimagrid.nigmago.FormAsetTambah.onActivityResult(FormAsetTambah.java:246) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.Activity.dispatchActivityResult(Activity.java:3890) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3511) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  ... 11 more 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): FATAL EXCEPTION: main 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3515) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread.access$2800(ActivityThread.java:125) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.os.Looper.loop(Looper.java:123) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at dalvik.system.NativeStart.main(Native Method) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): Caused by: java.lang.NullPointerException 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at com.ngimagrid.nigmago.FormAsetTambah.onActivityResult(FormAsetTambah.java:246) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.Activity.dispatchActivityResult(Activity.java:3890) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3511) 
07-08 16:05:26.187: ERROR/AndroidRuntime(12116):  ... 11 more 
De cette ligne, je pense que c'est le problème ...

07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException 

Aucun résultat n'a été renvoyé correctement? comment résoudre ce problème?

grâce

cmiiw

+0

données.getExtras(). Get ("données"); Cette ligne présente des problèmes sur divers périphériques. http://code.google.com/p/android/issues/detail?id=1480 Pour certains périphériques, les données ne sont pas renvoyées avec l'ensemble. Je ne me souviens pas exactement de quels appareils. Mais, même si vous obtenez un bitmap, la résolution est très faible. –

Répondre

3

Je ne pense pas que cela vient de votre application. vous pouvez essayer d'entourer tout le code de résultat onActivity dans un bloc try/catch. Je pense que ce que vous vivez est un bug de caméra sur certains des téléphones. essayez également d'essayer différentes combinaisons d'extras que vous envoyez sur l'intention startActivityForResult.

Toujours vérifier le code de résultat avant de faire quoi que ce soit. vous ne voulez pas faire le même code si le résultat est annulé (Activity.RESULT_CANCELED) ou ok (Activity.RESULT_OK)

aussi il y a un bug où le résultat ne vient pas dans le EXTRA_OUTPUT (je pense qu'il a été nommé comme ça) mais à la place il s'agit d'un Uri dans intention.getData(). sortie supplémentaire est vous fournir un chemin où sauvegarder le fichier et le retour de l'uri est généralement l'image enregistrée dans l'emplacement de la caméra par défaut. C'est un peu différent comme vous le verrez.

Vous n'utilisez pas les drapeaux atm mais vous le devriez si vous voulez que l'emplacement de l'image en résulte. Recherchez une pile pour un exemple de code pour les extras.

+1

J'ai entouré mon onActivityResult() avec le bloc try/catch, et il a renvoyé java.lang.NullPointerException quand j'ai appuyé sur le bouton de retour, donc sur le bloc de capture je l'ai laissé vide, donc l'application ne plante pas. Merci beaucoup: D – Falmesino

+0

Bien lu un peu sur la gestion des exceptions si vous n'êtes pas vraiment familier avec eux vous avez pour obtenir l'image (avec un cas simple ou une instruction if) donc l'exception n'est pas levée dans la plupart des cas. – DArkO

+0

essayez d'entourer l'ensemble du code de résultat onActivity dans un bloc try/catch. c'est du travail, merci beaucoup :) –

4

L'exception NullPointerException est provoquée par votre code en supposant que data.getExtras(). Get ("data") retournera quelque chose. C'est un paramètre entièrement non documenté et sur de nombreux (plus) périphériques retournera null. Si, comme vous le voyez, vous essayez d'obtenir une vignette, vous pouvez essayer quelque chose comme ça, qui essaie à la fois de façon connue (pour moi, de toute façon) d'extraire une vignette des résultats de la caméra. .

Bitmap thumb; 
if (data.getData() != null) { 
    try { 
     Uri uri = data.getData(); 
     thumb = Images.Thumbnails.getThumbnail(getContentResolver(), Long.parseLong(uri.getLastPathSegment()), Images.Thumbnails.MICRO_KIND, null); 
     } catch (Exception typeNotSupported) { 

     } 
    } 
    if (thumb == null) { 
     thumb = (Bitmap) data.getExtras().get("data"); 
    } 
} 

Soit dit en passant, je pense qu'il ya un autre bug - votre onActivityResult devrait également vérifier que resultCode est OK - si l'utilisateur annule de l'appareil photo, je crois onActivityResult reste appelée.

J'espère que c'est utile.

2

Oui, vous pouvez manipuler le bouton de retour sur la galerie ou l'appareil photo ou de toute autre manière.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (resultCode != RESULT_OK) 
    { 
    //Here you can handle,do anything you want 
    } 
//other code 
} 
0

En parlant de la vidéo youtube, je sais, j'ai eu la même erreur.

protected void onCreate(Bundle savedInstanceState) 
{ 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    try 
    {  
      Button btn = (Button) findViewById(R.id.takePhoto); 
      btn.setOnClickListener(new OnClickListener() 
      { 

       @Override 
       public void onClick(View v) 
       { 
         Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
         startActivityForResult(intent, 0); 
       } 

      }); 
      iv = (ImageView) findViewById(R.id.imageView); 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

} 
Questions connexes