ggeo1 Δημοσ. 15 Μαΐου 2013 Δημοσ. 15 Μαΐου 2013 Καλησπέρα , φτιάχνω μια εφαρμογή που χρησιμοποιεί το GPS και θέλω όσο ψάχνει για την τοποθεσία να δείχνει ένα toast message "Waiting.." και όταν την βρει να δείξει τις συντεταγμένες. Για να ξεκινήσω το GPS χρησιμοποιώ : case R.id.getlocation: gps = new GPSTracker(ShowList.this); // check if GPS enabled if(gps.canGetLocation()){ latitude = gps.getLatitude(); longitude = gps.getLongitude(); Toast.makeText(getApplicationContext(), "Your Location is \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show(); }else{ gps.showSettingsAlert(); } Τώρα , δοκίμασα κάτι τέτοιο: case R.id.getlocation: gps = new GPSTracker(ShowList.this); // check if GPS enabled if(gps.canGetLocation()){ showToast(); }else{ gps.showSettingsAlert(); } και η function: private void showToast() { new Thread() { public void run() { try { while (message) { runOnUiThread(new Runnable() { @Override public void run() { latitude = gps.getLatitude(); longitude = gps.getLongitude(); Toast.makeText(getApplicationContext(), "Waiting for location", Toast.LENGTH_LONG).show(); //}else{ // gps.showSettingsAlert(); // } } }); Thread.sleep(1000); message=false; } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); αλλά δεν λειτουργεί καταρχήν το GPS ,δηλ εννοώ δείχνει ότι ψάχνει αλλά δε βρίσκει την τοποθεσία. Επίσης,δεν είμαι σίγουρος ότι λειτουργεί σωστά! Αν γνωρίζει κανείς πως πρέπει να το υλοποιήσω..
warlock9_0 Δημοσ. 15 Μαΐου 2013 Δημοσ. 15 Μαΐου 2013 τι είναι το GPSTracker? LocationManager θες και να τον βάλεις να ζητάει updates στην θέση αυτό το διάβασες? http://developer.android.com/guide/topics/location/strategies.html
ggeo1 Δημοσ. 15 Μαΐου 2013 Μέλος Δημοσ. 15 Μαΐου 2013 Nαι εντάξει , το GPSTracker περιέχει τον Location Manager. Δε θέλω να ζητάει updates.Αυτό είναι άμα θες να ανανεώνει την θέση σου εφόσον κινείσαι. Απλά θέλω μέχρι να βρει την τοποθεσία να δείχνει το μήνυμα "περίμενε" και όταν την βρει να δείξει το μήνυμα με την τοποθεσία.
warlock9_0 Δημοσ. 15 Μαΐου 2013 Δημοσ. 15 Μαΐου 2013 τα toasts δεν είναι για αυτή τη δουλειά γιατί δε βάζεις ένα indeterminate progress bar και μόλις βρει τη θέση τότε να βγάζει το toast?
ggeo1 Δημοσ. 16 Μαΐου 2013 Μέλος Δημοσ. 16 Μαΐου 2013 Δεν έχω χρησιμοποιήσει progress bar και προσπάθησα το παρακάτω αλλά πατώντας το κουμπί για να ενεργοποιήσει το GPS ,δε γίνεται τίποτα. case R.id.getlocation: gps = new GPSTracker(ShowList.this); if(gps.canGetLocation()){ GetGPSData gps2 = new GetGPSData(); gps2.execute(); }else{ gps.showSettingsAlert(); } Πρέπει να χρησιμοποιήσω AsyncTask από ότι κατάλαβα για να έχω τη μπάρα? (Αν μπορείς να με βοηθήσεις σε αυτό γιατί δεν έχω ιδέα !) public class GetGPSData extends AsyncTask<Void, Integer, Void> { @Override protected void onPreExecute() { super.onPreExecute(); myprogressBar.setVisibility(View.VISIBLE); myprogressBar.setProgress(0); } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); myprogressBar.setProgress(progress[0]); } @Override protected Void doInBackground(Void... params) { latitude = gps.getLatitude(); longitude = gps.getLongitude(); while (latitude == 0 || longitude ==0) { try { Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // let the background thread sleep } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); myprogressBar.setProgress(100); Toast.makeText(getBaseContext(), "Your Location is \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show(); } } ------------------------EDIT--------------------------------- Λοιπόν , το διόρθωσα και τώρα λειτουργεί , απλά η μπάρα είναι μονίμως "άδεια".
warlock9_0 Δημοσ. 16 Μαΐου 2013 Δημοσ. 16 Μαΐου 2013 ναι, για την μπάρα θες asynctask ή intentservice όπως το έχεις κάνει θα έπρεπε να δουλεύει με μια ματιά που του έριξα αλλά από ό,τι φαίνεται έχεις θέμα με το gps που δεν κλειδώνει γι αυτό σου είπα δοκίμασε με location manager, γιατί δεν έχω ιδέα τι κάνει αυτό το gpstracker permissions του έχεις βάλει? επίσης η progress bar που σου είπα δεν είναι αυτή, πρέπει να της βάλεις indeterminate, και είναι το κυκλάκι που γυρίζει που δεν χρειάζεται να του δίνεις values, τρέχει συνέχεια σε παρόμοια περίπτωση το είχα βάλει στο layout της εφαρμογής hidden και όποτε έτρεχα κάτι το εμφάνιζα μέχρι να πάρω αποτέλεσμα
ggeo1 Δημοσ. 16 Μαΐου 2013 Μέλος Δημοσ. 16 Μαΐου 2013 Λοιπόν, την έχω βάλει indeterminate. <ProgressBar android:id="@+id/theprogressBar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:indeterminate="true" android:padding="5dp" /> Όσον αφορά το GPS , ένα κομμάτι : public Location getLocation() { try { locationManager = (LocationManager) mContext .getSystemService(LOCATION_SERVICE); // getting GPS status isGPSEnabled = locationManager .isProviderEnabled(LocationManager.GPS_PROVIDER); // getting network status isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { // no network provider is enabled } else { this.canGetLocation = true; // First get location from Network Provider if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("Network", "Network"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } // if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("GPS Enabled", "GPS Enabled"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } } } catch (Exception e) { e.printStackTrace(); } return location; } AsynchTask: public class GetGPSData extends AsyncTask<Void, Integer, Void> { @Override protected void onPreExecute() { super.onPreExecute(); myprogressBar.setVisibility(View.VISIBLE); //myprogressBar.setProgress(0); } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); //myprogressBar.setProgress(progress[0]); } @Override protected Void doInBackground(Void... params) { latitude = gps.getLatitude(); longitude = gps.getLongitude(); while (latitude == 0 || longitude ==0) { try { Thread.sleep(1000); publishProgress(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // let the background thread sleep } return null; } protected void onCancelled() { Toast.makeText(getBaseContext(), "Error connecting", Toast.LENGTH_LONG).show(); } Στο AsyncTask πρόσθεσα την publishProgress(); και αφαίρεσα τις τιμές setProgress. Τώρα , το θέμα είναι ότι 1) η μπάρα συνέχεια γυρνάει χωρίς να σταματήσει 2) Υποτίθεται πως όταν βρει το σήμα θα μου δώσει το Toast message αλλά πρέπει πάλι να πατήσω το κουμπί για να πάρει την τοποθεσία και τότε μου το δείχνει (εφόσον βέβαια έχει περάσει κάποιο διάστημα ).
warlock9_0 Δημοσ. 16 Μαΐου 2013 Δημοσ. 16 Μαΐου 2013 αρχικά, η doInBackground τρέχει μια φορά οπότε, μπαίνει στο while αφού δεν έχει τιμές για τις συντεταγμένες και μένει εκεί όταν ξαναπατάς το κουμπί αυτό έχει βρει συντεταγμένες και γι αυτό στις δείχνει ο location manager έχει μια συνάρτηση onLocationChanged που τρέχει κάθε φορά που βρίσκει θέση, εκεί πρέπει να βάλεις το toast το GPSTracker την υλοποιεί πουθενά? edit για δοκίμασε αυτό latitude = gps.getLatitude(); longitude = gps.getLongitude(); while (latitude == 0 || longitude ==0) .... να το κάνεις έτσι while (gps.getLatitude()== 0 || gps.getLongitude()==0) ... και ξαναβάλε και την postupdate στο asynctask με getlatitude και getlongitude
ggeo1 Δημοσ. 16 Μαΐου 2013 Μέλος Δημοσ. 16 Μαΐου 2013 Ωραία ,οπότε πρέπει να βγω κάπως από το while αλλά πως? H onLocationChanged είναι άδεια (είναι μέσα στο GPStracker) Δηλ, δεν μπορώ να έχω το toast εκεί που το έχω τώρα? και ξαναβάλε και την postupdate στο asynctask με getlatitude και getlongitude Εννοείς την onPostExecute ? Γιατί εκεί δεν έχω latitude και longitude Λάθος.Ἐχω latitude και longitude στο Toast.Αυτό εννοείς?
warlock9_0 Δημοσ. 16 Μαΐου 2013 Δημοσ. 16 Μαΐου 2013 ναι αυτήν εννοούσα, μου ξέφυγε αν κάνεις αυτό που σου είπα λογικά θα τρέχει το while μέχρι να βρει συντεταγμένες μόλις βρει θα βγει και θα τρέξει η onPostExecute
warlock9_0 Δημοσ. 16 Μαΐου 2013 Δημοσ. 16 Μαΐου 2013 δε μου έρχεται κάτι άλλο τώρα, θα το ξαναδω μόλις μπορέσω
ggeo1 Δημοσ. 19 Μαΐου 2013 Μέλος Δημοσ. 19 Μαΐου 2013 public class GetGPSData extends AsyncTask<Void, Integer, Void> { ProgressDialog progressDialog = null; @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = new ProgressDialog(ShowList.this); progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { GetGPSData.this.cancel(true); } }); progressDialog.setMessage("Waiting for location..."); progressDialog.setIndeterminate(true); progressDialog.setCancelable(true); progressDialog.show(); } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); } @Override protected Void doInBackground(Void ... params) { latitude = gps.getLatitude(); longitude = gps.getLongitude(); while (latitude == 0 || longitude == 0) { try { Thread.sleep(1000); }catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; } protected void onCancelled() { Toast.makeText(getBaseContext(), "Cancelled/Error connecting", Toast.LENGTH_LONG).show(); progressDialog.dismiss(); } @Override protected void onPostExecute(Void result) { progressDialog.dismiss(); Toast.makeText(ShowList.this, "Your Location is \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show(); } } case R.id.getlocation: // create class object gps = new GPSTracker(ShowList.this); // check if GPS enabled if(gps.canGetLocation()){ GetGPSData gps2 = new GetGPSData(); gps2.execute(); }else{ gps.showSettingsAlert(); }
warlock9_0 Δημοσ. 19 Μαΐου 2013 Δημοσ. 19 Μαΐου 2013 αυτό κάνει αυτό που θες το main activity package example.test; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; public class MainActivity extends Activity implements LocationListener{ LocationManager locationManager; ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.getlocation: locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); progressDialog = new ProgressDialog(this); progressDialog.setMessage("Waiting for location..."); progressDialog.setIndeterminate(true); progressDialog.setCancelable(true); progressDialog.show(); break; default: return super.onOptionsItemSelected(item); } return true; } @Override public void onLocationChanged(Location location) { progressDialog.dismiss(); Toast.makeText(this, "Your location is: " + location.getLatitude() + " " + location.getLongitude(), Toast.LENGTH_LONG).show(); locationManager.removeUpdates(this); } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } } και στο manifest θέλει permission <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> αν θες να παίρνει σήμα και από το δίκτυο αν δε βρίσκει gps βάζεις άλλο ένα request updates αλλά από network και νομίζω θέλει και permission internet
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα