web-dev-qa-db-ja.com

例と説明:Android(Studio)Login Activity Template Generated Activity

ログインフォームをアプリに実装したかったため、Android Studio Wizard Login Formタイプの新しいアクティビティに対して生成されたコードを使用しようとしました。Eclipseによって生成されるコードはほぼ同じだと思います。

残念ながら、生成されたコードでは期待した結果が得られませんでした。ニースの簡単なログインフォームを作成しましたが、正しいパスワードまたは間違ったパスワードでログインフォームから移動しません。

また、「登録」フォームが作成されていないことに気付きました。

少し見て、コードを分析した後、ようやく動作するようになりました:)

以下の私の回答をご覧ください。

20
Cedric Simon

ステップ1:ログインを成功させ、メインアクティビティに進む

間違ったユーザー/パスワードが使用されたときにログインアクティビティが失敗し、成功したときにメインアクティビティに移動するには、生成されたコードに以下の修正を加える必要があります。

_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は、誤ったパスワードを指定し、ログインページにとどまる必要があります。

ステップ2:登録を許可し、ログインをデータベースに保存し、資格情報とDBを確認します

これで、静的変数の代わりにデータベース(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をお楽しみください

43
Cedric Simon