Cookie wird anscheinend nicht immer gespeichert

  • Antworten:10
Tim B.
  • Forum-Beiträge: 101

07.03.2014, 20:20:13 via Website

Hallo, ich habe eine App gebaut, mit der man sich mittels zwei EditText-Boxen auf einer Website anmelden kann (http://ggnauen.de). Dabei wird auch die "angemeldet bleiben" Box aktiviert. Das soll allerdings nur beim ersten App start passieren. Bei jedem weiteren Start der App soll direkt eine Unterseite der Website aufgerufen werden, die eben nur erreichbar ist, wenn man angemeldet ist.
Mein Problem ist nun, dass das eben nicht immer funktioniert... Ich habe den Eindruck, dass man sich erst eine Weile auf der Website befinden muss, damit man die App schließen kann, sie wieder öffnet und sich direkt die Unterseite öffnet. Das ganze schreibe ich in AndroidStudio. Meine App benötigt zur zeit nur die Berechtigung für Internet Zugang. Es ist auch denkbar, dass die Website das Problem verursacht, weil diese schon sehr alt und auch ziemlich schlecht programmiert ist. Aber irgendwie muss es ja eine Lösung geben...
Hier mein Code der MainActivity:

1package com.timbremer.vertretungsplanggnauen;
2
3import android.app.Activity;
4import android.app.AlertDialog;
5import android.net.Uri;
6import android.os.Bundle;
7import android.view.MenuItem;
8import android.content.Context;
9import android.content.Intent;
10import android.support.v4.app.NavUtils;
11import android.view.Menu;
12import android.view.View;
13import android.view.View.OnClickListener;
14import android.view.WindowManager;
15import android.view.inputmethod.InputMethodManager;
16import android.webkit.CookieManager;
17import android.webkit.CookieSyncManager;
18import android.webkit.WebView;
19import android.webkit.WebViewClient;
20import android.widget.EditText;
21import android.widget.Toast;
22
23public class MainActivity extends Activity {
24
25
26 private View buttonLogin;
27 private EditText etusername;
28 private EditText etpassword;
29 private WebView wv;
30 private boolean send;
31
32 @Override
33 protected void onCreate(Bundle savedInstanceState) {
34 super.onCreate(savedInstanceState);
35 setContentView(R.layout.activity_main);
36 setTitle("Vertretungsplan");
37
38 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
39 getWindow().setSoftInputMode(
40 WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
41
42 buttonLogin = findViewById(R.id.btlogin);
43 send = false;
44 wv = (WebView) findViewById(R.id.wv);
45 etusername = (EditText) findViewById(R.id.etusername);
46 etpassword = (EditText) findViewById(R.id.etpassword);
47
48 //SHAREDPREFS:FIRSTRUN
49 boolean firstrun = getSharedPreferences("PREFERENCE", MODE_PRIVATE).getBoolean("firstrun", true);
50 if (firstrun){
51
52
53 wv.setVisibility(View.INVISIBLE);
54
55 buttonLogin.setOnClickListener(new OnClickListener() {
56
57 private String username;
58 private String password;
59
60
61
62 @Override
63 public void onClick(View v) {
64 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
65 getWindow().setSoftInputMode(
66 WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
67 wv.setVisibility(View.VISIBLE);
68
69
70 username = etusername.getText().toString();
71
72 password = etpassword.getText().toString();
73
74
75
76 wv.getSettings().setBuiltInZoomControls(true);
77 CookieManager.getInstance().setAcceptCookie(true);
78 wv.getSettings().setJavaScriptEnabled(true);
79 wv.getSettings().setLoadWithOverviewMode(true);
80 wv.setWebViewClient(new WebViewClient() {
81
82 @Override
83 public boolean shouldOverrideUrlLoading(WebView view, String url) {
84 view.loadUrl(url);
85 return true;
86 }
87 String text = "yes";
88 @Override
89 public void onPageFinished(WebView view, String url) {
90 if(!send) {
91 view.loadUrl("javascript:{" +
92 "document.getElementById('mod_login_username').value='" + username + "';" +
93 "document.getElementById('mod_login_password').value = '" + password + "';" +
94 "document.getElementById('mod_login_remember').checked='true';" +
95 "var form = document.getElementsByName('login');" +
96 "form[0].submit();};"
97 );
98 send = true;
99 }
100 }
101 });
102
103 wv.loadUrl("http://www.ggnauen.de/index.php?option=com_frontpage&Itemid=1");
104 }
105
106 });
107
108
109 }
110
111
112
113 // Save the state
114 getSharedPreferences("PREFERENCE", MODE_PRIVATE)
115 .edit()
116 .putBoolean("firstrun", false)
117 .commit();
118
119
120 wv.getSettings().setBuiltInZoomControls(true);
121 CookieManager.getInstance().setAcceptCookie(true);
122 wv.getSettings().setJavaScriptEnabled(true);
123 wv.getSettings().setLoadWithOverviewMode(true);
124 wv.getSettings().setUseWideViewPort(true);
125 wv.loadUrl("http://www.ggnauen.de/index.php?option=com_content&task=category&sectionid=2&id=19&Itemid=100");
126 wv.setWebViewClient(new WebViewClient() {
127
128 @Override
129 public boolean shouldOverrideUrlLoading(WebView view, String url) {
130 view.loadUrl(url);
131 return true;
132 }
133
134 });
135 }
136
137
138
139
140 @Override
141 public boolean onCreateOptionsMenu(Menu menu) {
142 // Inflate the menu; this adds items to the action bar if it is present.
143 getMenuInflater().inflate(R.menu.raumplan, menu);
144 return true;
145 }
146 @Override
147 public boolean onOptionsItemSelected(MenuItem item) {
148 // Handle item selection
149 switch (item.getItemId()) {
150 case R.id.mclose:
151 finish();
152 return true;
153 case R.id.msettings:
154 startActivity(new Intent(this, SettingsActivity.class));
155 return true;
156 case R.id.mhome:
157 startActivity(new Intent(this, MainActivity.class));
158 return true;
159 case R.id.mraumplan:
160 startActivity(new Intent(this, RaumplanActivity.class));
161 return true;
162 case android.R.id.home:
163 NavUtils.navigateUpFromSameTask(this);
164 return true;
165 case R.id.mbewerten:
166 Intent i = new Intent(Intent.ACTION_SEND);
167 i.setType("message/rfc822");
168 i.putExtra(Intent.EXTRA_EMAIL, new String[]{"tbremer19@gmail.com"});
169 i.putExtra(Intent.EXTRA_SUBJECT, "Feedback: GGN Vertretungsplan App");
170 try {
171 startActivity(Intent.createChooser(i, "Email senden..."));
172 } catch (android.content.ActivityNotFoundException ex) {
173 Toast.makeText(MainActivity.this, "Keine App zum Verschicken einer Email gefunden!", Toast.LENGTH_SHORT).show();
174 }
175 return true;
176 default:
177 return super.onOptionsItemSelected(item);
178 }
179 }
180
181}

Weiß jemand eine Lösung für mein Problem? Die App soll an meiner Schule eingestzt werden und da können die Schüler nicht einfach die Daten löschen und es noch einmal versuchen.

Vielen Dank
Tim

Der Startbildschirm (wird nur beim ersten App-Start angezeigt). Wenn man den Button klickt, wird die WebView dahinter sichtbar gemacht und man wird angemeldet.


So soll es dann bei jedem weiteren App-Start aussehen. Das ist die Unterseite, man ist noch angemeldet. (WebView gezoomt)


So sieht es aber manchmal aus. Das ist die Unterseite, man ist nicht angemeldet. (WebView gezoomt)

— geändert am 07.03.2014, 20:43:29

LG Optimus Me mit Root

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 20:47:29 via Website

Hmm, muss du die auf der Seite befindenden hidden Felder nicht auch mit posten, oder wird das automatisch gemacht. (Bin mir da nicht ganz sicher)

Da du aber schreibst, dass der Code nicht immer funktioniert schließe ich irgendwo eine Instabilität. Tut denn der Login wenn die App zum ersten mal gestartet wird?
Alternativ noch, das laden einer lokalen HTML, in der nur das Form enthalten ist, dies dann abschicken und dann ist man eingeloggt

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Tim B.
  • Forum-Beiträge: 101

07.03.2014, 21:02:57 via Website

Das erste hat leider auch keinen Erfolg gebracht. Ja, beim ersten Starten der App funktioniert das anmelden ohne Probleme. Dazu muss ich noch sagen, dass das login form auf der Unterseite nicht vorhanden ist.

LG Optimus Me mit Root

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 21:07:24 via Website

Wie sieht dann das Login aus, wenn der user die App schon benutzt hat?
Da ist es doch anders oder tusche ich mich da?
Ich habe in deinem Code keinen else zweig endeckt

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Tim B.
  • Forum-Beiträge: 101

07.03.2014, 21:10:30 via Website

bei jedem weiteren start soll man sich ja eben nicht mehr einloggen müssen. Die "angemeldet bleiben" checkbox auf der website wurde ja aktiviert. Es kann natürlich auch sein, dass das mit cookies zutun hat, jedoch habe ich mich mit denen noch nie beschäftigt und wüsste nicht wie ich das einbauen müsste...

LG Optimus Me mit Root

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 21:12:30 via Website

Das hat was mit den Cookeis zutun, da man diese nicht behätl. Du musstes sie nin shred prefs speichern.
Oder du speicherst die Anmeldedaten und machst es jedes mal neu.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Tim B.
  • Forum-Beiträge: 101

07.03.2014, 21:13:51 via Website

Kannst du mir dafür vielleicht ein Beispiel geben? Wie gesagt, ich kenne mich damit überhaupt nicht aus, weil ich cookies noch nie gebraucht habe.

LG Optimus Me mit Root

Antworten
Tim B.
  • Forum-Beiträge: 101

07.03.2014, 21:45:21 via Website

Ich habe jetzt eine Lösung gefunden. Eine sehr seltsame wie ich finde... Jedenfalls funktioniert alles, wenn man nach der allerersten Anmeldung die beenden schaltfläche im menü klickt obwohl diese nur den finish(); befehl ausführt.

LG Optimus Me mit Root

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 22:05:17 via Website

Ähm.. nicht dein ernst. Du willst das ernsthaft so lassen. Irgendwann wird das Problem wieder auftreten, ausserdem kann das mit andenen devices ganz anders sein..

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Tim B.
  • Forum-Beiträge: 101

07.03.2014, 22:12:10 via Website

Natürlich will ich es nicht so lassen. Ich bin halt froh, dass ich wenigstens eine Lösung dafür gefunden habe.

LG Optimus Me mit Root

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 22:44:28 via Website

Dann Speicher entweder den Cookie oder Die Session (Kommt ganz darauf an, ob im php der Login Seite ein Session Time-out eingebaut wurde)
wenn da, muss du dich bei jedem Appstart wieder neu einloggen und am anfang ggf. Benutzer und Passwort spechern

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten