Dobry wieczór,
Potrzebuję napisać klienta na Androida, który będzie wymieniał dane z bazą udostępnianą przez skrypty PHP. Nie mam żadnego doświadczenia w programowaniu Androida. Mam ponad 20 letnie doświadczenie w IT, ale jako administrator - nie jako programista, chociaż programowałem w trochę Javie i PHP.
Nie chcę tego zlecać, bo jest to po prostu moje hobby i czuję się na siłach powoli krok po kroku ogarnąć temat.
Wstępne założenia to:
- Klient będzie napisany w Javie (Android Studio)
- Klient będzie używać Retrofit2 do łączenia się ze skryptami php przez https.
- Skrypty PHP będą komunikowały się z istniejącą bazą aplikacji webowej.
Próbuję ogarnąć temat logowania do bazy i częściowo mi się udało, ale nie do końca. Korzystałem z tego tutoriala, i jestem w stanie się zalogować, ale nie wiem dlaczego nie mogę przejść do activity_welcome... widzę że Toast 'Zalogowany' jest wyświetlany bez względu na poprawne (lub nie) zalogowanie, choć z logów widzę kiedy prawidłowe zmienne są ustawiane po zalogowaniu.
Mój kod LoginActivity wygląda tak:
public class LoginActivity extends AppCompatActivity {
private EditText etEmail, etPass;
private Button btnlogin;
private TextView tvreg;
private PreferenceHelper preferenceHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
preferenceHelper = new PreferenceHelper(this);
etEmail = (EditText) findViewById(R.id.etemail);
etPass = (EditText) findViewById(R.id.etpassword);
btnlogin = (Button) findViewById(R.id.btn);
tvreg = (TextView) findViewById(R.id.tvreg);
tvreg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
LoginActivity.this.finish();
}
});
btnlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginUser();
}
});
}
private void loginUser() {
final String email = etEmail.getText().toString().trim();
final String password = md5(etPass.getText().toString().trim());
/*
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.level(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
*/
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(LoginInterface.LOGINURL)
.addConverterFactory(ScalarsConverterFactory.create())
.build();
LoginInterface api = retrofit.create(LoginInterface.class);
Call<String> call = api.getUserLogin(email,password);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Log.i("Responsestring", response.body().toString());
if (response.isSuccessful()) {
if (response.body() != null) {
Toast.makeText(getApplicationContext(), "Zalogowano", Toast.LENGTH_LONG).show();
Log.i("onSuccess", response.body().toString());
String jsonresponse = response.body().toString();
parseLoginData(jsonresponse);
} else {
Toast.makeText(getApplicationContext(), "Błąd logowania", Toast.LENGTH_LONG).show();
Log.i("onEmptyResponse", "Returned empty response");
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
}
private void parseLoginData(String response){
try {
JSONObject jsonObject = new JSONObject(response);
if (jsonObject.getString("status").equals("true")) {
saveInfo(response);
Toast.makeText(LoginActivity.this, "Login Successfully!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginActivity.this,WelcomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
private void saveInfo(String response){
preferenceHelper.putIsLogin(true);
try {
JSONObject jsonObject = new JSONObject(response);
if (jsonObject.getString("status").equals("true")) {
JSONArray dataArray = jsonObject.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
JSONObject dataobj = dataArray.getJSONObject(i);
preferenceHelper.putName(dataobj.getString("name"));
preferenceHelper.putHobby(dataobj.getString("hobby"));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
public String md5(String md5) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(md5.getBytes("UTF-8"));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
} catch(UnsupportedEncodingException ex){
}
return null;
}
}
kod LoginInterface wyglada tak:
public interface LoginInterface {
String LOGINURL = "https://xxxxx.pl/xxx/php/";
@FormUrlEncoded
@POST("login.php")
Call<String> getUserLogin(
@Field("email") String uname,
@Field("password") String password
);
}
kod MainActivity załączam poniżej:
public class MainActivity extends AppCompatActivity {
private EditText etname, ethobby, etusername, etpassword;
private Button btnregister;
private TextView tvlogin;
private PreferenceHelper preferenceHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
preferenceHelper = new PreferenceHelper(this);
if(preferenceHelper.getIsLogin()){
Intent intent = new Intent(MainActivity.this,WelcomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();
}
etname = (EditText) findViewById(R.id.etname);
ethobby = (EditText) findViewById(R.id.ethobby);
etusername = (EditText) findViewById(R.id.etemail);
etpassword = (EditText) findViewById(R.id.etpassword);
btnregister = (Button) findViewById(R.id.btn);
tvlogin = (TextView) findViewById(R.id.tvlogin);
tvlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,LoginActivity.class);
startActivity(intent);
MainActivity.this.finish();
}
});
btnregister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
registerMe();
}
});
}
private void registerMe() {
final String name = etname.getText().toString();
final String hobby = ethobby.getText().toString();
final String username = etusername.getText().toString();
final String password = etpassword.getText().toString();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(RegisterInterface.REGIURL)
.addConverterFactory(ScalarsConverterFactory.create())
.build();
RegisterInterface api = retrofit.create(RegisterInterface.class);
Call<String> call = api.getUserRegi(name,hobby,username,password);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Log.i("Responsestring", response.body().toString());
//Toast.makeText()
if (response.isSuccessful()) {
if (response.body() != null) {
Log.i("onSuccess", response.body().toString());
String jsonresponse = response.body().toString();
try {
parseRegData(jsonresponse);
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.i("onEmptyResponse", "Returned empty response");//Toast.makeText(getContext(),"Nothing returned",Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
}
private void parseRegData(String response) throws JSONException {
JSONObject jsonObject = new JSONObject(response);
if (jsonObject.optString("status").equals("true")){
saveInfo(response);
Toast.makeText(MainActivity.this, "Registered Successfully!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this,WelcomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();
}else {
Toast.makeText(MainActivity.this, jsonObject.getString("message"), Toast.LENGTH_SHORT).show();
}
}
private void saveInfo(String response){
preferenceHelper.putIsLogin(true);
try {
JSONObject jsonObject = new JSONObject(response);
if (jsonObject.getString("status").equals("true")) {
JSONArray dataArray = jsonObject.getJSONArray("data");
for (int i = 0; i < dataArray.length(); i++) {
JSONObject dataobj = dataArray.getJSONObject(i);
preferenceHelper.putName(dataobj.getString("name"));
preferenceHelper.putHobby(dataobj.getString("hobby"));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Czy mógłyby prosić o podpowiedź co jest nie tak w kodzie jak również o informację w jaki sposób mogę sprawdzić jaki dokładnie pełny URL jest wysyłany POSTem do serwera?
Dziękuję i pozdrawiam w nowym roku!