Login-App über JSON-Parser

  • 18 Antworten
  • Neuester Beitrag
Diskutiere Login-App über JSON-Parser im Android App Entwicklung im Bereich Betriebssysteme & Apps.
joshua1996

joshua1996

Stammgast
Hallo,
zur Zeit arbeite ich an meiner (ersten) Android-App. Nun Versuche ich, mich mit der App einzuloggen (die App ist Bestandteil eines Schulprojektes) Die Daten beziehe ich über PHP aus einer MySQL-Datenbank. Die Daten sollen dann über JSON ausgegeben werden und von der Android App gelesen werden.

Als Vorlage hab ich das Tutorial verwendet: Android JSON Parsing from URL - Example

Nun habe ich Versucht die Daten über GET einfach an die URL zu senden, was nur bedingt funktioniert hat (die App hat sich aufgehangen/eingefroren, kein FC)
Dann hab ich ein wenig dazu gegooglet und hab mich über den Async-Task informiert und eingebaut. Nun bekomme ich einen Forceclose wenn ich auf den Login-Button klicke.

Der Logcat sagt mir folgendes:

03-21 17:12:50.615: I/ActivityManager(1036): START u0 {cmp=de.swg/.MainActivity (has extras)} from pid 3561
03-21 17:12:50.618: W/ContextImpl(1268): Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1244 android.content.ContextWrapper.sendBroadcast:365 com.motorola.motocare.util.TriggerHelper$TriggerBuilder.send:76 com.motorola.motocare.internal.frameworkevents.PauseResumeTrigger.handleFrameworkEvent:53 com.motorola.motocare.internal.frameworkevents.FwEventMonitor$FrameworkListener.processFrameworkEvent:114
03-21 17:12:50.673: W/ContextImpl(1268): Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1244 android.content.ContextWrapper.sendBroadcast:365 com.motorola.motocare.util.TriggerHelper$TriggerBuilder.send:76 com.motorola.motocare.internal.frameworkevents.PauseResumeTrigger.handleFrameworkEvent:53 com.motorola.motocare.internal.frameworkevents.FwEventMonitor$FrameworkListener.processFrameworkEvent:114
03-21 17:12:50.714: W/ResourceType(3561): No package identifier when getting value for resource number 0x00000000
03-21 17:12:50.715: D/AndroidRuntime(3561): Shutting down VM
03-21 17:12:50.715: W/dalvikvm(3561): threadid=1: thread exiting with uncaught exception (group=0x41644d40)
03-21 17:12:50.720: E/AndroidRuntime(3561): FATAL EXCEPTION: main
03-21 17:12:50.720: E/AndroidRuntime(3561): Process: de.swg, PID: 3561
03-21 17:12:50.720: E/AndroidRuntime(3561): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.swg/de.swg.MainActivity}: android.content.res.Resources$NotFoundException: String resource ID #0x0
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.app.ActivityThread.access$800(ActivityThread.java:139)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.os.Handler.dispatchMessage(Handler.java:102)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.os.Looper.loop(Looper.java:136)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.app.ActivityThread.main(ActivityThread.java:5102)
03-21 17:12:50.720: E/AndroidRuntime(3561): at java.lang.reflect.Method.invokeNative(Native Method)
03-21 17:12:50.720: E/AndroidRuntime(3561): at java.lang.reflect.Method.invoke(Method.java:515)
03-21 17:12:50.720: E/AndroidRuntime(3561): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-21 17:12:50.720: E/AndroidRuntime(3561): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-21 17:12:50.720: E/AndroidRuntime(3561): at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
03-21 17:12:50.720: E/AndroidRuntime(3561): at dalvik.system.NativeStart.main(Native Method)
03-21 17:12:50.720: E/AndroidRuntime(3561): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.content.res.Resources.getText(Resources.java:244)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.content.res.XResources.getText(XResources.java:508)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.widget.TextView.setText(TextView.java:3894)
03-21 17:12:50.720: E/AndroidRuntime(3561): at de.swg.MainActivity.onCreate(MainActivity.java:34)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.app.Activity.performCreate(Activity.java:5248)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
03-21 17:12:50.720: E/AndroidRuntime(3561): ... 12 more
03-21 17:12:50.736: W/ActivityManager(1036): Force finishing activity de.swg/.MainActivity
03-21 17:12:50.737: W/ActivityManager(1036): Force finishing activity de.swg/.LoginActivity
Mein Code der Login-Activity:

package de.swg;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;


public class LoginActivity extends Activity {

private EditText EtEMAIL;
private EditText EtPASSWORD;
private TextView Error;
private ProgressDialog pDialog;
String success = null;
String id = null;

//URL to get JSON Array
private static String url1 = "http://www.bkconnect.bplaced.net/JSON/json_login.php?email=";
String url = "";

//JSON Node Names
private static final String TAG_USER = "user";
private static final String TAG_ID = "id";
private static final String TAG_EMAIL = "email";
private static final String TAG_PASSWORD = "password";
private static final String TAG_BOOL = "bool";

JSONArray user = null;

//Shardeprefs-Strings für das einspeichern von E-Mail
private final String PREFS_EMAIL ="...";
private final String PREFS_SAVEEMAIL = "...";

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);

EtEMAIL = (EditText)findViewById(R.id.eTEmail);
EtPASSWORD = (EditText)findViewById(R.id.eTPassword);
Error = (TextView)findViewById(R.id.textView1);

EtEMAIL.setText(getSharedPreferences(PREFS_EMAIL, MODE_PRIVATE).getString(PREFS_SAVEEMAIL, null));
}


public void ClickAnmelden (View v) {

EtEMAIL = (EditText)findViewById(R.id.eTEmail);
EtPASSWORD = (EditText)findViewById(R.id.eTPassword);
Error = (TextView)findViewById(R.id.textView1);

if (EtEMAIL.getText().toString().length() == 0 || EtPASSWORD.getText().toString().length() == 0) {
Error.setVisibility(View.VISIBLE);
}
else {

getSharedPreferences(PREFS_EMAIL, MODE_PRIVATE).edit().putString(PREFS_SAVEEMAIL, EtEMAIL.getText().toString()).commit();
url = url1 + EtEMAIL.getText().toString() + "&password" + EtPASSWORD.getText().toString();
new Login().execute();

Intent newIntent = new Intent(this, MainActivity.class);
newIntent.putExtra("success", success);
newIntent.putExtra("id", id);
startActivity(newIntent);
}
}

/**
* Background Async Task to Login
* */
class Login extends AsyncTask<String, String, String> {

/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(LoginActivity.this);
pDialog.setMessage("Loggin in ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}

/**
* Saving product
* */
protected String doInBackground(String... args) {

// Creating new JSON Parser
JSONParser jParser = new JSONParser();

// Getting JSON from URL
JSONObject json = jParser.getJSONFromUrl(url);

try {
// Getting JSON Array
user = json.getJSONArray(TAG_USER);
JSONObject c = user.getJSONObject(0);

// Storing JSON item in a Variable
String id = c.getString(TAG_ID);
String bool = c.getString(TAG_BOOL);


} catch (JSONException e) {
e.printStackTrace();
}
return id;
}

/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
// dismiss the dialog once product updated
pDialog.dismiss();
}
}
}
Die JSON-Parser Klasse:

package de.swg;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public JSONObject getJSONFromUrl(String url) {
// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}
Das PHP-Script gibt mir bei erfolgreichem Login folgendes zurück:

{ "user": [ { "id": "11", "bool": "true" } ] }

Bei fehlgeschlagenem Login:

{ "user": [ { "id": "0", "bool": "false" } ] }



Ich vermute mal das dass Problem bei meinem asyncronem Task liegt, weiß aber nicht wo genau... Bin für jede Hilfe dankbar ;)
 
Z

Zoopa

Stammgast
Na dann verfolgen wir mal den Fehler zurück :winki:

03-21 17:12:50.720: E/AndroidRuntime(3561): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.content.res.Resources.getText(Resources.ja va:244)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.content.res.XResources.getText(XResources. java:508)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.widget.TextView.setText(TextView.java:3894 )
03-21 17:12:50.720: E/AndroidRuntime(3561): at de.swg.MainActivity.onCreate(MainActivity.java:34)
03-21 17:12:50.720: E/AndroidRuntime(3561): at android.app.Activity.performCreate(Activity.java:5 248)
irgendwo in der onCreate-Methode deiner MainActivity wird also setText aufgerufen, und zwar mit einer Resource-ID, die 0 ist.

Ein TextView hat einen Konstruktor, der einen int (genauer: eine Resourcen-ID) als Parameter erwartet. Würde also zur Fehlermeldung passen, die sagt ja, dass keine Resource mit ID 0 existiert.

Du musst also dafür sorgen, dass du ins TextView einen Text schreibst, und keine Zahl. Eine Zahl kannst du folgendermassen in einen String umwandeln:
Code:
String.valueOf(...);
 
Zuletzt bearbeitet:
joshua1996

joshua1996

Stammgast
Erstmal danke für den Hinweiß ;)

Hab in der MainActivity tatsächlich TV2.setText(getIntent().getExtras().getInt("id")); stehen :rolleyes2:



Hab es jetzt zu getString abgeändert und sofort getestet. Nachdem ich Passwort und Email eingegeben habe und auf den Login-Button gedrückt habe, erscheint gaaaanz kurz der ProgressDialog, und sofort dannach öffnet sich die MainActivity (besteht nur aus 2 Textfeldern um zu gucken ob der Login erfolgreich war und ich eine ID zurück bekomme)

Die TextViews sind aber leer :/ und da nach gibt es sofort einen FC.



03-22 13:22:28.206: E/JSON Parser(26404): Error parsing data org.json.JSONException: Expected ':' after n at character 12 of {n "user": [n {n "id": "0",n "bool": "false"n }n ]n }n

03-22 13:22:28.208: W/dalvikvm(26404): threadid=13: thread exiting with uncaught exception (group=0x41644d40)

03-22 13:22:28.213: E/AndroidRuntime(26404): FATAL EXCEPTION: AsyncTask #3

03-22 13:22:28.213: E/AndroidRuntime(26404): Process: de.swg, PID: 26404

03-22 13:22:28.213: E/AndroidRuntime(26404): java.lang.RuntimeException: An error occured while executing doInBackground()

03-22 13:22:28.213: E/AndroidRuntime(26404): at android.os.AsyncTask$3.done(AsyncTask.java:300)

03-22 13:22:28.213: E/AndroidRuntime(26404): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)

03-22 13:22:28.213: E/AndroidRuntime(26404): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)

03-22 13:22:28.213: E/AndroidRuntime(26404): at java.util.concurrent.FutureTask.run(FutureTask.java:242)

03-22 13:22:28.213: E/AndroidRuntime(26404): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)

03-22 13:22:28.213: E/AndroidRuntime(26404): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)

03-22 13:22:28.213: E/AndroidRuntime(26404): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)

03-22 13:22:28.213: E/AndroidRuntime(26404): at java.lang.Thread.run(Thread.java:841)

03-22 13:22:28.213: E/AndroidRuntime(26404): Caused by: java.lang.NullPointerException

03-22 13:22:28.213: E/AndroidRuntime(26404): at de.swg.LoginActivity$Login.doInBackground(LoginActivity.java:107)

03-22 13:22:28.213: E/AndroidRuntime(26404): at de.swg.LoginActivity$Login.doInBackground(LoginActivity.java:1)

03-22 13:22:28.213: E/AndroidRuntime(26404): at android.os.AsyncTask$2.call(AsyncTask.java:288)

03-22 13:22:28.213: E/AndroidRuntime(26404): at java.util.concurrent.FutureTask.run(FutureTask.java:237)

03-22 13:22:28.213: E/AndroidRuntime(26404): ... 4 more

03-22 13:22:28.258: W/ActivityManager(1036): Force finishing activity de.swg/.MainActivity


Aus dem Logcat lese ich (als blutiger Anfänger ;) ) dass mir das PHP-Script irgendwas falsches zurück gibt, zum einen der Syntaxfehler mit den ganzen Leerzeichen und den "n"'s, und zum anderen die ID "0" und der Bool "false" obwohl die Logindaten richtig sind :sad:



Ich vermute mal das die URL für den JSON-Parse nicht richtig übernommen wird, sprich das EMail und Password nicht in die URL eingefügt werden. Zum anderen hab ich einen Fehler in der PHP-Ausgabe, wo weiß ich nicht genau.



Stehe also ziemlich aufm Schlauch :D

Wer kann mir auf die Sprünge helfen :rolleyes2:
 
Linux4ever

Linux4ever

Fortgeschrittenes Mitglied
Nicht ganz....

Das sagt Logcat:
03-22 13:22:28.213: E/AndroidRuntime(26404): Caused by: java.lang.NullPointerException
03-22 13:22:28.213: E/AndroidRuntime(26404): at de.swg.LoginActivity$Login.doInBackground(LoginAct ivity.java:107)
Schau mal in die LoginActivity in Zeile 107. Da müsste eine Variable stehen, die noch den Wert null hat. Also wenn
Code:
example.machEtwas(etwas);
da steht, würde ich als erstes auf example tippen.

EDIT: Setze mal vor url oben ein public, da Du von einer anderen Klasse darauf zugreifst...
 
Zuletzt bearbeitet:
joshua1996

joshua1996

Stammgast
Url1 ist ja nur der erste Teil der URL, welcher nachher mit dem Input von dem EditText Email und Password in den String URL gespeichert wird und dann von dem JSON-Parser aufgerufen wird.
Oder irre ich mich da?

Werde morgen mal Line 107 überprüfen, danke schon mal ;)
 
Linux4ever

Linux4ever

Fortgeschrittenes Mitglied
joshua1996 schrieb:
Url1 ist ja nur der erste Teil der URL, welcher nachher mit dem Input von dem EditText Email und Password in den String URL gespeichert wird und dann von dem JSON-Parser aufgerufen wird.
Oder irre ich mich da?

Werde morgen mal Line 107 überprüfen, danke schon mal ;)
Ja, passt, habe die Zeile überlesen.... Aber setze mal vor String url ein public...
 
joshua1996

joshua1996

Stammgast
Soviel wie ich in der Schule gelernt habe (allerdings nur C#) ist public doch standardmäßig drin? Heißt wenn ich nix davor schreibe, ist sie public.

Ist das bei Java anders oder sollte ich besser in der Schule aufpassen :p
 
Linux4ever

Linux4ever

Fortgeschrittenes Mitglied
joshua1996 schrieb:
Soviel wie ich in der Schule gelernt habe (allerdings nur C#) ist public doch standardmäßig drin? Heißt wenn ich nix davor schreibe, ist sie public.

Ist das bei Java anders oder sollte ich besser in der Schule aufpassen :p
Das ist eine gute Frage.... So genau habe ich mich noch nie damit beschäftigt. Ich schreibe halt immer private oder public hin, damit es a) schöner aussieht und b) mehr oder weniger korrekt ist.... :rolleyes2: Kannst ja mal ausprobieren, vlt. funktioniert es...:biggrin:
 
joshua1996

joshua1996

Stammgast
Okay :D
Werd es morgen mal ergänzen und dann berichten bzw nen neuen Logcat zeigen :rolleyes2:

Und nochmal danke für deine Hilfe ;)
 
markus.tullius

markus.tullius

Experte
Wenn bei Java kein Modifikator vorsteht, sind sie im package sichtbar.

Ist bei C# eine Klasse nicht immer internal und die members private, wenn nichts vorsteht?
 
joshua1996

joshua1996

Stammgast
Hab grad mal nachgeguckt und Zeile 107 ist aus kommentiert gewesen O.o (also kein Code oder sowas)
Werd jetzt nochmal gucken ob ich irgendwo noch eine leere Variable habe.

Edit:
Das Problem mit dem falschen JSON-Array habe ich behoben ;)
Habe vergessen hinter URL=url1 + EtEMAIL.getText().toString + "&password" ein = zu setzten :confused:

Sagen wir mal Flüchtigkeit Fehler xD

Neuer Logcat sagt:
03-23 13:27:08.165: E/JSON Parser(21351): Error parsing data org.json.JSONException: Expected ':' after n at character 12 of {n "user": [n {n "id": "11",n "bool": "true"n }n ]n }n

03-23 13:27:08.165: W/dalvikvm(21351): threadid=13: thread exiting with uncaught exception (group=0x41659d40)

03-23 13:27:08.169: E/AndroidRuntime(21351): FATAL EXCEPTION: AsyncTask #3

03-23 13:27:08.169: E/AndroidRuntime(21351): Process: de.swg, PID: 21351

03-23 13:27:08.169: E/AndroidRuntime(21351): java.lang.RuntimeException: An error occured while executing doInBackground()

03-23 13:27:08.169: E/AndroidRuntime(21351): at android.os.AsyncTask$3.done(AsyncTask.java:300)

03-23 13:27:08.169: E/AndroidRuntime(21351): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)

03-23 13:27:08.169: E/AndroidRuntime(21351): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)

03-23 13:27:08.169: E/AndroidRuntime(21351): at java.util.concurrent.FutureTask.run(FutureTask.java:242)

03-23 13:27:08.169: E/AndroidRuntime(21351): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)

03-23 13:27:08.169: E/AndroidRuntime(21351): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)

03-23 13:27:08.169: E/AndroidRuntime(21351): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)

03-23 13:27:08.169: E/AndroidRuntime(21351): at java.lang.Thread.run(Thread.java:841)

03-23 13:27:08.169: E/AndroidRuntime(21351): Caused by: java.lang.NullPointerException

03-23 13:27:08.169: E/AndroidRuntime(21351): at de.swg.LoginActivity$Login.doInBackground(LoginActivity.java:108)

03-23 13:27:08.169: E/AndroidRuntime(21351): at de.swg.LoginActivity$Login.doInBackground(LoginActivity.java:1)

03-23 13:27:08.169: E/AndroidRuntime(21351): at android.os.AsyncTask$2.call(AsyncTask.java:288)

03-23 13:27:08.169: E/AndroidRuntime(21351): at java.util.concurrent.FutureTask.run(FutureTask.java:237)

03-23 13:27:08.169: E/AndroidRuntime(21351): ... 4 more

03-23 13:27:08.174: W/ActivityManager(1034): Force finishing activity de.swg/.MainActivity
In Line 108 steht: user = json.getJSONArray(TAG_USER);

user ist das JSON-Array in das im optimal Fall gespeichert werden sollte.

Und dann ist da noch das Problem mit:

03-23 13:27:08.165: E/JSON Parser(21351): Error parsing data org.json.JSONException: Expected ':' after n at character 12 of {n "user": [n {n "id": "11",n "bool": "true"n }n ]n }n


Normalerweise sollte das Array richtig sein, weiß also nicht wo der Fehler liegt.

Schonmal danke für eure Gedult ;)
 
Zuletzt bearbeitet:
joshua1996

joshua1996

Stammgast
Kann mir keiner helfen?
 
Sentenza

Sentenza

Erfahrenes Mitglied
Ich würde mal nachschauen wo diese "n"s herkommen. Ob die schon das PHP-Script liefert, oder sie beim laden entstehen. Es könnten Newline-Zeichen sein ( \n ) bei denen das \ entfernt wurde
 
Linux4ever

Linux4ever

Fortgeschrittenes Mitglied
Ich würde auch mal das json-Objekt vor der Zeile 108 ausgeben. (.toString()) Einfach nur zu überprüfen, ob da was drinsteht und wenn ja, was...

Ansonsten, falls es wirklich nicht klappt, mach es zur Not über XML oder quick'n'dirty mit Trennern wie | und dann einfach den String in ein Array auftrennen... Bei wenigen Daten ist dies ja durchaus möglich...
 
Zuletzt bearbeitet:
joshua1996

joshua1996

Stammgast
@Linux4ever: Hättest du eventuell ein guten Link für XML?
Schätze es wir trotzdem mit PHP geregelt und bekomme es dann nur im xml-format wieder?

Werde gleich einmal beides versuchen ;)
Das mit den newlines sollten es eigentlich nicht sein, weil das PHP-Script ja auch alles in einer Linie wiedergibt.
Werd es aber trotzdem mal umschreiben
Danke ;)
 
Linux4ever

Linux4ever

Fortgeschrittenes Mitglied
XML ist ja recht einfach aufgebaut... Du willst ja drei Sachen zurückhaben: Username, id und einen bool-Wert...

Erstelle einfach mit php die ausgabe z.B.

HTML:
<output>
     <bool>true/false</bool>
     <id>1</id>
     <name>user</name>
</output>
Das ganze natürlich auch mit einem XML-Header:

PHP:
header('Content-Type: application/xml; charset=utf-8');
Dann kannst Du die Datei auslesen:

Code:
XMLParser parser = new XMLParser();
Document doc = parser.getDomElement(result);

String bool = doc.getElementsByTagName("bool").item(0).getTextContent();
String id = doc.getElementsByTagName("id").item(0).getTextContent();
String name = doc.getElementsByTagName("name").item(0).getTextContent();
result erhältst Du so:

Code:
        String result = "";
        try
        {
            URL url = new URL("urlblabla");

            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            InputStream ret = con.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(ret));
            StringBuilder buffer = new StringBuilder();
            String line = "";
            while ((line = reader.readLine()) != null)
            {
                buffer.append(line);
            }
            result = buffer.toString();
        }
        catch (MalformedURLException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        
        return result;
Das natürlich in einem Asynctask....


EDIT: Ach halt und natürlich die XMLParser-Klasse:

Code:
import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class XMLParser 
{
    public Document getDomElement(String xml)
    {
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try 
        {
            DocumentBuilder db = dbf.newDocumentBuilder();
 
            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(xml));
            doc = db.parse(is);
        } 
        catch (ParserConfigurationException e) 
        {
            e.printStackTrace();
            return null;
        } 
        catch (SAXException e) 
        {
            e.printStackTrace();
            return null;
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
            return null;
        }

        return doc;
    }
    
    public String getValue(Element item, String str) {     
        NodeList n = item.getElementsByTagName(str);       
        return this.getElementValue(n.item(0));
    }
     
    public final String getElementValue( Node elem ) {
             Node child;
             if( elem != null){
                 if (elem.hasChildNodes()){
                     for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                         if( child.getNodeType() == Node.TEXT_NODE  ){
                             return child.getNodeValue();
                         }
                     }
                 }
             }
             return "";
      } 

}
EDIT2: Das ganze ist halt aus Projekten von mir. Falls Du Links brauchst, kann ich leider nicht damit dienen, da es mehrere Möglichkeiten unter Java gibt, XMLs zu lesen. Ich habe mir diesen Code ein wenig zusammengeschnippelt...

EDIT3: Wenn keine Internetverbindung besteht, oder halt nichts zurückgeliefert wird, dann ist result null! Das also beachten, bzw. vor dem Übergeben an XMLParser beachten, denn sonst kann eine NPE auftreten!
 
Zuletzt bearbeitet:
joshua1996

joshua1996

Stammgast
Hab jetzt mal das PHP-Script über arbeitet, und die Enter nach jeder Klammer raus genommen, hab aber immer noch das selbe Problem :/
Ich werd jetzt mal die App und PHP auf XML umstellen.

Schonmal vielen dank an dich ;)
 
Linux4ever

Linux4ever

Fortgeschrittenes Mitglied
Vor dem Bearbeiten und Umstellen der App bitte die Edits beachten ;)
 
joshua1996

joshua1996

Stammgast
Gott verdammt, bin ich dumm :D
Das mit den New-Lines war der Fehler, hab das beim erstem Mal abgeändert, und mit Filezilla die falsche Datei hochgeladen.
Jetzt bekomme ich die ID aus der Datenbank problemlos zurück

Großes DANKE an Sentenza und auch an Linux4ever und Zoopa ;)
Jetzt sehe ich zumindest noch Hoffnung das die App laufen wird :D
 
Ähnliche Themen - Login-App über JSON-Parser Antworten Datum
0
6
2