ログインフォームをアプリに実装したかったため、Android Studio Wizard Login Formタイプの新しいアクティビティに対して生成されたコードを使用しようとしました。Eclipseによって生成されるコードはほぼ同じだと思います。
残念ながら、生成されたコードでは期待した結果が得られませんでした。ニースの簡単なログインフォームを作成しましたが、正しいパスワードまたは間違ったパスワードでログインフォームから移動しません。
また、「登録」フォームが作成されていないことに気付きました。
少し見て、コードを分析した後、ようやく動作するようになりました:)
以下の私の回答をご覧ください。
間違ったユーザー/パスワードが使用されたときにログインアクティビティが失敗し、成功したときにメインアクティビティに移動するには、生成されたコードに以下の修正を加える必要があります。
_AndroidManifest.xml
_:
次のコードをメインアクティビティからLoginActivityセクションに移動します。
_<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
_
次に、_LoginActivity.Java
_を編集して、次の変更を行います。
doInBackground
メソッド内で、最後に戻り値をtrue
からfalse
に置き換えます
_@Override
protected Boolean doInBackground(Void... params) {
for (String credential : DUMMY_CREDENTIALS) {
String[] pieces = credential.split(":");
if (pieces[0].equals(mEmail)) {
// Account exists, return true if the password matches.
return pieces[1].equals(mPassword);
}
}
// TODO: register the new account here.
return false;
}
_
次に、onPostExecute
メソッドで、finish();
の後に新しいインテントを追加します。
_@Override
protected void onPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
finish();
Intent myIntent = new Intent(LoginActivity.this,MyMainActivity.class);
LoginActivity.this.startActivity(myIntent);
} else {
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
}
}
_
これで、次の_user:password
_資格情報のいずれかを使用してログインが成功するはずです。
その他の_user:password
_ tryは、誤ったパスワードを指定し、ログインページにとどまる必要があります。
これで、静的変数の代わりにデータベース(SQLite)からログイン情報を取得します。これにより、デバイスに複数のユーザーを登録できます。
最初に、新しい_User.Java
_クラスを作成します。
_package com.clinsis.onlineresults.utils;
/**
* Created by csimon on 5/03/14.
*/
public class User {
public long userId;
public String username;
public String password;
public User(long userId, String username, String password){
this.userId=userId;
this.username=username;
this.password=password;
}
}
_
次に、SQLiteヘルパー(私の場合は_DBTools.Java
_)クラスを作成または更新します。
_package com.clinsis.onlineresults.utils;
import Android.content.ContentValues;
import Android.content.Context;
import Android.database.Cursor;
import Android.database.sqlite.SQLiteDatabase;
import Android.database.sqlite.SQLiteOpenHelper;
/**
* Created by csimon on 12/11/13.
*/
public class DBTools extends SQLiteOpenHelper {
private final static int DB_VERSION = 10;
public DBTools(Context context) {
super(context, "myApp.db", null,DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String query = "create table logins (userId Integer primary key autoincrement, "+
" username text, password text)";
sqLiteDatabase.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
try{
System.out.println("UPGRADE DB oldVersion="+oldVersion+" - newVersion="+newVersion);
onCreate(sqLiteDatabase);
if (oldVersion<10){
String query = "create table logins (userId Integer primary key autoincrement, "+
" username text, password text)";
sqLiteDatabase.execSQL(query);
}
}
catch (Exception e){e.printStackTrace();}
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// super.onDowngrade(db, oldVersion, newVersion);
System.out.println("DOWNGRADE DB oldVersion="+oldVersion+" - newVersion="+newVersion);
}
public User insertUser (User queryValues){
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", queryValues.username);
values.put("password", queryValues.password);
queryValues.userId=database.insert("logins", null, values);
database.close();
return queryValues;
}
public int updateUserPassword (User queryValues){
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", queryValues.username);
values.put("password", queryValues.password);
queryValues.userId=database.insert("logins", null, values);
database.close();
return database.update("logins", values, "userId = ?", new String[] {String.valueOf(queryValues.userId)});
}
public User getUser (String username){
String query = "Select userId, password from logins where username ='"+username+"'";
User myUser = new User(0,username,"");
SQLiteDatabase database = this.getReadableDatabase();
Cursor cursor = database.rawQuery(query, null);
if (cursor.moveToFirst()){
do {
myUser.userId=cursor.getLong(0);
myUser.password=cursor.getString(1);
} while (cursor.moveToNext());
}
return myUser;
}
}
_
注:_DB_VERSION
_は、DBスキーマのアップグレード/ダウングレードを検出するために使用されます;)
次に、LoginActivity.Javaを次のように変更します。
次のインポートを追加します。
_import Android.widget.Toast;
import com.clinsis.onlineresults.utils.DBTools;
import com.clinsis.onlineresults.utils.User;
_
新しい変数を追加します。
_private User myUser;
_
_DUMMY_CREDENTIALS
_変数宣言を削除します。
attemptLogin
メソッドで、UserLoginTask
を呼び出すときにコンテキストを追加します。
_mAuthTask = new UserLoginTask(email, password, this);
_
内部UserLoginTaskクラスを次のコードに置き換えます。
_/**
* Represents an asynchronous login/registration task used to authenticate
* the user.
*/
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
private final String mEmail;
private final String mPassword;
private final Context mContext;
UserLoginTask(String email, String password, Context context) {
mEmail = email;
mPassword = password;
mContext= context;
}
@Override
protected Boolean doInBackground(Void... params) {
DBTools dbTools=null;
try{
dbTools = new DBTools(mContext);
myUser = dbTools.getUser(mEmail);
if (myUser.userId>0) {
// Account exists, check password.
if (myUser.password.equals(mPassword))
return true;
else
return false;
} else {
myUser.password=mPassword;
return true;
}
} finally{
if (dbTools!=null)
dbTools.close();
}
// return false if no previous checks are true
return false;
}
@Override
protected void onPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
if (myUser.userId>0){
finish();
Intent myIntent = new Intent(LoginActivity.this,ReportListActivity.class);
LoginActivity.this.startActivity(myIntent);
} else {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
DBTools dbTools=null;
try{
finish();
dbTools = new DBTools(mContext);
myUser=dbTools.insertUser(myUser);
Toast myToast = Toast.makeText(mContext,R.string.updatingReport, Toast.LENGTH_SHORT);
myToast.show();
Intent myIntent = new Intent(LoginActivity.this,ReportListActivity.class);
LoginActivity.this.startActivity(myIntent);
} finally{
if (dbTools!=null)
dbTools.close();
}
break;
case DialogInterface.BUTTON_NEGATIVE:
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(this.mContext);
builder.setMessage(R.string.confirm_registry).setPositiveButton(R.string.yes, dialogClickListener)
.setNegativeButton(R.string.no, dialogClickListener).show();
}
} else {
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
}
}
@Override
protected void onCancelled() {
mAuthTask = null;
showProgress(false);
}
}
_
_strings.xml
_に以下を追加します:
_<string name="confirm_registry">Email not found. You want to create a new user with that email and password?</string>
<string name="yes">Yes</string>
<string name="no">No</string>
_
私は何も忘れないことを望みます...それは私のためにうまくいった:D
DBに電子メールが存在しない場合は、登録することを提案します。そうでない場合は、電子メールとパスワードを照合します。
Android:Dをお楽しみください