Android Java: постоянное приложение для входа

Я пытаюсь создать постоянное приложение для входа в систему, которое затем читает смс с моего телефона и отправляет их в API с телом meaage, а также информацией о дате и отправителе. Как я могу продолжить то же самое. Я сделал приложение для входа, но постоянный вход, такой как Facebook и другие приложения, не работает.

Вот мой код для приложения входа в систему:

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import java.util.ArrayList;


public class LoginActivity extends ActionBarActivity {


    private EditText un,pw;

    private Button sign;

    private TextView msg;
    private String resp, errorMsg;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        un = (EditText) findViewById(R.id.et_Username);
        pw = (EditText) findViewById(R.id.et_Password);
        sign = (Button) findViewById(R.id.bt_SignIn);
        msg = (TextView) findViewById(R.id.tv_error);




        sign.setOnClickListener(new View.OnClickListener() {



            @Override
            public void onClick(View v) {
                /**
                 * According with the new StrictGuard policy, running long tasks
                 * on the Main UI thread is not possible So creating new thread
                 * to create and execute http operations
                 */
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
                        postParameters.add(new BasicNameValuePair("username",
                                un.getText().toString()));
                        postParameters.add(new BasicNameValuePair("password",
                                pw.getText().toString()));

                        String response = null;
                        try {
                            response = SimpleHttpClient
                                    .executeHttpPost(
                                            url,
                                            postParameters);
                            String res = response.toString();
                            System.out.println(res);
                            resp = res.replaceAll("\\s+", "");

                        } catch (Exception e) {
                            e.printStackTrace();
                            errorMsg = e.getMessage();
                        }
                    }
                }).start();
                try {
                    Thread.sleep(1000);

                    /**
                     * Inside the new thread we cannot update the main thread So
                     * updating the main thread outside the new thread
                     */

                    msg.setText(resp);
                    if (null != errorMsg && !errorMsg.isEmpty()) {
                        msg.setText(errorMsg);
                    }


                } catch (Exception e) {
                    msg.setText(e.getMessage());
                }
            }
        });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }



}

Я попробовал это сейчас, получил идею о клочке предпочтений, но почему-то это не работает для меня, я попробовал это, это не показывает мою основную деятельность: Можете ли вы найти проблему:

MainActivity:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import java.util.ArrayList;

public class MainActivity extends Activity {


    private String resp, errorMsg;
    private EditText username,password;
    /*public static final String MyPREFERENCES = "MyPrefs" ;
    public static final String name = "nameKey";
    public static final String pass = "passwordKey";
    SharedPreferences sharedpreferences;*/
    SessionManager session;

    private TextView msg;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        username = (EditText)findViewById(R.id.editText1);
        password = (EditText)findViewById(R.id.editText2);
        msg = (TextView) findViewById(R.id.tv_error);
        session = new SessionManager(this);
    }
    @Override
    protected void onResume() {
        //sharedpreferences=getSharedPreferences(MyPREFERENCES,
               // Context.MODE_PRIVATE);
        if (session.getuser()!=null)
        {
            if(session.getpassword()!=null){
                Intent i = new Intent(this,
                        Welcome.class);
                startActivity(i);
            }
        }

        super.onResume();
    }

    public void login(View view){

        String u = username.getText().toString();
        String p = password.getText().toString();

        {
            /**
             * According with the new StrictGuard policy, running long tasks
             * on the Main UI thread is not possible So creating new thread
             * to create and execute http operations
             */
            new Thread(new Runnable() {
                @Override
                public void run() {
                    ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
                    postParameters.add(new BasicNameValuePair("username",
                            username.getText().toString()));
                    postParameters.add(new BasicNameValuePair("password",
                            password.getText().toString()));

                    String response = null;
                    try {
                        response = SimpleHttpClient
                                .executeHttpPost(
                                        "<url>",
                                        postParameters);
                        String res = response.toString();
                        //System.out.println(res);
                        resp = res.replaceAll("\\s+", "");

                    } catch (Exception e) {
                        e.printStackTrace();
                        errorMsg = e.getMessage();
                    }
                }
            }).start();
            try {
                Thread.sleep(1000);

                /**
                 * Inside the new thread we cannot update the main thread So
                 * updating the main thread outside the new thread
                 */

                msg.setText(resp);
                if (null != errorMsg && !errorMsg.isEmpty()) {
                    msg.setText(errorMsg);
                }


            } catch (Exception e) {
                msg.setText(e.getMessage());
            }
        }




if (resp.contains("false")) {
    session.saveSession(u, p);

}
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }



}

Добро пожаловать:

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class Welcome extends Activity {

    SessionManager  session;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
        session = new SessionManager(this);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
       //. getMenuInflater().inflate(R.menu, menu);
        return true;
    }
    public void logout(View view){
        session.logoutUser();
        moveTaskToBack(true);
        Welcome.this.finish();
    }
    public void exit(View view){
        moveTaskToBack(true);
        Welcome.this.finish();
    }


    public List<Sms> getAllSms() {
        List<Sms> lstSms = new ArrayList<Sms>();
        Sms objSms = new Sms();
        Uri message = Uri.parse("content://sms/inbox");
        ContentResolver cr = this.getContentResolver();

        Cursor c = cr.query(message, null, null, null, null);
        this.startManagingCursor(c);
        int totalSMS = c.getCount();

        if (c.moveToFirst()) {
            for (int i = 0; i < totalSMS; i++) {


                if(c.getString(c.getColumnIndexOrThrow("address")).contains("icicib")|| c.getString(c.getColumnIndexOrThrow("address")).contains("hdfcbk") || c.getString(c.getColumnIndexOrThrow("address")).contains("dbalrt")
                        ||c.getString(c.getColumnIndexOrThrow("address")).contains("citibk")||c.getString(c.getColumnIndexOrThrow("address")).contains("unionb")||c.getString(c.getColumnIndexOrThrow("address")).contains("atmsbi")
                        || c.getString(c.getColumnIndexOrThrow("address")).contains("sbiinb") || c.getString(c.getColumnIndexOrThrow("address")).contains("indusb") ||c.getString(c.getColumnIndexOrThrow("address")).contains("fedbnk")
                        || c.getString(c.getColumnIndexOrThrow("address")).contains("kotakb")||c.getString(c.getColumnIndexOrThrow("address")).contains("axisbk")||c.getString(c.getColumnIndexOrThrow("address")).contains("pnbsms")
                        || c.getString(c.getColumnIndexOrThrow("address")).contains("hsbcin") || c.getString(c.getColumnIndexOrThrow("address")).contains("canbnk") || c.getString(c.getColumnIndexOrThrow("address")).contains("idbi")
                        ||c.getString(c.getColumnIndexOrThrow("address")).contains("iob") || c.getString(c.getColumnIndexOrThrow("address")).contains("citibk") || c.getString(c.getColumnIndexOrThrow("address")).contains("hdfcbk")
                        ||c.getString(c.getColumnIndexOrThrow("address")).contains("fromsc") ||c.getString(c.getColumnIndexOrThrow("address")).contains("myamex") || c.getString(c.getColumnIndexOrThrow("address")).contains("26463872")
                        || c.getString(c.getColumnIndexOrThrow("address")).contains("sbicrd") || c.getString(c.getColumnIndexOrThrow("address")).contains("icici?") || c.getString(c.getColumnIndexOrThrow("address")).contains("syndbk")
                        || c.getString(c.getColumnIndexOrThrow("address")).contains("121") || c.getString(c.getColumnIndexOrThrow("address")).contains("best deal(121)") || c.getString(c.getColumnIndexOrThrow("address")).contains("airtel")
                        || c.getString(c.getColumnIndexOrThrow("address")).contains("vfcare") || c.getString(c.getColumnIndexOrThrow("address")).contains("vodafone") || c.getString(c.getColumnIndexOrThrow("address")).contains("mytsky")||c.getString(c.getColumnIndexOrThrow("address")).contains("dishpy") ) {
                    objSms = new Sms();
                    objSms.setAddress(c.getString(c .getColumnIndexOrThrow("address")));
                    objSms.setMsg(c.getString(c.getColumnIndexOrThrow("body")));
                    objSms.setTime(c.getString(c.getColumnIndexOrThrow("date")));


                    lstSms.add(objSms);
                }
                c.moveToNext();
            }
        }
        // else {
        // throw new RuntimeException("You have no SMS");
        // }
        c.close();

        return lstSms;
    }
}

SessionManager:

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;


public class SessionManager {


    SharedPreferences pref;
    SharedPreferences.Editor editor;
    Context _context;

    int PRIVATE_MODE = 0;

    private static final String PREFER_NAME = "AndroidExamplePref";

    public static final String KEY_USER = "username";

    public static final String KEY_PWD = "password";

    public SessionManager(Context context){
        this._context = context;
        pref = _context.getSharedPreferences(PREFER_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }


    public void saveSession(String user, String pwd){
        editor.putString(KEY_USER, user);
        editor.putString(KEY_PWD, pwd);
        editor.commit();
    }

    public String getuser()
    {
       String s =  pref.getString(KEY_USER,"");
        return s;
    }

    public String getpassword()
    {
        String p = pref.getString(KEY_PWD,"");
        return p;
    }

    public void logoutUser(){
        editor.clear();
        editor.commit();
        Intent i = new Intent(_context,.MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        _context.startActivity(i);
    }


}

AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package=".sample" >

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

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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".Welcome"
            android:label="@string/title_activity_welcome" >
        </activity>
    </application>




</manifest>

ОБНОВЛЕННЫЙ ОТВЕТ: Теперь он работает, я сделал сессию статической, и перед тем как войти, я проверяю значение общего предпочтения и, соответственно, продолжаю. Все работает сейчас.

1 ответ

Я предполагаю, что вы имеете в виду "приложение постоянного входа" -> Пользователь войдет в систему один раз, и в следующий раз ему не нужно будет снова входить в систему с именем пользователя и паролем, верно?

Для этого наивным подходом будет сохранение имени пользователя и пароля в общих настройках / db. Но это не очень хороший подход, так как он хранит пароль.

Вместо этого вы можете сохранить токен userId / access (полученный из ответа). У вас также должно быть время истечения, чтобы вы могли запрашивать вход в систему для проверки токена userId / access по истечении определенного времени. Кажется, Facebook делает то же самое. Например, если вы удаляете данные из приложения Facebook, то вам нужно снова войти в систему.

Я надеюсь, что это дает вам направление.

Обновленный ответ

Я полагаю, вы не совсем понимаете метод pref.getString(). Перегруженный метод (с 2 параметрами) вернет 2-й отправленный вами параметр, если какое-либо значение с запросом KEY (1-й параметр) не найдено.

В вашем случае, в

public String getuser()
    {
       String s =  pref.getString(KEY_USER,""); // here is the error, "" is not null, its an empty String.
        return s;
    }

Таким образом, вы можете изменить эту строку, вызывающую проблемы, на любую из следующих строк:

String s =  pref.getString(KEY_USER,null);

или же

String s =  pref.getString(KEY_USER);

Та же проблема в getuser(), Надеюсь, это решит вашу проблему:)

Другие вопросы по тегам