我想使用android studio和 爲Android設備製作飲食助手應用程序我需要關於如何使用實現登錄/註冊系統的想法,我在YouTube上跟隨了一個教程,但它已經過時了,最後我浪費了時間,然後我讀了谷歌,android studio有一個叫做volley的庫,我可以使用PHP和MySql來創建登錄系統。Android Studio登錄/註冊系統構想
你有其他的想法,或者是最好的一個嗎?
我願意接受這樣的拍攝!
我想使用android studio和 爲Android設備製作飲食助手應用程序我需要關於如何使用實現登錄/註冊系統的想法,我在YouTube上跟隨了一個教程,但它已經過時了,最後我浪費了時間,然後我讀了谷歌,android studio有一個叫做volley的庫,我可以使用PHP和MySql來創建登錄系統。Android Studio登錄/註冊系統構想
你有其他的想法,或者是最好的一個嗎?
我願意接受這樣的拍攝!
更新:
我創建了一個關於如何做到這一點使用您的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,所以你不傳遞未加密的用戶信息。
防爆創建一個用戶表。
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
}
在在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.
}
}
}
的理由不存儲用戶名和密碼,直接是如果該設備是植根於他們可以在本地而不是操縱你的服務器上的數據。
這取決於你想要使用。如果你有自己的服務器來託管,那麼使用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庫。