I am newbie to the android development. I am using Android Studio. I am making an app in which there is a dropdown list of names. On selecting any name, the corresponding ID of that name is shown at the app. Then there is a button which will search for the user's current gps coordinates and show them on the app. I searched for similar questions and found some links (I will post them at the end) but I couldn't understand them. Below is the screenshot of the app
I have two tables in mysql; users and activity, as shown below
Users
Activity
The UserId is the foreign key in activity table i.e. the Id from users table will be inserted into it.
I have created following script to return the data as JSON:
<?php require_once ('config.php'); $sql = "SELECT * FROM users"; $r = mysqli_query($con,$sql); $result = array(); while($row = mysqli_fetch_array($r)){ array_push($result,array( 'Id'=>$row['Id'], 'Name'=>$row['Name'] )); }//end while echo json_encode(array('users'=>$result)); mysqli_close($con); ?> In my app code I have created a users class
Users Class
public class Users { private String Id; private String Name; public String getId() { return Id; } public void setId(String id) { this.Id = id; } public String getName() { return Name; } public void setName(String name) { this.Name = name; }} JSON CLASS
public class JSONfunctions { public static JSONObject getJSONfromURL(String url) { String json = ""; JSONObject jsonObject = null; try { HttpClient httpClientt = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClientt.execute(httpGet); BufferedReader br = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent())); StringBuffer sb = new StringBuffer(); String line = ""; while ((line = br.readLine()) != null) { sb.append(line); } json = sb.toString(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { jsonObject = new JSONObject(json); } catch (JSONException e) { e.printStackTrace(); } return jsonObject; } MainActivity
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); _latitude = (TextView)findViewById(R.id.latitude); _longitude = (TextView)findViewById(R.id.longitude); btn_get_coordinates = (Button)findViewById(R.id.button); final PermissionListener permissionlistener = new PermissionListener() { @Override public void onPermissionGranted() { //Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT).show(); buildGoogleApiClient(); //checkLocation(); //check whether location service is enable or not in your phone } @Override public void onPermissionDenied(ArrayList<String> deniedPermissions) { Toast.makeText(MainActivity.this, "Permission Denied\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show(); } }; btn_get_coordinates.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new TedPermission(MainActivity.this) .setPermissionListener(permissionlistener) .setRationaleMessage("This app needs Permission to find your location") .setPermissions(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) .check(); } }); // Download JSON file AsyncTask new DownloadJSON().execute(); } /////////////////////////////////////// Start of Location Services /////////////////////////////////////////////////////// protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } else Toast.makeText(this, "Not Connected!", Toast.LENGTH_SHORT).show(); } /*Ending the updates for the location service*/ @Override protected void onStop() { mGoogleApiClient.disconnect(); super.onStop(); } @Override public void onConnected(@Nullable Bundle bundle) { settingRequest(); } @Override public void onConnectionSuspended(int i) { Toast.makeText(this, "Connection Suspended!", Toast.LENGTH_SHORT).show(); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Toast.makeText(this, "Connection Failed!", Toast.LENGTH_SHORT).show(); if (connectionResult.hasResolution()) { try { // Start an Activity that tries to resolve the error connectionResult.startResolutionForResult(this, 90000); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); } } else { Log.i("Current Location", "Location services connection failed with code " + connectionResult.getErrorCode()); } } /*Method to get the enable location settings dialog*/ public void settingRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(10000); // 10 seconds, in milliseconds mLocationRequest.setFastestInterval(1000); // 1 second, in milliseconds mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(mLocationRequest); PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); result.setResultCallback(new ResultCallback<LocationSettingsResult>() { @Override public void onResult(@NonNull LocationSettingsResult result) { final Status status = result.getStatus(); final LocationSettingsStates state = result.getLocationSettingsStates(); switch (status.getStatusCode()) { case LocationSettingsStatusCodes.SUCCESS: // All location settings are satisfied. The client can // initialize location requests here. getLocation(); break; case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: // Location settings are not satisfied, but this can be fixed // by showing the user a dialog. try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). status.startResolutionForResult(MainActivity.this, 1000); } catch (IntentSender.SendIntentException e) { // Ignore the error. } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: // Location settings are not satisfied. However, we have no way // to fix the settings so we won't show the dialog. break; } } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { final LocationSettingsStates states = LocationSettingsStates.fromIntent(data); switch (requestCode) { case 1000: switch (resultCode) { case Activity.RESULT_OK: // All required changes were successfully made getLocation(); break; case Activity.RESULT_CANCELED: // The user was asked to change settings, but chose not to Toast.makeText(this, "Location Service not Enabled", Toast.LENGTH_SHORT).show(); break; default: break; } break; } } public void getLocation() { if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } else { /*Getting the location after aquiring location service*/ mLastLocation = LocationServices.FusedLocationApi.getLastLocation( mGoogleApiClient); if (mLastLocation != null) { // _progressBar.setVisibility(View.INVISIBLE); _latitude.setText("Latitude: " + String.valueOf(mLastLocation.getLatitude())); _longitude.setText("Longitude: " + String.valueOf(mLastLocation.getLongitude())); } else { /*if there is no last known location. Which means the device has no data for the loction currently. * So we will get the current location. * For this we'll implement Location Listener and override onLocationChanged*/ Log.i("Current Location", "No data for location found"); if (!mGoogleApiClient.isConnected()) mGoogleApiClient.connect(); LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, MainActivity.this); } } } @Override public void onLocationChanged(Location location) { mLastLocation = location; _progressBar.setVisibility(View.INVISIBLE); _latitude.setText("Latitude: " + String.valueOf(mLastLocation.getLatitude())); _longitude.setText("Longitude: " + String.valueOf(mLastLocation.getLongitude())); } //////////////////////////////////////////// End of Location services /////////////////////////////////////////////// ////////////////////////////////////////// Start of getting JSON DATA /////////////////////////////////////////////// // Download JSON file AsyncTask private class DownloadJSON extends AsyncTask<Void, Void, Void> { /* @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setMessage("Fetching Users....!"); progressDialog.setCancelable(false); progressDialog.show(); }*/ @Override protected Void doInBackground(Void... params) { // Locate the Users Class users = new ArrayList<Users>(); // Create an array to populate the spinner userList = new ArrayList<String>(); // http://10.0.2.2:8000/MobileApp/index.php //http://10.0.2.2:8000/app/web/users/ //http://192.168.100.8:8000/app/web/users/ // JSON file URL address jsonObject = JSONfunctions.getJSONfromURL("http://192.168.100.15:8000/MobileApp/GET_DATA.php"); try { JSONObject jobj = new JSONObject(jsonObject.toString()); // Locate the NodeList name jsonArray = jobj.getJSONArray("users"); for(int i=0; i<jsonArray.length(); i++) { jsonObject = jsonArray.getJSONObject(i); Users user = new Users(); user.setId(jsonObject.optString("Id")); user.setName(jsonObject.optString("Name")); users.add(user); userList.add(jsonObject.optString("Name")); } } catch (JSONException e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void args) { // Locate the spinner in activity_main.xml Spinner spinner = (Spinner)findViewById(R.id.spinner); // Spinner adapter spinner.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, userList)); // Spinner on item click listener spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { textViewResult = (TextView)findViewById(R.id.textView); // Set the text followed by the position textViewResult.setText("Hi " + users.get(position).getName() + " your ID is " + users.get(position).getId()); } @Override public void onNothingSelected(AdapterView<?> parent) { textViewResult.setText(""); } }); } } //////////////////////////////////////// End of getting JSON DATA ////////////////////////////////////////// When I press the save button the following fields would be inserted into Activity table
Id(Which is auto-increment)UserId(User ID from Users table based on the selected name)Latitude(Of current user)Longitude(Of current user)DateTime(Date time of the user)
Should I have to create an 'activity' class like I have created the User class?
For this I have something in mind
- I would save the data into
xmlortxtfile first then it will be saved into the DB. - I should convert the data into
jsonformat and then save it into DB - Directly save it into the DB by using a query in my
phpscript
Which of these 3 is easiest to implement? It would be very helpful if anyone could provide me a tutorial, though I saw many of them ( 1 , 2 ) and as described above I couldn't understand them :( .
I am stuck to it and don't know what I have to do. Any help would be highly appreciated.


