2016-07-13 2 views
0

Also im Grunde möchte ich die App: nach dem Drücken einer Schaltfläche öffnet die Galerie, der Benutzer wählt ein Bild und speichert danach die URL in einer Variablen. Das ist alles, was es tun muss, aber was ich gefunden habe, ist, dass nach dem Aufruf von startActivityForResult() der nachfolgende Code immer noch im Hintergrund läuft und einen NullPointerException-Fehler erzeugt, da die gewünschte Variable noch nicht aus der Absicht abgerufen wurde.Nach dem Aufruf von startActivityForResult() folgt der nachfolgende Code immer noch

public class MainActivity extends AppCompatActivity { 

    final static int PICK_IMAGE_REQUEST = 1; 

    private String imageUriStr; 

    SharedPreferences prefs; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     prefs = this.getSharedPreferences("MyPreferences",MODE_PRIVATE); 

     ImageView addImgButton = (ImageView) findViewById(R.id.add_img_button); 

     addImgButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Intent intent = new Intent(); 
       intent.setType("image/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST); 

       if (prefs.contains(imageUriStr)) { 
        imageUriStr = prefs.getString("imageUriStr", ""); //Get the data from prefs 
       } 

       Log.d("Value",imageUriStr); //verify if it is correct 

       prefs.edit().clear(); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { 

      imageUriStr = data.getData().toString(); //convert to string to use it with SharedPreferences 

      prefs.edit().putString("imageUriStr",imageUriStr).apply(); 

     } 

    } 
} 

Eine Lösung wäre, alles innerhalb des onActivityResult zu tun, aber ich möchte auch später Benutzer eine andere Absicht, das Bild beschneiden auf der Grundlage dieses uri, aber ich denke, eine Absichtserklärung innerhalb eines onActivityResult zu chaotisch sein wird oder ist es akzeptabel? Ich denke, ich vermisse etwas.

mit meinem Code Keeping generiert dieses

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.android.prototypeapp, PID: 17826 
java.lang.NullPointerException: println needs a message 
    at android.util.Log.println_native(Native Method) 
    at android.util.Log.d(Log.java:154) 
    at com.example.android.prototypeapp.MainActivity$1$override.onClick(MainActivity.java:41) 
    at com.example.android.prototypeapp.MainActivity$1$override.access$dispatch(MainActivity.java) 
    at com.example.android.prototypeapp.MainActivity$1.onClick(MainActivity.java:0) 
    at android.view.View.performClick(View.java:5264) 
    at android.view.View$PerformClick.run(View.java:21297) 
    at android.os.Handler.handleCallback(Handler.java:743) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:150) 
    at android.app.ActivityThread.main(ActivityThread.java:5546) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 
+0

Ihre 'imageUriStr' in' Log.d ("Value", imageUriStr); 'null – SripadRaj

+0

if (prefs.contains (imageUriStr)) ändere auf if (prefs.contains ("imageUriStr")) und füge Log.d hinein wenn – comeback4you

+0

Danke das hat funktioniert! So funktioniert es ?: Nach dem Aufruf von startActivityForResult wird der nachfolgende Code immer noch im Hintergrund ausgeführt und nachdem er zurückkommt, wird er von der Zeile nach startActivityForResult übernommen. –

Antwort

0

Ihre private String imageUriStr; ist null.Since es null ist Ihnen Null-Zeiger Ausnahme bekommen. Weisen Sie ihm die leere Zeichenfolge zu: private String imageUriStr = "";.

UND

Check in gemeinsamen Vorlieben wie: if(prefs.contains("imageUriStr"))

0

Sie Ihren Code auf dieser Linie abstürzt:

Log.d("Value",imageUriStr); 

Grund: imageUriStr Wert ist null und eine gültige Nachricht erforderlich ist zu drucken das Protokoll

Sie können entweder Log als verwenden:

Log.d("Value","Image URI Value: "+imageUriStr); 

oder Sie können Ihre Log nach innen setzen, wenn Block wie:

 if (prefs.contains(imageUriStr)) { 
         imageUriStr = prefs.getString("imageUriStr", "");//Get the data from prefs 
      Log.d("Value",imageUriStr); //verify if it is correct 
             } 
Verwandte Themen