2013-01-11 69 views
1

我正在看其他帖子,但我不能做我的。我想更新我的位置,并在我的目标位置的“x”米处发出警报噪音。更新android中的当前位置Gps LocationListener

我已经使用这个代码:

private TextView m1TextMessage, m2TextMessage, m3TextMessage; 
private LocationManager locationManager; 
private Location targetLocation; 
double longitude, latitude; 
private float distancia; 
ProgressDialog pd; 
LocationListener listener; 

这里是我的LocationListener的:

public class MyLocationListener implements LocationListener { 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 
     float dist=0; 
     float error=0; 

     //Escribir posición actual en m1TextMessage 
     latitude =location.getLatitude(); 
     longitude = location.getLongitude(); 

     //calcular distancia al destino y error estimado 
     //Escribir distancia al destino y error en m3TextMessage 

     Location loc2= new Location(LocationManager.GPS_PROVIDER); 

     if (loc2 != null) 
      { 
       dist=location.distanceTo(targetLocation); 
       error = location.getAccuracy(); 
       if(dist < distancia){ 
        Toast.makeText(getApplicationContext(), "Distancia menor a 10 metros, "+dist+" metros.",Toast.LENGTH_SHORT).show(); 
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification); 
        r.play(); 
        } 
      }else 
       Toast.makeText(getApplicationContext(), "location actual es null!!",Toast.LENGTH_SHORT).show(); 


      m1TextMessage.setText("Posición actual: "+longitude+", "+latitude+"\n"); 
      m2TextMessage.setText("Posición objetivo: "+targetLocation.getLatitude()+", "+targetLocation.getLongitude()+"\n"); 
      m3TextMessage.setText("Distancia al objetivo: "+dist+"\nError estimado: "+error); 
     //Lanzar un Toast si la distancia al destino es inferior a 10 metros 

    } 

}; 

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

    setContentView(R.layout.activity_main); 

    m1TextMessage=(TextView) findViewById(R.id.actualPos); 
    m2TextMessage=(TextView) findViewById(R.id.destino); 
    m3TextMessage=(TextView) findViewById(R.id.distanciaa); 
    Button localiza = (Button)findViewById(R.id.button1); 

    locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
    localiza.setOnClickListener(this); 


} 

public class GPSLocation extends AsyncTask<Void, Void, Void> 
{ 
    boolean running =true; 
      @Override 
      protected void onPreExecute() 
      { 
       super.onPreExecute(); 
       pd = new ProgressDialog(PracticaGPS.this); 
       pd.setOnCancelListener(new DialogInterface.OnCancelListener(){ 
         public void onCancel(DialogInterface dialog) { 
          pd.cancel(); 
         } 
       }); 
       longitude=0; 
       latitude =0; 
       getLonLat(); 
       pd.setCancelable(true); 
       pd.setMessage("Getting GPS Location..."); 
       pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); 

       pd.show(); 

      } 

      @Override 
      protected void onProgressUpdate(Void... values) { 
       super.onProgressUpdate(values); 


       // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog 
      } 

      @Override 
      protected void onPostExecute(Void result) 
      { 


        pd.dismiss(); 
      } 

      @Override 
      protected Void doInBackground(Void... params) { 
       boolean isDataSubmitted = false; 

       while(!isDataSubmitted) 
       { 
        if(longitude !=0 && latitude!=0) 
        { 

         isDataSubmitted = true; 
         Log.d("LONGITUD", ""+longitude); 
         Log.d("LATITUDE", ""+latitude); 

        } 
       } 

       return null;  
      } 
} 


public void getLonLat(){ 
    listener = new MyLocationListener(); 

    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
     (locationManager).requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10,listener); 
     new GPSLocation().execute(); 
    }else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 10, listener); 
     Log.d("Long", ""+longitude); 
    } else 
     enableLocationSettings(); 

} 

@Override 
public void onStart(){ 

    //Crear servicio de localización LocationManager  
    //Determinar si el GPS está encendido 
    //Caso esté apagado, permitir al usuario activarlo mediante método enableLocationSettings() 

    //Solicitar actualizaciones de posición al proveedor de GPS (opcionalmente también al proveedor de red) 
    //Nota: el LocationListener ya ha sido creado: listener 


    super.onStart(); 
} 


private void enableLocationSettings() { //enable Location services is necessary 
    Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
    startActivity(settingsIntent); 
} 


@Override 
public void onStop(){ 
    locationManager.removeUpdates(listener); 
    super.onStop(); 
} 

public void onClick(View v) { 
     EditText lat, lon, distan; 
     lat = (EditText)findViewById(R.id.latitud); 
     lon = (EditText)findViewById(R.id.longitud); 
     targetLocation = new Location("Target Position"); 
     targetLocation.setLatitude(Double.valueOf(lat.getText().toString())); //punto pre-definido, 
     targetLocation.setLongitude(Double.valueOf(lon.getText().toString())); //no cambiar el valor 
     targetLocation.setAltitude(0); 
     distan = (EditText)findViewById(R.id.distancia); 
     distancia = Float.valueOf(distan.getText().toString()); 
     new GPSLocation().execute(); 

} 

}

这里是我的XML代码:

<TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Longitud: " /> 

    <EditText 
     android:id="@+id/longitud" 
     android:layout_width="101dp" 
     android:layout_height="wrap_content" 
     android:ems="10" /> 

    <TextView 
     android:id="@+id/texto2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Latitud: " /> 

    <EditText 
     android:id="@+id/latitud" 
     android:layout_width="105dp" 
     android:layout_height="wrap_content" 
     android:ems="10" > 

     <requestFocus /> 
    </EditText> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Distancia mínima alarma" /> 

    <EditText 
     android:id="@+id/distancia" 
     android:layout_width="150dp" 
     android:layout_height="wrap_content" 
     android:ems="10" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Enviar Localizacion" /> 

    <TextView 
     android:id="@+id/actualPos" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dp" 

     /> 

    <TextView 
     android:id="@+id/destino" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dp" 

     /> 
    <TextView 
     android:id="@+id/distanciaa" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dp" 

     /> 

我想很简单,但我可以管理它。谢谢。

+0

你得到你的当前位置正确的权利? – itsrajesh4uguys

回答

0

如果你会正确调用此方法,只要你想获得从你当前位置到目标位置的距离..这将提供距离..根据谷歌服务。简单它会返回值...它会很好地工作。希望它能帮助你。

package com.google.map; 
import java.io.IOException; 
import java.io.InputStream; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
public class Distance { 

public String getDistance(String Source,String Destination) { 
    StringBuilder stringBuilder = new StringBuilder(); 
    String duration_final_value = ""; 
    try { 

     Source = Source.replaceAll(" ", "%20"); 
     Destination = Destination.replaceAll(" ", "%20"); 

     HttpPost httppost = new HttpPost(
       "http://maps.google.com/maps/api/directions/json?origin=" 
         + Source + "&destination=" + Destination 
         + "&sensor=false&units=metric&mode=driving");//&mode=walking,driving 
     HttpClient client = new DefaultHttpClient(); 
     HttpResponse response; 
     stringBuilder = new StringBuilder(); 

     response = client.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     InputStream stream = entity.getContent(); 
     int b; 
     while ((b = stream.read()) != -1) { 
      stringBuilder.append((char) b); 
     } 
    } catch (ClientProtocolException e) { 
    } catch (IOException e) { 
    } 

    JSONObject jsonObject = new JSONObject(); 
    try { 
     jsonObject = new JSONObject(stringBuilder.toString()); // first we need to get the full json object which google returns  
     JSONArray routes_Array = jsonObject.getJSONArray("routes"); // in that first we need to go into the routes array 
     JSONObject routes_object = (JSONObject) routes_Array.get(0); // in that we need first item 
     JSONArray legs_Array = routes_object.getJSONArray("legs"); // then go into the legs array 
     JSONObject legs_object = (JSONObject) legs_Array.get(0); // in that we need first item. 
     JSONObject duration_object = legs_object.getJSONObject("distance"); // go into the distance object  
     // pull out the "duration" object 
     duration_final_value = duration_object.getString("text"); // this should be the duration text value (20 hours 40 mins) 



    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return duration_final_value; 
} 
}