2014-02-08 7 views
1

Я пытаюсь сделать простую программу для выполнения расчетов расстояний, которые будут показаны в списке. Я использую GPSTracker от androidhive, и вызов широты и долготы Ф.О. мой список АктивностьAndroid-Получить текущее местоположение, но верность широты и долготы 0.0 (сделать неправильный расчет)

public class GPSTracker extends Service implements LocationListener { 

private final Context mContext; 
boolean isGPSEnabled =false; 
boolean isNetworkEnabled = false; 
boolean canGetLocation = false; 
Location location; 
double latitude; 
double longitude; 

// The minimum distance to change Updates in meters 
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 

// The minimum time between updates in milliseconds 
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute 

// Declaring a Location Manager 
protected LocationManager locationManager; 

public GPSTracker(Context context){ 
    this.mContext = context; 
    getLocation(); 
} 

public Location getLocation() { 
    try{ 
     locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 
     isGPSEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
     if(!isGPSEnabled&& !isNetworkEnabled){ 
      //no network enable 
     }else { 
      this.canGetLocation = true; 
      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(isGPSEnabled){ 
       if(location == null){ 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        if(location != null){ 
         latitude = location.getLatitude(); 
         longitude = location.getLongitude(); 
        } 
       } 
      } 
     } 

    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
    return location;   
} 

public void stopUsingGPS(){ 
    if(locationManager != null){ 
     locationManager.removeUpdates(GPSTracker.this); 

    } 
} 

public double getLatitude(){ 
    if(location != null){ 
     latitude = location.getLatitude(); 
    } 
    return latitude; 
} 

public double getLongitude(){ 
    if(location != null){ 
     longitude = location.getLongitude(); 

    } 
    return longitude; 
} 

public boolean canGetLocation(){ 
    return this.canGetLocation; 
} 


/** 
* Function to show settings alert dialog 
* On pressing Settings button will lauch Settings Options 
* */ 
public void showSettingsAlert(){ 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

    // Setting Dialog Title 
    alertDialog.setTitle("GPS is settings"); 

    // Setting Dialog Message 
    alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

    // On pressing Settings button 
    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog,int which) { 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      mContext.startActivity(intent); 
     } 
    }); 

    // on pressing cancel button 
    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
     dialog.cancel(); 
     } 
    }); 

    // Showing Alert Message 
    alertDialog.show(); 
} 



@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 

} 

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

} 

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

} 

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

} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 
} 

И мой список Активность

public class Mobil extends ListFragment implements LocationListener{ 
GPSTracker gps; 
private static final String url = "http://10.0.2.2/tambalban/car.php"; 

JSONArray tambalban = null; 
ArrayList<HashMap<String, String>> listMobil = new ArrayList<HashMap<String, String>>(); 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);    
    new getJSONData().execute();   
} 

public class getJSONData extends 
     AsyncTask<String, Integer, ArrayList<HashMap<String, String>>> { 

    @Override 
    protected ArrayList<HashMap<String, String>> doInBackground(
      String... params) { 

     JSONParser jParser = new JSONParser(); 
     JSONObject json = jParser.getJSONFromURL(url); 

     gps = new GPSTracker(getActivity()); // is it right calling from GPSTracker?  
     double lat_user = gps.getLatitude(); // get latitude, right? 
     double lng_user = gps.getLongitude(); 
     System.out.println("lat_user : "+lat_user+""); // print in logcat return 0.00 
     System.out.println("lng_user : "+lng_user+"");// print in logcat return 0.00  

     try { 
      tambalban = json.getJSONArray(TAG_TAMBALBAN); 

      for (int i = 0; i < tambalban.length(); i++) { 
       JSONObject mtr = tambalban.getJSONObject(i); 

       String id_tb = mtr.getString(TAG_ID); 
       String name_tb = mtr.getString(TAG_NAMA); 
       String address_tb = mtr.getString(TAG_ALAMAT); 
       String telp_tb = mtr.getString(TAG_TELP); 
       String lat = mtr.getString(TAG_LAT); 
       String lng = mtr.getString(TAG_LNG); 

       double lat_tujuan = Double.parseDouble(lat); 
       double lng_tujuan = Double.parseDouble(lng); 
         double distance = hitungJarak(lat_user, lng_user, lat_tujuan, lng_tujuan); 
       distance = RoundDecimal(distance, 2); 
       String dist = Double.toString(distance)+" km"; 

       HashMap<String, String> a = new HashMap<String, String>(); 

       a.put(TAG_ID, id_tb); 
       a.put(TAG_NAMA, name_tb); 
       a.put(TAG_ALAMAT, address_tb); 
       a.put(TAG_TELP, telp_tb); 
       a.put(TAG_LAT, lat); 
       a.put(TAG_LNG, lng); 
       a.put(TAG_JARAK, dist); 

       listMobil.add(a);      
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return listMobil; 

    } 

private double RoundDecimal(double distance, int i) { 
     BigDecimal bd = new BigDecimal(distance); 
     bd = bd.setScale(i, 6);   
     return bd.doubleValue(); 
    } 


private double hitungJarak(double lat_user, double lng_user, 
      double lat_tujuan, double lng_tujuan) { 
    double dist; 
    double radius = 6371; 
    double dLat = Math.toRadians(lat_tujuan - lat_user); 
    double dLon = Math.toRadians(lng_tujuan- lng_user); 
    double a = Math.sin(dLat/2) * Math.sin(dLat /2) 
      + Math.cos(Math.toRadians(lat_user)) * Math.cos(Math.toRadians(lat_tujuan)) 
      * Math.sin(dLon/ 2) * Math.sin(dLon/2); 

    double c = 2 * Math.asin(Math.sqrt(a)); 
    double valueResult = radius * c; 
    double km = valueResult/1; 
    DecimalFormat newFormat = new DecimalFormat("####"); 
    int kmInDec = Integer.valueOf(newFormat.format(km)); 

    dist = radius * c; 

     return dist; 
    } 


    @Override 
    protected void onPostExecute(
      ArrayList<HashMap<String, String>> listMobil) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(listMobil); 
     ListAdapter adapter = new SimpleAdapter(getActivity(), listMobil, 
       R.layout.list_item, new String[] { TAG_NAMA, TAG_ALAMAT, TAG_JARAK }, 
       new int[] { R.id.namatb, R.id.alamattb,R.id.jarak }); 
     setListAdapter(adapter);   
    } 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    return inflater.inflate(R.layout.list_fragment, container, false); 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 

    super.onListItemClick(l, v, position, id); 
    String pilih = getListAdapter().getItem(position).toString(); 
    Toast.makeText(getActivity(), 
      pilih, 
      Toast.LENGTH_LONG).show(); 



    Intent i = new Intent(getActivity(), DetailDaftar.class); 
    Bundle bundle = new Bundle(); 
    bundle.putString("Selected", pilih); 


    i.putExtras(bundle); 
    startActivity(i); 
} 

@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 

} 

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

} 

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

} 

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

} 
} 

проверяю с помощью Sytem.out.println, как широта и долгота возвращения 0.00. Я ошибаюсь, вызывая текущее местоположение? Спасибо вам за любую помощь.

+0

Вы добавили разрешение в manifest.xml файл '< use-permission android: name = "android.permission.ACCESS_COARSE_LOCATION" /> ' –

+0

спасибо помощнику за ваш ответ, у меня есть добавлено разрешение в манифест раньше, но он все еще не получает lat и lng. – Bambang

+0

@Bambang: Возможно, вы включили только опцию GPS и отключенную сеть и опцию Wi-Fi, и вы пытаетесь получить доступ к местоположению GPS в помещении. Если вы это сделаете, вы получите только 0.0 для обоих. Проверь это! – TheDevMan

ответ

0

Ваш класс GPSTracker вернет текущую широту и долготу местоположения. Я уже проверил и возвращает значения lat/long. Во второй части я не получаю, что вы пытаетесь делать с JSON, но если вы хотите, чтобы получить широту и долготу в другой деятельности, а затем просто экземпляр класса GPSTracker как

Внутри деятельности

GPSTracker трекера;

и внутри onCreate метода

трекер = новый GPSTracker (это);

и еще одна вещь ypu не может распечатать или записать любой оператор в doInBackground(), потому что он будет работать только в фоновом режиме. Попробуйте тоста свой выход в onPostExecute() метод

+0

Я перемещаю GPSTracker в onCreate, все еще не получая lat и lng. О печати это работает. – Bambang

1

Вы должны создать свой GPSTracker gps объект за пределами вашей AsyncTask попробовать как:

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState);  
gps = new GPSTracker(getActivity()); // is it right calling from GPSTracker?    
new getJSONData().execute();   

}

А также добавить требуется permission в свой manifest.xml файл:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
+0

Спасибо за ответ, конечно, я добавил эти разрешения. Я пытаюсь переместить GPSTracker в onCreate, но все еще не получаю lat и lng – Bambang

0

Если вы используете эмулятор для тестирование, то вы должны сделать следующее:

1.In редактора (я предполагаю, что вы используете Eclipse) перейти к

Window -> Open Perspective -> Show View -> Emulator Control. 

-Там вы увидите два редактируемых текстовое поля с тегами «широтами» и ' долготы.

3 Правильно установите значения и нажмите «Отправить».

Теперь ваш эмулятор имеет значения, установленные вами.

+0

Я никогда не добавляю lat и lng с DDMS, я использую putty для ввода команд telnet. Есть ли у вас какие-либо идеи для этого? Я также думаю, что мой эмулятор, возможно, ошибка – Bambang

0

Это мой код для получения долготы и широты, он прекрасно работает для меня

public void setLocation() { 
      LocationManager LM; 

    LM = (LocationManager) CurrentContext 
      .getSystemService(Context.LOCATION_SERVICE); 

    Criteria criteria = new Criteria(); 
      // adjust ur criteria with ur desired features 

    provider = LM.getBestProvider(criteria, true); 

    try { 

     LM.requestLocationUpdates(provider, 1000, 1, this); 

     if (LM != null) { 
      Loc = LM.getLastKnownLocation(provider); 

      if (Loc != null) { 
       userLocation = new Location(""); 

       userLocation.setLatitude(Loc.getLatitude()); 
       userLocation.setLongitude(Loc.getLongitude()); 

      } 
     } 

    } catch (Exception e) { 
     DisplayUnexpected(); 
     e.printStackTrace(); 
     return; 
    } 

    LM.removeUpdates(this); 
} 
+0

Привет Mate, он по-прежнему не исправляет мою проблему, мне интересно, ListFragment, правильно ли это, когда я использую listFragment вместо Activity Activity – Bambang

+0

Не имеет значения, вы используете активность или ListFragment Не могли бы вы напечатать логарифм или уведомить меня об ошибке? –

0

Используйте этот код

public class LocationUpdateService extends Service { 


     private LocationManager _locationManager; 
     private boolean _gpsEnabled,_networkEnabled; 
     @Override 
     public IBinder onBind(Intent arg0) { 
      // TODO Auto-generated method stub 
      return null; 
     } 



     @Override 
     public void onCreate() { 
      // TODO Auto-generated method stub 
      super.onCreate(); 
      _locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
      _gpsEnabled = _locationManager 
        .isProviderEnabled(LocationManager.GPS_PROVIDER); 
      _networkEnabled = _locationManager 
        .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     } 

     public void onStart(Intent intent, int startId) { 

      Log.e("onStart","onStart"); 

      if(_gpsEnabled) { 
       _locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
         1000, 0, locationListener); 
      } else if (_networkEnabled){ 
       _locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
         1000, 0, locationListener); 
      } 

     }; 




LocationListener locationListener = new LocationListener() { 
     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
     } 

     @Override 
     public void onLocationChanged(final Location location) { 
      final Location currentLocation = location; 

      Log.e("onLocationChanged", " " + currentLocation); 
      _locationManager.removeUpdates(locationListener); 

      Toast.makeText(LocationUpdateService_2.this, "Location lat "+currentLocation.getLatitude()+ " long "+currentLocation.getLongitude() , Toast.LENGTH_LONG).show(); 

    } 

    }; 

 Смежные вопросы

  • Нет связанных вопросов^_^