2013-08-01 4 views
1

Я попытался получить широту и долготу для текущего местоположения. Однако, когда я использую код ниже, прослушиватель местоположений не запускается вообще. Я добавил разрешение LOCATION в файл манифеста.Невозможно получить широту и долготу

Любой может помочь?

Вот код Java:

package com.example.setlocaction; 


import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.util.Log; 
import android.widget.Toast; 

public class MainActivity extends Activity{ 
double latitude, longitude, radius; 
LocationManager mlocManager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // Acquire a reference to the system Location Manager 
    mlocManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
    // Define a listener that responds to location updates 
    LocationListener locationListener = new LocationListener() 
    {  
     public void onLocationChanged(Location loc) 
     {  
      // Called when a new location is found by the network location provider.  
      Log.i("loc","location changed"); 
      if (loc!=null) 
      { 
       loc.getLatitude(); 
       loc.getLongitude(); 
       String Text = "My current location is: " + 
       "Latitud =" + loc.getLatitude() + 
       "Longitud = " + loc.getLongitude(); 
       Toast.makeText(getApplicationContext(),Text,Toast.LENGTH_SHORT).show(); 

      } 
     }  
     public void onStatusChanged(String provider, int status, Bundle extras) 
     {}  
     public void onProviderEnabled(String provider) 
     {}  
     public void onProviderDisabled(String provider) 
     {} 
    };    

    Criteria criteria = new Criteria(); 
     criteria.setAccuracy(Criteria.ACCURACY_FINE); 
     // 高精度 
     criteria.setAltitudeRequired(false); 
     criteria.setBearingRequired(false); 
     criteria.setCostAllowed(true); 
     criteria.setPowerRequirement(Criteria.POWER_LOW); 
     String provider = mlocManager.getBestProvider(criteria, true); 
    mlocManager.requestLocationUpdates(provider, 2000, 0, locationListener); 
    Location loc=mlocManager.getLastKnownLocation(provider); 
    if (loc==null) 
    { 
     Log.i("loc","loc=null"); 
    } 
} 

} 

mafinest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.setlocaction" 
android:versionCode="1" 
android:versionName="1.0" > 
<uses-sdk 
    android:minSdkVersion="7" 
    android:targetSdkVersion="17" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.RESTART_PACKAGES" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.setlocaction.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

+0

разместим ваш манифеста код здесь – Andrain

+0

Вам нужно COARSE + FINE, разрешенные в манифесте, и время, которое вы ему даете - 2000 мс, что составляет 2 секунды, даже для NETWORK_PROVIDER. Axpand это до 20000 мс и повторите попытку. – g00dy

+0

@David Я отредактировал вопрос и разместил код манифеста. – sam

ответ

1

Прежде всего, текущее решение использует «getLastKnownLocation», что означает, что если вы на самом деле получить долготу и широту, вы не можете быть уверены, что он будет возвращать текущее положение пользователя. Он просто возвращает местоположение, которое было найдено в последнее время, которое может быть далеко.

В этом нет ничего плохого в этом, но это оставляет неопределенность.

Вместо этого, я лично реализовал менеджер местоположения для получения текущего положения пользователя, используя код, предоставленный в следующем посте, который прекрасно работает:

https://stackoverflow.com/a/17290348/2399772

Используя этот специфический код , вам также будет предоставлено преимущество в том, что он сначала пытается использовать соединение WiFi для определения позиции, которая немного лучше. Это не работает, вместо этого он будет использовать GPS. Кроме того, если услуги GPS не включены, будет показан диалог, в котором пользователь должен будет включить их.

Надеюсь, это поможет.

Дополнительные примечания Как я уже говорил в предыдущем посте, то Geolocation API will does unfortunately not work on all devices. Вы можете таким образом рассмотреть вопрос об использовании API обратного геокодирования вместо этого, что дополнительно более надежным:

https://developers.google.com/maps/documentation/geocoding/

Это просто требует, чтобы вы отправить запрос HTTP, который должен содержать координаты широты и долготы, после чего он будет предоставлять ответ в JSON, который легко разбирается.

+0

спасибо Дэвиду, я использовал ваш код в http://stackoverflow.com/a/17290348/2399772. Однако он всегда получает широту и долготу 0.0, 0.0 – sam

+0

Да, это происходит, если вы находитесь в помещении и используете GPS, чтобы найти свою позицию и не включили услуги позиционирования WiFi; у GPS будут проблемы с поиском вашего местоположения, поскольку он не очень надежный. Это, хотя и не проблема с самим кодом, но скорее качество GPS. Код, кажется, работает правильно. Попробуйте включить службы позиционирования WiFi и скажите мне, работает ли это; это обычно делает трюк для меня :) – Demitrian

+0

Я включил Wi-Fi и данные 3G, когда я его отлаживаю, не знаю, почему LocationManager.NETWORK_PROVIDER всегда возвращал «false». Поэтому я могу использовать только GPS. Я немного изменил код и, к счастью, сработал. – sam

0

Иногда это занимает некоторое время для устройства, чтобы доставить первые места, если вы не использовали GPS раньше. Кроме того, убедитесь, что вы находитесь в месте, где вы можете обновлять gps, или попробуйте эмулятор с помощью geo fix через telnet.

0

попробовать этот

public class MyLocationActivity extends Activity implements LocationListener { 
     private LocationManager mgr; 
     private String best; 
     public static double myLocationLatitude; 
     public static double myLocationLongitude; 

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

      mgr = (LocationManager) getSystemService(LOCATION_SERVICE); 

      dumpProviders(); 

      Criteria criteria = new Criteria(); 

      best = mgr.getBestProvider(criteria, true); 
      Log.d("best provider", best); 

      Location location = mgr.getLastKnownLocation(best); 
      dumpLocation(location); 

       //may be some intent here 
     } 

     public void onLocationChanged(Location location) { 
      // TODO Auto-generated method stub 
      dumpLocation(location); 

     } 

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

     } 

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

     } 

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

     } 

     @Override 
     protected void onPause() { 

      super.onPause(); 
      mgr.removeUpdates(this); 
     } 

     @Override 
     protected void onResume() { 

      super.onResume(); 
      mgr.requestLocationUpdates(best, 15000, 1, this); 
     } 

     private void dumpLocation(Location l) { 

      if (l == null) { 

       myLocationLatitude = 0.0; 
       myLocationLongitude = 0.0; 
      } else { 

       myLocationLatitude = l.getLatitude(); 
       myLocationLongitude = l.getLongitude(); 
      } 
     } 

     private void dumpProviders() { 

      List<String> providers = mgr.getAllProviders(); 
      for (String p : providers) { 

       dumpProviders(p); 
      } 
     } 

     private void dumpProviders(String s) { 

      LocationProvider info = mgr.getProvider(s); 
      StringBuilder builder = new StringBuilder(); 
      builder.append("name: ").append(info.getName()); 
     } 

    } 
0

Добавить следующий код в файл Java

private void GetLocation() 
      { 
       LocationDetail pref_LocationDetail = new LocationDetail(_context); 
       locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

       if(objCommon.isOnline(_context)) 
       { 
        if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
        { 
         locationManager.requestLocationUpdates(
           LocationManager.NETWORK_PROVIDER , 
           MINIMUM_TIME_BETWEEN_UPDATES, 
           MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
           new MyLocationListener()  
           ); 

         return ; 
        } 
        else if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
        { 
         locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER , 
           MINIMUM_TIME_BETWEEN_UPDATES, 
           MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
           new MyLocationListener()  
           ); 

         return ; 
        } 
       } 
      } 

      private class MyLocationListener implements LocationListener 
      { 

       public void onLocationChanged(Location location) 
       { 
        LocationDetail pref_LocationDetail = new LocationDetail(_context); 


         double Lattitude = location.getLatitude(); 
         double Longitude = location.getLongitude(); 



        Toast.makeText(_context , location.getProvider().toString() , Toast.LENGTH_LONG).show(); 

        locationManager.removeUpdates(this); 
        locationManager = null;                        
       } 

       public void onStatusChanged(String s, int i, Bundle b) { 
        Toast.makeText(_context , "Provider status changed", 
          Toast.LENGTH_LONG).show(); 
       } 

       public void onProviderDisabled(String s) { 
        Toast.makeText(_context , 
          "Provider disabled by the user. GPS turned off", 
          Toast.LENGTH_LONG).show();  
       } 

       public void onProviderEnabled(String s) {  
        Toast.makeText(_context , 
          "Provider enabled by the user. GPS turned on", 
          Toast.LENGTH_LONG).show(); 
       } 
      } 

просто добавить следующий код в манифесте

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 
Смежные вопросы