2011-12-04 34 views
33

Moja aplikacja umożliwia użytkownikowi naciśnięcie przycisku, otwiera kamerę, może podjąć zdjęcie, które pojawi się w widoku obrazu. Jeśli użytkownik naciśnie lub anuluje, gdy kamera jest otwarta, zamykam tę siłę - Niepowodzenie dostarczania wyniku ResultInfo {who = null, request = 1888, result = 0, data = null} do działania ... więc zgaduję wynik = 0 to kwestia, co powinienem wstawić, aby zamknąć to działanie?Wywołanie java.lang.RuntimeException: niepowodzenie w dostarczaniu wyniku ResultInfo {who = null, request = 1888, result = 0, data = null} do działania

Poniżej znajduje się mój kod. Wiem, że zapominam o czymś, ale po prostu nie mogę tego zrozumieć! (Wprawdzie mam około 2 tygodnie na naukę rozwoju Androida). Dzięki za pomoc!

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

Sądzę, że potrzebowałbym czegoś innego, ale nie wiem dokładnie, jak to zrobić.

poniżej jest 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

W moim przypadku błędu doszło z powodu przypadkowego toczenia opcji „Nie trzymaj działania w opcji programisty :) – theapache64

Odpowiedz

38

Dodawanie ten pierwszy warunkowy powinno działać:

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

To rozwiązało dla mnie ten sam problem. Pozdrawiam – Max

+2

możesz również chcieć sprawdzić, czy dane! = Null (jak również RESULT_CANCELED) –

+1

+1 działa w fragmentach i działaniach, nadal Bezpieczniej jest sprawdzić ** if (data! = Null) **, gwarantuje dziwne rzeczy starych wersji Androida. – MBH

9

Jeśli użytkownik anulować żądanie, dane zostaną zwrócone jako NULL. Wątek rzuci nullPointerException, gdy zadzwonisz pod numer data.getExtras().get("data");. Myślę, że wystarczy dodać warunek, aby sprawdzić, czy zwrócone dane mają wartość null.

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

polecam za pomocą tego:

  1. Odzyskać ojca Intent.

    Intent intentParent = getIntent(); 
    
  2. Prześlij wiadomość bezpośrednio.

    setResult(RESULT_OK, intentParent); 
    

To zapobiega utracie swojej działalności, które generują null błąd danych.

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

Można sprawdzić, czy parametr resultCode jest równy RESULT_OK, będzie to miało miejsce tylko w przypadku, gdy zdjęcie zostało zrobione i wybrane i wszystko działało. Ta klauzula if powinna sprawdzić każdy warunek.

0

ja również napotkał na to pytanie, mam rozwiązać go poprzez dodanie dwóch warunków jeden jest:

resultCode != null 

drugi jest:

resultCode != RESULT_CANCELED 
+0

co powiesz na temat resultCode! = RESULT_OK ....? W ten sposób sprawdzasz wszystkie warunki, które nie są w porządku, w tym zerowy – Chris

+2

resultCode! = Null jest nieprawidłowy, ponieważ resultCode is int! – kylexy1357

0

to moja sprawa

startActivityForResult(intent, PICK_IMAGE_REQUEST);

Zdefiniowałem dwa kody żądania PICK_IMAGE_REQUEST i SCAN_BARCODE_REQUEST o tej samej wartości, np.

static final int BARCODE_SCAN_REQUEST = 1;

static final int PICK_IMAGE_REQUEST = 1;

może to również powoduje problem

1

miałem ten komunikat o błędzie pojawi się na mnie, bo byłem przy użyciu sieci w głównym wątku i nowe wersje Androida mają "ścisła" polityka, aby temu zapobiec. Aby ominąć to po prostu wyrzuć cokolwiek połączenie sieciowe do AsyncTask.

Przykład: „wykończenia”

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

Mój problem był w nazwie aktywności, gdy próbuje powrócić do poprzedniej czynności przez Niepoprawnie ustawiłem zamiar. Poniższy kod to Kotlin.

robiłem to:

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

Kiedy należy zostały w ten sposób:

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