Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα ,

 

φτιάχνω μια εφαρμογή που χρησιμοποιεί το 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 ,δηλ εννοώ δείχνει ότι ψάχνει αλλά δε βρίσκει την τοποθεσία.

Επίσης,δεν είμαι σίγουρος ότι λειτουργεί σωστά!

 

 

Αν γνωρίζει κανείς πως πρέπει να το υλοποιήσω..

 

 

 

 

 

 

  • Απαντ. 35
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσ.

Nαι εντάξει , το GPSTracker περιέχει τον Location Manager.

 

Δε θέλω να ζητάει updates.Αυτό είναι άμα θες να ανανεώνει την θέση σου εφόσον κινείσαι.

 

Απλά θέλω μέχρι να βρει την τοποθεσία να δείχνει το μήνυμα "περίμενε" και όταν την βρει να δείξει το μήνυμα με την τοποθεσία.

Δημοσ.

τα toasts δεν είναι για αυτή τη δουλειά

γιατί δε βάζεις ένα indeterminate progress bar και μόλις βρει τη θέση τότε να βγάζει το toast?

Δημοσ.

Δεν έχω χρησιμοποιήσει 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---------------------------------

 

Λοιπόν , το διόρθωσα και τώρα λειτουργεί , απλά η μπάρα είναι μονίμως "άδεια".

Δημοσ.

ναι, για την μπάρα θες asynctask ή intentservice

 

όπως το έχεις κάνει θα έπρεπε να δουλεύει με μια ματιά που του έριξα αλλά από ό,τι φαίνεται έχεις θέμα με το gps που δεν κλειδώνει

γι αυτό σου είπα δοκίμασε με location manager, γιατί δεν έχω ιδέα τι κάνει αυτό το gpstracker

 

permissions του έχεις βάλει?

 

επίσης η progress bar που σου είπα δεν είναι αυτή, πρέπει να της βάλεις indeterminate, και είναι το κυκλάκι που γυρίζει που δεν χρειάζεται να του δίνεις values, τρέχει συνέχεια

σε παρόμοια περίπτωση το είχα βάλει στο layout της εφαρμογής hidden και όποτε έτρεχα κάτι το εμφάνιζα μέχρι να πάρω αποτέλεσμα

Δημοσ.

Λοιπόν, την έχω βάλει 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 αλλά πρέπει πάλι να πατήσω το κουμπί για να πάρει την τοποθεσία και τότε μου το δείχνει (εφόσον βέβαια έχει περάσει κάποιο διάστημα ).

 

 

 

 

Δημοσ.

αρχικά, η 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

Δημοσ.

Ωραία ,οπότε πρέπει να βγω κάπως από το while αλλά πως?

 

onLocationChanged είναι άδεια (είναι μέσα στο GPStracker)

 

Δηλ, δεν μπορώ να έχω το toast εκεί που το έχω τώρα?

 

 

και ξαναβάλε και την postupdate στο asynctask με getlatitude και getlongitude

 

 

Εννοείς την onPostExecute ? Γιατί εκεί δεν έχω latitude και  longitude

 

Λάθος.Ἐχω  latitude και  longitude στο Toast.Αυτό εννοείς?

Δημοσ.

ναι αυτήν εννοούσα, μου ξέφυγε

 

αν κάνεις αυτό που σου είπα λογικά θα τρέχει το while μέχρι να βρει συντεταγμένες

μόλις βρει θα βγει και θα τρέξει η onPostExecute

Δημοσ.
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();
           }

Δημοσ.

αυτό κάνει αυτό που θες

 

το 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

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...