2011-12-04 10 views
33

La mia app consente all'utente di premere un pulsante, apre la telecamera, può prendere una foto e verrà visualizzata in una visualizzazione di immagini. Se l'utente preme indietro o annulla mentre la fotocamera è aperta, ottengo questa forza chiusa - Risultato di consegna fallito ResultInfo {who = null, request = 1888, result = 0, data = null} all'attività ... quindi sto indovinando il risultato = 0 è il problema che cosa dovrei inserire per rendere questa chiusura forzata?java.lang.RuntimeException: Risultato di consegna non riuscito ResultInfo {who = null, request = 1888, result = 0, data = null} all'attività

Di seguito è riportato il mio codice. So che sto dimenticando qualcosa ma non riesco a capirlo! (Ammetto che sono circa 2 settimane per imparare lo 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); 
    } 

Credo che avrei bisogno di un "altro" lì da qualche parte ma non so esattamente come farlo.

seguito è la 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 
+1

Nel mio caso, l'errore era verificato a causa della rotazione accidentale della opzione 'Non tenere attività nell'opzione sviluppatore :) – theapache64

risposta

38

Aggiungendo 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); 
     } 
    } 
} 
+3

Questo ha risolto lo stesso problema per me. Cheers – Max

+2

potresti voler controllare anche i dati! = Null (così come RESULT_CANCELED) –

+1

+1 funziona in frammenti e attività, ancora Più sicuro per controllare ** if (data! = Null) **, garantisce le cose strane di vecchie versioni di Android. – MBH

9

Se l'utente annullare la richiesta, i dati saranno restituiti come NULL. Il thread genererà un nullPointerException quando si chiama data.getExtras().get("data");. Penso che sia sufficiente 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); 
     } 
} 
6

Mi consiglia di utilizzare questo:

  1. Recuperare il padre Intent.

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

    setResult(RESULT_OK, intentParent); 
    

Questo impedisce la perdita della sua attività che genererebbe un errore nei dati nullo.

3
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 controllare se il resultCode uguale RESULT_OK questo sarà solo il caso se si scatta una foto e selezionato e tutto funzionava. Questa clausola if dovrebbe controllare ogni condizione.

0

Ho anche incontrato questa domanda, ho risolto attraverso l'aggiunta di due condizioni uno è:

resultCode != null 

l'altro è:

resultCode != RESULT_CANCELED 
+0

come su resultCode! = RESULT_OK ....? In questo modo controlli tutte le condizioni che non sono ok, incluso il valore nullo – Chris

+2

resultCode! = Null non è valido poiché resultCode è int! – kylexy1357

0

questo è il mio caso

startActivityForResult(intent, PICK_IMAGE_REQUEST);

Ho definito due codici di richiesta PICK_IMAGE_REQUEST e 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 causa il problema

1

ho avuto questo messaggio di errore compare per me perché stavo usando la rete sul thread principale e le nuove versioni di Android ho un politica "severa" per impedirlo. Per aggirare basta lanciare qualsiasi chiamata di connessione di rete in un AsyncTask.

Esempio: "finitura"

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

Il mio problema era nella chiamata all'attività quando tenta di tornare all'attività precedente Stavo impostando erroneamente l'intento. Il seguente codice è Kotlin.

stavo facendo questo:

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

Quando devo fatto questo:

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