web-dev-qa-db-fra.com

java.lang.RuntimeException: échec de la livraison du résultat ResultInfo {who = null, requête = 1888, result = 0, data = null} à activité

Mon application permet à l'utilisateur d'appuyer sur un bouton, il ouvre l'appareil photo, il peut prendre une photo et cela s'affichera dans une image. Si l'utilisateur appuie en arrière ou annule pendant que la caméra est ouverte, je force cette fermeture - Échec de livraison du résultat ResultInfo {who = null, demande = 1888, resultat = 0, data = null} à l'activité ... alors je devine le résultat = 0 est le problème que dois-je insérer pour que cette force d'arrêt se ferme?

Ci-dessous mon code. Je sais que j'oublie quelque chose mais je ne peux pas le comprendre! (Certes, il me faut environ 2 semaines pour apprendre le développement Android). Merci pour toute aide! 

    private static final int CAMERA_REQUEST = 1888; 
    private ImageView imageView;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    this.imageView = (ImageView)this.findViewById(R.id.photostrippic1);

    ImageView photoButton = (ImageView) this.findViewById(R.id.photostrippic1);



        photoButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent cameraIntent = new      Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
            startActivityForResult(cameraIntent, CAMERA_REQUEST); 
        }

    });

  protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (requestCode == CAMERA_REQUEST) {  
        Bitmap photo = (Bitmap) data.getExtras().get("data"); 
        imageView.setImageBitmap(photo);
    }  

J'imagine que j'aurais besoin d'un "autre" quelque part mais je ne sais pas exactement comment le faire.

ci-dessous est le logcat

    Java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=0, data=null} to activity {photo.booth.app/photo.booth.app.PhotoboothActivity}: Java.lang.NullPointerException
    at Android.app.ActivityThread.deliverResults(ActivityThread.Java:2934)
    at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:2986)
    at Android.app.ActivityThread.access$2000(ActivityThread.Java:132)
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1068)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:150)
    at Android.app.ActivityThread.main(ActivityThread.Java:4293)
    at Java.lang.reflect.Method.invokeNative(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:507)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:849)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:607)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: Java.lang.NullPointerException
    at photo.booth.app.PhotoboothActivity.onActivityResult(PhotoboothActivity.Java:76)
    at Android.app.Activity.dispatchActivityResult(Activity.Java:4108)
    at Android.app.ActivityThread.deliverResults(ActivityThread.Java:2930)
    ... 11 more
43
dabious

L'ajout de cette première condition devrait fonctionner:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(resultCode != RESULT_CANCELED){
        if (requestCode == CAMERA_REQUEST) {  
            Bitmap photo = (Bitmap) data.getExtras().get("data"); 
            imageView.setImageBitmap(photo);
        }
    }
}
49
Jonathan García

Pour les utilisateurs de Kotlin, n'oubliez pas d'ajouter? en data: Intent?like 

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {}
12
ugali soft

Si l'utilisateur annule la demande, les données seront retournées sous la forme NULL. Le thread lancera une nullPointerException lorsque vous appelez data.getExtras().get("data");. Je pense que vous avez juste besoin d'ajouter une condition pour vérifier si les données renvoyées sont nulles.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (requestCode == CAMERA_REQUEST) {
       if (data != null)
       {         
           Bitmap photo = (Bitmap) data.getExtras().get("data"); 
           imageView.setImageBitmap(photo);
       }
}  
10
Manto

Je recommande d'utiliser ceci:

  1. Récupérer le père Intent.

    Intent intentParent = getIntent();
    
  2. Transmettez le message directement.

    setResult(RESULT_OK, intentParent);
    

Cela empêche la perte de son activité qui générerait une erreur de données nulle.

6
Alexis Mejia

Pour les utilisateurs de Kotlin  

Vous avez juste besoin d'ajouter? avec Intention dans onActivityResult car les données peuvent être null si l'utilisateur annule la transaction ou si quelque chose ne va pas. Nous devons donc définir les données comme nullable dans onActivityResult

Il suffit de remplacer la signature onActivityResult de SampleActivity par la suivante:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
5
Nitin Karande
 protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {  
        if (requestCode == CAMERE_REQUEST && resultCode == RESULT_OK && data != null) 
        {  
           Bitmap photo = (Bitmap) data.getExtras().get("data"); 
           imageView.setImageBitmap(photo);
        } 
}

Vous pouvez vérifier si le code de résultat est égal à RESULT_OK. Ce ne sera le cas que si une photo est prise et sélectionnée et que tout fonctionne. Cette clause, si ici, devrait vérifier toutes les conditions.

4
ZeroTek

Ce message d’erreur s’est affiché parce que j’utilisais le réseau sur le fil principal et que les nouvelles versions d’Android appliquent une stratégie "stricte" pour empêcher cela. Pour vous en sortir, jetez n'importe quelle connexion réseau dans une AsyncTask.

Exemple:

    AsyncTask<CognitoCachingCredentialsProvider, Integer, Void> task = new AsyncTask<CognitoCachingCredentialsProvider, Integer, Void>() {

        @Override
        protected Void doInBackground(CognitoCachingCredentialsProvider... params) {
            AWSSessionCredentials creds = credentialsProvider.getCredentials();
            String id = credentialsProvider.getCachedIdentityId();
            credentialsProvider.refresh();
            Log.d("wooohoo", String.format("id=%s, token=%s", id, creds.getSessionToken()));
            return null;
        }
    };

    task.execute(credentialsProvider);
1
CamHart

J'ai également rencontré cette question, je l'ai résolue en ajoutant deux conditions l'une est:

resultCode != null

l'autre est:

resultCode != RESULT_CANCELED
0
user2909668

Mon problème était dans l'activité appelée quand il essaie de revenir à l'activité précédente en "finissant". Je fixais mal l’intention. Le code suivant est Kotlin.

Je faisais ceci:

        intent.putExtra("foo", "bar")
        finish()

Quand j'aurais du faire ça:

        val result = Intent()
        result.putExtra("foo", "bar")
        setResult(Activity.RESULT_OK, result)
        finish()
0
Mike Miller

J'ai rencontré ce problème lorsque j'ai essayé de transmettre un objet de modèle sérialisable. À l'intérieur de ce modèle, un autre modèle était une variable, mais il n'était pas sérialisable. C'est pourquoi je fais face à ce problème. Assurez-vous que tout le modèle à l'intérieur d'un modèle est sérialisable.

0
Shaon