java.lang.runtimeexception: fallimento consegna risultato risultato {who = null, request = 1888, result = 0, data = null} a

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

Domanda

La mia app consente all'utente di premere un pulsante, apre la fotocamera, può scattare una foto e verrà visualizzata in una vigilanza di immagini. Se l'utente preme indietro o si annulla mentre la fotocamera è aperta, ottengo questa forza chiusa - Errori di errore Risultati {who = null, request = 1888, risultato = 0, data = null} sull'attività ... quindi indovinerò il risultato = 0 è il problema di cosa avrei bisogno di inserire per chiudere questa forza di arresto?

Di seguito è il mio codice. So che sto dimenticando qualcosa ma non riesco a capirlo! (Certo, sono circa 2 settimane nell'apprendimento dello sviluppo di Android). Grazie per qualsiasi aiuto!

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

Immagino che avrei bisogno di un "altro" lì dentro da qualche parte, ma non so esattamente di farlo.

Di seguito è riportato il 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
È stato utile?

Soluzione

Aggiungere questo primo condizionale dovrebbe funzionare:

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

Altri suggerimenti

Per gli utenti di Kotlin non dimenticano di aggiungere? in data: Intent?piace

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

Se l'utente annulla la richiesta, i dati verranno restituiti come NULL. Il thread lancerà un nullPointerException Quando chiami data.getExtras().get("data");. Penso che devi solo aggiungere un condizionale per verificare se i dati restituiti sono nulli.

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

Consiglio di usare questo:

  1. Recuperare il padre Intent.

    Intent intentParent = getIntent();
    
  2. Trasmettere direttamente il messaggio.

    setResult(RESULT_OK, intentParent);
    

Ciò impedisce la perdita della sua attività che genererebbe un errore di dati nullo.

Per gli utenti di Kotlin

Devi solo aggiungere ? con intenti in onActivityResult Come possono essere i dati null Se l'utente annulla la transazione o qualcosa va storto. Quindi dobbiamo definire i dati come nullable in onActivityResult

Basta sostituire onActivityResult Firma della campipleattività con sotto:

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

È possibile verificare se il code di risultato è uguale a result_ok, questo sarà il caso solo se viene scattata un'immagine e tutto funzionava. Questa clausola se qui dovrebbe verificare ogni condizione.

questo è il mio caso

startActivityForResult(intent, PICK_IMAGE_REQUEST);

Ho definito due code di richiesta PICK_IMAGE_REQUESTe SCAN_BARCODE_REQUEST Con lo stesso valore, ad es.

static final int BARCODE_SCAN_REQUEST = 1;

static final int PICK_IMAGE_REQUEST = 1;

Questo potrebbe anche causare il problema

Ho avuto questo messaggio di errore per me perché stavo usando la rete sul thread principale e le nuove versioni di Android hanno una politica "rigorosa" per impedirlo. Per aggirarlo, basta lanciare qualsiasi chiamata di connessione di rete in un asyncTask.

Esempio:

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

Ho anche incontrato questa domanda, l'ho risolta aggiungendo due condizioni che uno è:

resultCode != null

l'altro è:

resultCode != RESULT_CANCELED

Il mio problema era l'attività chiamata quando cerca di tornare all'attività precedente "finendo". Ho impostato erroneamente l'intento. Il seguente codice è Kotlin.

Stavo facendo questo:

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

Quando avrei dovuto farlo:

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

Ho affrontato questo problema quando ho provato a passare un oggetto modello serializzabile. All'interno di quel modello, un altro modello era una variabile ma non era serializzabile. Ecco perché affronto questo problema. Assicurati che tutto il modello all'interno di un modello sia serializzabile.

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

Dai un'occhiata Chiave di risposta 2018

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top