2016-01-06 499 views
-4

我想使用android studio和 为Android设备制作饮食助手应用程序我需要关于如何使用实现登录/注册系统的想法,我在YouTube上跟随了一个教程,但它已经过时了,最后我浪费了时间,然后我读了谷歌,android studio有一个叫做volley的库,我可以使用PHP和MySql来创建登录系统。Android Studio登录/注册系统构想

你有其他的想法,或者是最好的一个吗?

我愿意接受这样的拍摄!

回答

1

更新:

我创建了一个关于如何做到这一点使用您的Android应用程序中的PHP后台岗位。 https://keithweaver.ca/posts/4/android-php-custom-login

除了上面的链接,这是如何设置服务器。 https://github.com/kweaver00/tutorials/blob/master/setup-server.md https://keithweaver.ca/posts/9/setup-ubuntu-server-quickly

原贴:

这是一个解决方案,并不能保证是最好的。

你真的可以使用任何东西与服务器通信。异步任务或改造都很受欢迎。

假设您已经设置了一个LAMP堆栈的服务器。确保你有一个SSL,所以你不传递未加密的用户信息。

  1. 在MySQL

防爆创建一个用户表。

id int default->NULL AI primary-key 
user varchar 250 default->null 
pass varchar 250 default->null 
signupdate date default-> null 
  • 创建日志在某种
  • 实施例的会话表。 ID INT默认 - > NULL AI主键 用户VARCHAR 250默认 - >空 令牌VARCHAR 250默认 - >空 addedDate日期默认 - >空

  • 创建登录PHP脚本(我知道这可能是心不是最好的办法,以正确的PHP代码)

    $connection = mysqli_connect("localhost", "phpmysqluser", "password", "dbname") or die("Error 404: unable to connect"); 
    $username = $_POST['user']; 
    $pass = $_POST['pass']; 
    //add code to remove slashes and etc. 
    $result = mysqli_query($connection, "SELECT * FROM userTable WHERE user='$username' AND pass='$pass'") or die("Error: this line has error"); 
    
    class response{ 
         public $loggedin =0; 
         public $message = ""; 
    } 
    
    $response = new response(); 
    if(mysqli_num_rows($result) == 1){ 
         $logInToken = generateLogInToken(); 
         //have a function that creates a unique token and stores it for X days or minutes 
         $response->loggedin = 1; 
         $response->message = $logInToken; 
    }else{ 
         $response->message = "wrong info"; 
    } 
    echo json_decode($response); 
    
  • 这应该输出json文件,这取决于你的用户和传递变量等。

    { 
        "loggedin" : 1, 
        "message" : "asdnlansdkansd" 
    } 
    
  • 正确的,通过日志中的令牌和用户名来检查它是否是有效的另一个脚本。

    $connection .... //same as above 
    //well it really should be a include_once cause if you change credentials 
    $token = $_POST['token']; 
    $user = $_POST['user']; 
    
    $registeredDate = ""; 
    $today = date('Y-m-d'); 
    $result = mysqli_query($connection, "SELECT * FROM tokenTable WHERE user='$user' AND token='$token'") or die("Error..."); 
    
    class response{ 
        public $status = 0; 
    } 
    $response = new response(); 
    if(mysqli_num_rows($result) == 1){ 
        //check token has been register today and if not sign them out 
        while($row = mysqli_fetch_array($result)){ 
         $registeredDate = $row['addedDate']; 
        } 
        if($registeredDate == $today){ 
         //token is valid 
         $response->status = 3; 
        }else{ 
         //expired 
         $response->status = 2; 
        } 
    }else{ 
        //user and token are not valid 
        $response->status = 1; 
    } 
    echo json_decode($response); 
    
  • 给予JSON对象像:

    { 
        "status" : 3 
    }  
    
  • 在你上打开Android应用,运行代码以检查帐户是,如果有效有本地存储的任何东西。或者只是去登录屏幕。
  • 在在OnCreate闪屏(你不需要一个闪屏,它其实不推荐,但它的解释过程中,最简单的方法):

    if(userNameAndTokenStoredInSharedPref()){ 
        String token = getTokenFromSharedPref(); 
        String userName = getUserNameFromSharedPref(); 
        checkAgainstServer(token, userName); 
    }else{ 
        Intent openLogInWindow = new Intent(this, LogInActivity.class); 
        startActivity(openLogInWindow); 
    } 
    

    仍处于斜线活动,但出来的在OnCreate中:

    protected void checkAgainstServer(String token, String user){ 
        //using retrofit 
        ThisAppRestClient.get().postCheckTokenAndUser(token, user, new Callback<UserStatusCallBack>() { 
         @Override 
         public void success(UserStatusCallBack userStatusCallback, retrofit.client.Response response) { 
          if(userStatusCallback.getStatus() == 1){ 
           //Invalid token 
          }else if(userStatusCallback.getStatus() == 2){ 
           //Expired token 
          }else if(userStatusCallback.getStatus() == 3){ 
           //Success 
           Intent openMainWindow = new Intent(this, MainActivity.class); 
           startActivity(openMainWindow); 
          } 
         } 
         @Override 
         public void failure(RetrofitError error) { 
          //Retrofit errors like timeouts, etc. 
         } 
        } 
    } 
    

    日志的活动会是这样的:

    logBtn.setOnClickListener(new View.onClick... 
        String userName = userNameEditText.getText().toString().toLowerCase().trim(); 
        String password = passwordEditText.getText().toString().trim(); 
        if(!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(password)){ 
         callServerLogInScript(userName, password); 
        } 
        userNameEditText.setText(""); 
        logBtn.setVisibility(View.GONE); 
    } 
    

    下下文件:

    protected void callServerLogInScript(String user, String pass){ 
        //using retrofit 
        ThisAppRestClient.get().postCheckTokenAndUser(user, pass, new  Callback<LogInCallBack>() { 
         @Override 
         public void success(LogInCallBack logInCallback, retrofit.client.Response response) { 
          if(logInCallback.getLoggedIn() == 1){ 
           //succssful 
           storeUserNameInSharedPref(user); 
           storeTokenInSharedPref(logInCallback.getMessage()); 
           Intent openMainActivity = new Intent(this, MainActivity.class); 
           startActivity(openMainActivity); 
          }else{ 
           //incorrect log in 
           logBtn.setVisibility(View.VISIBLE); 
          } 
         } 
         @Override 
         public void failure(RetrofitError error) { 
          //Retrofit errors like timeouts, etc. 
         } 
        } 
    } 
    

    的理由不存储用户名和密码,直接是如果该设备是植根于他们可以在本地而不是操纵你的服务器上的数据。

    1

    这取决于你想要使用。如果你有自己的服务器来托管,那么使用php,mysql。如果没有,你也可以使用其他第三方,如果你知道php,mysql来创建,你可以添加它。 另一个选择是,如果你不想使用php mysql来存储数据,那么你可以继续parse.com

    所以,如果你想使用parse.com,只需注册它。它可以免费使用。

    希望它会符合您的要求,譬如说例如:如果你想创建注册(一切都在DATAS储蓄将被处理),你需要给确切的对象名称相匹配你在parse.com给出什么

    即使您也可以在代码本身中创建对象名称。我会告诉你一个例子如何创建和插入注册..

      ParseUser user = new ParseUser(); 
          user.setEmail((txtEmail));//create an edittext and get the values in strings and store.. 
          user.setPassword(txtPassword);//same for password 
          user.setUsername(txtUsername);//username 
          user.signUpInBackground(new SignUpCallback() { 
           public void done(ParseException e) { 
            if (e == null) { 
             //completed..it has been registered 
             Toast.makeText(getApplicationContext(), 
               "Successfully Signed up, please log in.", 
               Toast.LENGTH_LONG).show(); 
             finish(); 
            } else { 
             Toast.makeText(getApplicationContext(), 
               "Sign up Error", Toast.LENGTH_LONG) 
               .show(); 
            } 
           } 
          }); 
    

    如果你不想使用PHP,MySQL的简单之一。 Well documentation并且易于集成和使用它。快乐的编码。

    FYI: Android的工作室是开发IDE。凌空是为Android开发网络的HTTP库。