Der versuch einer Login/Register app zu erstellen.

  • Antworten:28
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 27

15.01.2016, 13:35:16 via Website

Hallo
vorweg ermal die Info das ich eher ein noob auf dem Gebiet bin.
Seit einem Monat bin ich dran bei dem versuch eine app zu erstellen.
einige werden jetzt wahrscheinlich die Augen rollen was ich auch verstehen kann.

Die app die ich machen will ist vielleicht zum Anfang etwas wuchtig und brauch unbedingt eine Login Session.
welche ich jetzt versuche mit volley und JASON umzusetzen.
vom Server aus müsste eigentlich alles funktionieren.

nur Leider stoße ich jetzt beim ausführen der app die sich erstmal nur mit dem Login Register beschäftigt auf Fehler.
diese kann ich durch google und co leider nicht Identifizierenen.
Ich hoffe das hier wer vielleicht einen tip oder sogar eine Lösung hat.

Bearbeitet:
Gestartet bekomme ich sie.
wenn ich nix eingebe kommt die nachricht vom Server das nix eingetragen ist.
sobald ich aber etwas eintrage und auf login klicke stürzt sie wieder ab.
habe mal LoginActivity.class und den AppController.class und SQLiteHander.class mit hinzugefügt.
Vielen lieben dank

01-16 16:13:25.424 1577-1577/com.abc.smb.smb E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.abc.smb.smb, PID: 1577
java.lang.NullPointerException: println needs a message
at android.util.Log.println_native(Native Method)
at android.util.Log.e(Log.java:334)
at com.abc.smb.smb.LoginActivity$4.onErrorResponse(LoginActivity.java:128)
at com.android.volley.Request.deliverError(Request.java:524)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:101)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
LoginActivity:

public class LoginActivity extends Activity {

private EditText emailTF, passwordTF;
private Button loginBtn, gotoRegBtn;
private ProgressDialog pDialog;
private SessionManager session;
private SQLiteHandler db;

private static final String TAG = LoginActivity.class.getSimpleName();

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

    emailTF = (EditText) findViewById(R.id.emailSF);
    passwordTF = (EditText) findViewById(R.id.passwordSF);
    loginBtn = (Button) findViewById(R.id.signin_btn);
    gotoRegBtn = (Button) findViewById(R.id.notreg_btn);

    pDialog = new ProgressDialog(this);
    session = new SessionManager(getApplicationContext());
    db = new SQLiteHandler(getApplicationContext());

    if(session.isLoggedIn()){
        Intent i = new Intent(this, MainActivity.class);
        startActivity(i);
        finish();
    }

    gotoRegBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(LoginActivity.this, RegisterActivity.class);
            startActivity(i);
            finish();

        }
    });

    loginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String email = emailTF.getText().toString();
            String password = passwordTF.getText().toString();

            if (!email.isEmpty() && !password.isEmpty()) {

<<75>> checkLogin(email, password);
} else {
Toast.makeText(LoginActivity.this, "Please enter details",
Toast.LENGTH_LONG).show();
}
}
});
}

public void checkLogin(final String email, final String password){
    String tag_req = "login_request";
    pDialog.setMessage("Logging In.....");
    showDialog();

    StringRequest strR = new StringRequest(
            Request.Method.POST, AppConfig.LOGIN_URL,
            new Response.Listener<String>() {
                @Override
            public void onResponse(String response){
                    hideDialog();

                    try{
                        JSONObject jsb = new JSONObject(response);
                        boolean error = jsb.getBoolean("error");
                        if(!error){
                            String uid = jsb.getString("uid");

                            JSONObject user = jsb.getJSONObject("user");
                            String name = user.getString("name");
                            String email = user.getString("email");
                            String created_at = user.getString("created_at");
                            db.addUser(name, email, uid, created_at);

                            session.setLogin(true);

                            Intent i = new Intent(LoginActivity.this, MainActivity.class);
                            startActivity(i);
                            finish();
                        }else{
                            String error_msg = jsb.getString("error_msg");
                            Toast.makeText(LoginActivity.this, error_msg, Toast.LENGTH_LONG).show();

                        }
                    }
                    catch (JSONException e){
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
            public void onErrorResponse(VolleyError error){
                    Log.e(TAG, error.getMessage());
                }
            }
    ){
        @Override
    public Map<String, String> getParams(){
            Map<String, String> p = new HashMap<String, String>();
            p.put("tag", "login");
            p.put("email", email);
            p.put("password", password);

            return p;
        }
    };

<<141>> AppController.getInstance().addToRequestQueue(strR, tag_req);
}

public void showDialog(){
    if(!pDialog.isShowing()){
        pDialog.show();
    }
}
public void hideDialog(){
    if(pDialog.isShowing()){
        pDialog.dismiss();
    }
}

}

AppControler:

public class AppController extends Application {

public static final String TAG = AppController.class.getSimpleName();

private RequestQueue myRequest;

private static AppController mInstance;

@Override
public void onCreate(){
    super.onCreate();
    mInstance = this;
}

public static synchronized AppController getInstance(){
    return mInstance;
}

public RequestQueue getRequestQueue(){
    if (myRequest == null){
        myRequest = Volley.newRequestQueue(getApplicationContext());
    }

    return myRequest;
}

public <T> void addToRequestQueue(Request<T> req, String tag){
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
    getRequestQueue().add(req);
}

public <T> void addToRequestQueue(Request<T> req){
    req.setTag(TAG);
    getRequestQueue().add(req);
}

public void cancelPendingRequests(Object tag){
    if(myRequest != null){
        myRequest.cancelAll(tag);
    }
}

}

SQLiteHandler:

public class SQLiteHandler extends SQLiteOpenHelper {

public static final String TAG = SQLiteHandler.class.getSimpleName();

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "login_db";
private static final String TABLE_NAME = "users";

private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_EMAIL = "email";
private static final String KEY_UID = "uid";
private static final String KEY_CREATED_AT = "created_at";

public SQLiteHandler (Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override
public void onCreate(SQLiteDatabase db){
    String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "("
            +KEY_ID + " INTEGER PRIMARY KEY, " + KEY_NAME + " TEXT,"
            +KEY_EMAIL + " TEXT UNIQUE," + KEY_UID + " TEXT,"
            +KEY_CREATED_AT + " TEXT" + ")";
    db.execSQL(CREATE_TABLE);

    Log.d(TAG, "Database table created");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);

    onCreate(db);

}

public void addUser(String name, String email, String uid, String created_at){
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_NAME, name);
    values.put(KEY_EMAIL, email);
    values.put(KEY_UID, uid);
    values.put(KEY_CREATED_AT, created_at);

    long id = db.insert(TABLE_NAME, null, values);
    db.close();

    Log.d(TAG, "New user was added to sqlite " + id);
}

public HashMap<String, String> getUserDetails() {
    HashMap<String, String> temp = new HashMap<String, String>();
    String selectQuery = "SELECT * FROM "+ TABLE_NAME;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    cursor.moveToFirst();
    if(cursor.getCount() > 0){
        temp.put("name", cursor.getString(1));
        temp.put("email", cursor.getString(2));
        temp.put("uid", cursor.getString(3));
        temp.put("created_at", cursor.getString(4));
    }

    cursor.close();
    db.close();

    Log.d(TAG,  "Fetching user info from sqlite");

    return temp;
}

public int getRowCount(){
    String countQuery = "SELECT * FROM "+ TABLE_NAME;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor c = db.rawQuery(countQuery, null);
    int rowcount = c.getCount();
    db.close();
    c.close();

    return rowcount;
}

public void deleteUser(){
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_NAME, null, null);
    db.close();

    Log.d(TAG,  "user has been deleted from sqlite");
}

}

— geändert am 16.01.2016, 16:14:59

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

15.01.2016, 14:00:03 via App

Was steht fenn in der LoginActivity Zeile 59?

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

Antworten
  • Forum-Beiträge: 27

15.01.2016, 14:45:29 via Website

danke Pascal P.
probiere die ganze zeit rum und habe mittlerweile den Fehler LoginActivity Zeile 59 behoben
lag dann da an einem Schreibfehler.

habe aber immer noch einige Fehler und die Fehler Ausgabe bearbeitet.
vielleicht hat ja noch wer ein tip.

Henrik hatte überlegt ob ich die java class en poste nur war dann der Meinung das das etwas viel ist wenn ich die hier alle reinsetze.

habe mal 2 class dazugefügt.

— geändert am 15.01.2016, 14:55:21

Antworten
  • Forum-Beiträge: 605

15.01.2016, 14:47:43 via Website

Also wenn du hier deinen Code nicht postest, dann kann ich dir nicht helfen. Wenigsten den Code, in dem der Fehler auftaucht, und das was damit zu tun hat. Also die Functions aus denen Variablen übergeben werden zum Beispiel.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

15.01.2016, 14:50:44 via App

Code ist von nöten wir haben keine Glaskugel ;)

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

Antworten
  • Forum-Beiträge: 27

15.01.2016, 15:08:38 via Website

LoginActivity.class
AppController.class
SQLiteHandler.class

habe ich oben in meiner anfrage mit hinzugefügt.
muss leider zur arbeit
kann deshalb morgen erst wieder dran weiter arbeiten.

vielen dank schon mal.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

15.01.2016, 15:12:27 via Website

Da wäre es gut, du würdest mal dein JsonObject get etc. debuggen.
Zudem sehe ich hier nicht welche Zeile der Fehler ist, da d das nicht markiert hast.

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

TwoFingersMarketing

Antworten
  • Forum-Beiträge: 27

16.01.2016, 13:18:22 via Website

Also ich habe mal die zwei stellen mit Zeilennummer markiert

<<75>> checkLogin(email, password);

<<141>> AppController.getInstance().addToRequestQueue(strR, tag_req);

JSON läuft wie folgt ab

public void checkLogin(final String email, final String password){
String tag_req = "login_request";
pDialog.setMessage("Logging In.....");
showDialog();

    StringRequest strR = new StringRequest(
            Request.Method.POST, AppConfig.LOGIN_URL,
            new Response.Listener<String>() {
                @Override
            public void onResponse(String response){
                    hideDialog();

                    try{
                        JSONObject jsb = new JSONObject(response);
                        boolean error = jsb.getBoolean("error");
                        if(!error){
                            String uid = jsb.getString("uid");

                            JSONObject user = jsb.getJSONObject("user");
                            String name = user.getString("name");
                            String email = user.getString("email");
                            String created_at = user.getString("created_at");
                            db.addUser(name, email, uid, created_at);

                            session.setLogin(true);

                            Intent i = new Intent(LoginActivity.this, MainActivity.class);
                            startActivity(i);
                            finish();
                        }else{
                            String error_msg = jsb.getString("error_msg");
                            Toast.makeText(LoginActivity.this, error_msg, Toast.LENGTH_LONG).show();

                        }
                    }
                    catch (JSONException e){
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
            public void onErrorResponse(VolleyError error){
                    Log.e(TAG, error.getMessage());
                }
            }
    ){

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

16.01.2016, 13:41:17 via Website

Also der Fehler tritt eindeutig hier uaf:
AppController.getInstance().addToRequestQueue(strR, tag_req);

Jetzt musst du überprüfen was da Null ist.

Ich tippe auf ide AppController Instanz, die zu mit getInstance zurücklieferst.

Die Prüfst du nämlich nicht auf NULL Werte,

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

TwoFingersMarketing

Antworten
  • Forum-Beiträge: 27

16.01.2016, 16:24:49 via Website

vielen dank für den tip
bin etwas weiter gekommen und komme jetzt an den Fehler

at com.abc.smb.smb.LoginActivity$4.onErrorResponse(LoginActivity.java:128)

            new Response.ErrorListener() {
                @Override
            public void onErrorResponse(VolleyError error){
                    Log.e(TAG, error.getMessage());
                }
            }
    ){

beim AppController rückgabe bin ich mir leider nicht ganz sicher.
ich vermute jetzt vielleicht das ich einen Fehler im php code habe:

config.php

..?php

define("DB_HOST", "mysql2.gear.host");
define("DB_USER", "*");
define("DB_DATABASE", "*");
define("DB_PASSWORD", "**");
?>

DBConnect.php

....?php

class DBConnect{

function__construct(){

}

function__destruct(){

}

public function connect(){
    require_once 'Config.php';

    $con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die(mysql_error());

    mysql_select_db(DB_DATABASE) or die(mysql_error());

    return §con;

}

public function close(){
    mysql_close();
}

}

?>

DBFunktions.php
...?php

class DBFunctions{

private $db;

function__construct(){
    require_once 'DBConnect.php';

    $this->db = new DBConnect();
    $this->db->connect();
}

function__destruct(){

}

public function storeUser($name, $email, $password){
    $uuid = uniqid('', true);
    $hash = $this->hashSSHA($password);
    $encrypted_password = $hash["encrypted"];
    $salt = $hash["salt"];
    $result = mysql_query("INSERT INTO users(unique_id, name, email, encrypted_password, salt, created_at)VALUES('$uuid', '$name', '$email', '$encrypted_password', '$salt', NOW())");

    if($result){
        $uid = mysql_insert_id();
        $result = mysql_query("SELECT * FROM users WHERE uid = $uid");

        return mysql_fetch_array($result);
    }else{
        return false;
    }
}

public function getUserByEmailAndPassword($email, $password){
    $result = mysql_query("SELECT * FROM users WHERE email = '$email'") or die(mysql_error());
    $no_of_rows = mysql_num_rows($result);
    if($no_of_rows > 0){
        $result = mysql_fetch_array($result);
        $salt = $result['salt'];
        $encrypted_password = $result['encrypted_password'];
        $hash = $this->checkhashSSHA($salt, $password);

        if($encrypted_password == $hash){
            return $result;
        }
        else{
            return false;
        }
    }
}

public function isUserExisted($email){
    $result = mysql_query("SELECT email from users WHERE email = '$email'");
    $no_of_rows = mysql_num_rows($result);
    if($no_of_rows > 0){
        return true;
    }else{
        return false;
    }
}

public function hashSSHA($password){
    $salt = sha1(rand());
    $salt = substr($salt, 0, 10);
    $encrypted = base64_encode(sha1($password . $salt, true). $salt);
    $hash = array("salt" => $salt, "encrypted" => $encrypted);

    return $hash;
}

public function checkhashSSHA($salt, $password){

    $hash = base64_encode(sha1($password . $salt, true). $salt);

    return $hash;
}

}
?>

index.php
....?php

if(isset($_POST['tag']) && $_POST['tag'] != ''){

$tag = $_POST['tag'];

require_once 'include/DBFunctions.php';
$db = new DBFunctions();

$response = array("tag" => $tag, "error" => FALSE);

if($tag == 'login'){

    $email = $_POST['email'];
    $password = $_POST['password'];

    $user = $db->getUserByEmailAndPassword($email, $password);
    if($user != false){
        $response["error"] = FALSE;
        $response["uid"] = $user["unique_id"];
        $response["user"]["name"] = $user["name"];
        $response["user"]["email"] = $user["email"];
        $response["user"]["created_at"] = $user["created_at"];
        $response["user"]["updated_at"] = $user["updated_at"];
        echo json_encode($response);
    }else{
        $response["error"] = TRUE;
        $response["error_msg"] = "Incorrect email or Password";
        echo json_encode($response);
    }
}
else if($tag == 'register'){
    $name = $_POST['name'];
    $email = $_POST['email'];
    $password = $_POST['password'];

    if($db->isUserExisted($email)){
        $response["error"] = TRUE;
        $response["error_msg"] = "User already exist";
        echo json_encode($response);
    }else{
        $user = $db->storeUser($name, $email, $password);
        if($user){
        $response["error"] = FALSE;
        $response["uid"] = $user["unique_id"];
        $response["user"]["name"] = $user["name"];
        $response["user"]["email"] = $user["email"];
        $response["user"]["created_at"] = $user["created_at"];
        $response["user"]["updated_at"] = $user["updated_at"];
        echo json_encode($response);
        }
        else{
        $response["error"] = TRUE;
        $response["error_msg"] = "Error occured in Registration";
        echo json_encode($response);
        }
    }
}else{
        $response["error"] = TRUE;
        $response["error_msg"] = "Unknown 'tag' value. It should be either Login or register";
        echo json_encode($response);
}

}else{
$response["error"] = TRUE;
$response["error_msg"] = "Required parameter 'tag' is missing";

echo json_encode($response);

}

?>

muss jetzt leider wieder zur arbeit

Vielen dank schon mal

— geändert am 16.01.2016, 16:55:56

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

16.01.2016, 17:05:27 via Website

Das nicht, aber leider hat du nur das Auftreten des Fehlers (Zeile) gepostet.
Das bringt mir nur was im Zusammenhang mit der Exception, als welche Art von Fehler es ist.
PHP Code an scih sieht in Ordnung aus.

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

Antworten
  • Forum-Beiträge: 27

17.01.2016, 14:55:26 via Website

ja sorry ich habe es immer im ersten post von mir aktualisiert damit ich hier nicht alles zu spamme.
hier die komplette Fehlerausgabe.
auf Grund dessen bin ich von ausgegangen das es am phpcode liegt
werde es einfach noch mal doppelt durchgehen.
01-16 16:13:25.424 1577-1577/com.abc.smb.smb E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.abc.smb.smb, PID: 1577
java.lang.NullPointerException: println needs a message
at android.util.Log.println_native(Native Method)
at android.util.Log.e(Log.java:334)
at com.abc.smb.smb.LoginActivity$4.onErrorResponse(LoginActivity.java:128)
at com.android.volley.Request.deliverError(Request.java:524)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:101)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

17.01.2016, 15:05:14 via Website

Obs am PHP liegt, kannn ich dir nicht sagen,
aber der Fehler liegt daran, dass Volley wohl keine ErrorMessage schreibt:
Log.e(TAG, error.getMessage());
getMessage ist null oder das ErrorObjekt.

Irgendwie muss da noch was Falsch sein.
Ab besten du benutzt den Debugger + Breakpoints sonst kommst du dan icht weit.
Hast du der App internet Permission gegeben?

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

TwoFingersMarketing

Antworten
  • Forum-Beiträge: 27

17.01.2016, 15:52:40 via Website

ja ist vorhanden.
...manifest xmlns:android="**schemas.android.com/apk/res/android"
package="com.abc.smb.smb">

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:name=".AppController"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".LoginActivity"
        android:label="Login">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
    android:name=".RegisterActivity"
    android:label="Register">
</activity>
    <activity
        android:name=".MainActivity"
        android:label="MainSMB">
    </activity>
</application>

Antworten
  • Forum-Beiträge: 27

17.01.2016, 16:55:48 via Website

"Ohne es zu debuggen" verstehe ich nicht genau.
dachte das ist was ich die ganze zeit mache und die Fehlerausgabe her bekomme.
vielleicht verstehe es auch falsch
bin erst 1 Monat in diesem Gebiet
sorry

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

17.01.2016, 17:00:01 via Website

Das Log anschauen ist nur ein Teil des Debuggens.
Du kannst auch "Breakpoints" erstellen, an welchen AndroidStudio Die App dann Anhält. Dann kanst du genau sehen Welche Variablen welchen Wert haben und wie das ganze sich verhält.
Hierm al was zum Informieren:
http://developer.android.com/tools/debugging/debugging-studio.html

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

TwoFingersMarketing

Antworten

Empfohlene Artikel