java.lang.RuntimeException: résultat livrer échec resultinfo {qui = null, demande = 1888, résultat = 0, data = null} à l'activité

StackOverflow https://stackoverflow.com/questions/8373755

Question

Mon application permet à l'utilisateur d'appuyer sur un bouton, il ouvre la caméra, ils peuvent prendre une photo et il apparaîtra dans un imageview. Si l'utilisateur appuie en arrière ou annuler lorsque l'appareil photo est ouverte, je reçois cette force proche - résultat la prestation de défaillance resultinfo {qui = null, demande = 1888, résultat = 0, data = null} à l'activité ... donc je devine que le résultat = 0 est la question qu'aurais-je besoin d'insérer pour faire de cette fermeture stop force?

Voici mon code. Je sais que je suis oublier quelque chose, mais juste chiffre ne peux pas sortir! (Il est vrai que je suis environ 2 semaines dans l'apprentissage du 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);
    }  

Je suppose que je aurais besoin là-dedans quelque part un « autre », mais je ne sais pas exactement à 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
Était-ce utile?

La solution

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

Autres conseils

Pour Kotlin Les utilisateurs ne faut pas oublier d'ajouter? en data: Intent? comme

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

Si l'utilisateur annule la demande, les données sera retourné NULL. Le fil 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 est nulle.

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

Je recommande d'utiliser ceci:

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

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

    setResult(RESULT_OK, intentParent);
    

Cela permet d'éviter la perte de son activité qui générerait une erreur de données null.

Pour les utilisateurs Kotlin

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

Il suffit de remplacer la signature de onActivityResult de SampleActivity avec ci-dessous:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
 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 resultCode est égal à RESULT_OK cela ne sera le cas si une photo est prise et sélectionné et tout fonctionnait. Cette clause, si ici doit vérifier toutes les conditions.

est mon cas

startActivityForResult(intent, PICK_IMAGE_REQUEST);

I défini deux demande de code PICK_IMAGE_REQUESTand SCAN_BARCODE_REQUEST avec la même valeur, par exemple.

static final int BARCODE_SCAN_REQUEST = 1;

static final int PICK_IMAGE_REQUEST = 1;

cela pourrait provoque aussi le problème

J'ai eu ce message d'erreur apparaître pour moi parce que j'utilisais le réseau sur le thread principal et les nouvelles versions de Android ont une politique « stricte » pour empêcher cela. Pour contourner le problème il suffit de jeter tout appel de connexion réseau dans un 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);

J'ai aussi rencontré cette question, je l'ai résolu par l'ajout de deux conditions, on est:

resultCode != null

l'autre est:

resultCode != RESULT_CANCELED

Mon problème était dans l'activité appelée quand il essaie de revenir à l'activité précédente par « finition ». Je mettais mal l'intention. Le code suivant est Kotlin.

Je faisais ceci:

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

Quand je fait ceci:

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

Je fait face à ce problème quand j'ai essayé de passer un objet de modèle sérialisable. A l'intérieur de ce modèle, un autre modèle était une variable, mais qui n'a pas été sérialisable. Voilà pourquoi je fais face à ce problème. Assurez-vous que tous à l'intérieur du modèle d'un modèle est sérialisable.

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

Vérifier Clé de 2018

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top