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)
Ihre 'imageUriStr' in' Log.d ("Value", imageUriStr); 'null – SripadRaj
if (prefs.contains (imageUriStr)) ändere auf if (prefs.contains ("imageUriStr")) und füge Log.d hinein wenn – comeback4you
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. –