在android中找不到确切的当前位置

Posted

技术标签:

【中文标题】在android中找不到确切的当前位置【英文标题】:can't find the exact current location in android 【发布时间】:2014-07-16 09:22:41 【问题描述】:

我已经使用下面的代码来查找当前位置,但我得到了一些设备(三星 7' 和 10'inch 和 nexus 10'inch)的确切当前位置,但不幸的是我在三星 s3 中找不到位置.

我不知道,什么是问题。找不到位置。

这是我的代码:

public class GPSTracker extends Service implements LocationListener

private final Context mContext;

//flag for GPS Status
boolean isGPSEnabled = false;

//flag for network status
boolean isNetworkEnabled = false;

boolean canGetLocation = false;

Location location;
double latitude;
double longitude;

//The minimum distance to change updates in metters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; //10 metters

//The minimum time beetwen 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);

        //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);
                    updateGPSCoordinates();
                
            

            //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);
                        updateGPSCoordinates();
                    
                
            
        
    
    catch (Exception e)
    
        //e.printStackTrace();
        Log.e("Error : Location", "Impossible to connect to LocationManager", e);
    

    return location;


public void updateGPSCoordinates()

    if (location != null)
    
        latitude = location.getLatitude();
        longitude = location.getLongitude();
    


/**
 * Stop using GPS listener
 * Calling this function will stop using GPS in your app
 */

public void stopUsingGPS()

    if (locationManager != null)
    
        locationManager.removeUpdates(GPSTracker.this);
    


/**
 * Function to get latitude
 */
public double getLatitude()

    if (location != null)
    
        latitude = location.getLatitude();
    

    return latitude;


/**
 * Function to get longitude
 */
public double getLongitude()

    if (location != null)
    
        longitude = location.getLongitude();
    

    return longitude;


/**
 * Function to check GPS/wifi enabled
 */
public boolean canGetLocation()

    return this.canGetLocation;


/**
 * Function to show settings alert dialog
 */
public void showSettingsAlert()

    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

    //Setting Dialog Title
    alertDialog.setTitle(R.string.GPSAlertDialogTitle);

    //Setting Dialog Message
    alertDialog.setMessage(R.string.GPSAlertDialogMessage);

    //On Pressing Setting button
    alertDialog.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() 
       
        @Override
        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(R.string.cancel, new DialogInterface.OnClickListener() 
       
        @Override
        public void onClick(DialogInterface dialog, int which) 
        
            dialog.cancel();
        
    );

    alertDialog.show();


/**
 * Get list of address by latitude and longitude
 * @return null or List<Address>
 */
public List<Address> getGeocoderAddress(Context context)

    if (location != null)
    
        Geocoder geocoder = new Geocoder(context, Locale.ENGLISH);
        try 
        
            List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
            return addresses;
         
        catch (IOException e) 
        
            //e.printStackTrace();
            Log.e("Error : Geocoder", "Impossible to connect to Geocoder", e);
        
    

    return null;


/**
 * Try to get AddressLine
 * @return null or addressLine
 */
public String getAddressLine(Context context)

    List<Address> addresses = getGeocoderAddress(context);
    if (addresses != null && addresses.size() > 0)
    
        Address address = addresses.get(0);
        String addressLine = address.getAddressLine(0);

        return addressLine;
    
    else
    
        return null;
    


/**
 * Try to get Locality
 * @return null or locality
 */
public String getLocality(Context context)

    List<Address> addresses = getGeocoderAddress(context);
    if (addresses != null && addresses.size() > 0)
    
        Address address = addresses.get(0);
        String locality = address.getLocality();

        return locality;
    
    else
    
        return null;
    


/**
 * Try to get Postal Code
 * @return null or postalCode
 */
public String getPostalCode(Context context)

    List<Address> addresses = getGeocoderAddress(context);
    if (addresses != null && addresses.size() > 0)
    
        Address address = addresses.get(0);
        String postalCode = address.getPostalCode();

        return postalCode;
    
    else
    
        return null;
    


/**
 * Try to get CountryName
 * @return null or postalCode
 */
public String getCountryName(Context context)

    List<Address> addresses = getGeocoderAddress(context);
    if (addresses != null && addresses.size() > 0)
    
        Address address = addresses.get(0);
        String countryName = address.getCountryName();

        return countryName;
    
    else
    
        return null;
    


@Override
public void onLocationChanged(Location location) 
   


@Override
public void onProviderDisabled(String provider) 
   


@Override
public void onProviderEnabled(String provider) 
   


@Override
public void onStatusChanged(String provider, int status, Bundle extras) 
   


@Override
public IBinder onBind(Intent intent) 

    return null;

【问题讨论】:

您的 GPS 开启了吗? (不处于待机模式) 是的。但我不知道为什么? 您是否从三星 s3 获得了一些价值或没有响应?? 我只得到了 lat:0.0 和 lng:0.0 的值。但是其他一些设备我可以得到准确的位置。 【参考方案1】:

当位置进入时检查准确性。如果不够准确,请不要处理。

@Override
public void onLocationChanged(Location location) 
        if (!location.hasAccuracy()) 
            return;
        
        if (location.getAccuracy() > 5) 
            return;
        
     // do something with location accurate to 5 meters here.
    

【讨论】:

【参考方案2】:

执行此操作,将应用程序加载到您的设备中,移动到开放天空,运行应用程序,等待 2 分钟。回到办公室里面,然后执行上面的代码

它对我有用。

希望对你有所帮助。

【讨论】:

以上代码适用于所有手机,但不仅适用于 samsung s3 设备。它的任何额外库函数包括该设备仅用于访问当前位置。 我的三星 Galaxy Grand 也面临同样的问题。然后我尝试上述解决方案,它的工作原理。 如果有任何其他解决方案可以解决该问题而不是上述答案。【参考方案3】:

我们在三星设备上工作过,也遇到过问题。只需确保以下几点:

    GPS 已开启(街道级别也应启用) 移动网络已启用(如果需要,还可以启用使用数据包数据选项) 在手机中下载并安装一些第 3 方小部件,然后等待位置坐标在小部件中出现/刷新。 (这是因为小部件中集成了超时概念,并不断尝试获取坐标) 从设备转到 Google 地图并检查您的位置是否被识别。 (有时,我们发现 Google 地图能够识别我们无法识别的坐标!!) 确保通知标题栏上的 GPS 卫星信号正在闪烁。 如果需要,设置刷新计时器并添加 toast 消息以在获得后显示 lat long。

对于三星设备,第一次,GPS坐标没有立即反映(它是空的,可以持续长达半小时:(真烦人!!)。所以,我们曾经在办公室外等待需要一段时间才能收到 GPS 坐标。

【讨论】:

我想立即获得该三星设备的 gps 坐标。我该怎么做?需要添加任何第 3 方库函数 只需添加一个计时器任务/线程,它会不断检查并重试有效的经纬度,直到获得。 您是否尝试过我提到的步骤?有帮助吗? 是的。我现在使用线程。但是需要一些时间才能获得有效的纬度/经度值。这就是我问这个问题的原因? 不幸的是,这是设备的问题。所以,我们只需要以这种方式解决。【参考方案4】:

我遇到了同样的问题。关键是:您需要在“requestLocationUpdates”和“getLastKnownLocation”之间设置一个时间间隔

尝试在“onStart”或“onCreate”方法中启动requestLocationUpdates。

受保护的 void onStart()

   super.onStart();
   locationManager.requestLocationUpdates(
                      LocationManager.GPS_PROVIDER,
                      MIN_TIME_BW_UPDATES,
                      MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

这会激活您的 GPS。您必须等待几秒钟才能找到一些位置。 所以我把“getlastKnownLocation” - 方法放在 OnClickEvent 中。如果没有找到位置,它只会显示一个 Toast。

public void onClick(View v)

  m_CurrentLocation = m_LocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
  if (m_CurrentLocation != null)
       // Your action with the last known location
  else
       Toast.makeText(YourActivity.this, "No GPS Location found", Toast.LENGTH_SHORT).show();

【讨论】:

【参考方案5】:

LocationManager 有很多错误,你为什么不尝试使用融合的位置提供程序和 LocationClient 来代替。 Google 的开发人员在上一次 Google I/O 期间也推荐了这一点。

除非设备在 Froyo 之前没有播放服务的版本上运行,否则没有理由使用 LocationManager。

【讨论】:

以上是关于在android中找不到确切的当前位置的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中找不到位置提供程序

在 Android Studio 3.1 中的当前主题中找不到样式“coordinatorLayoutStyle”

在 Android Studio 4.0(Canary) 中找不到预览窗口的位置

Android Material Design:在当前主题中找不到样式“toolbarStyle”

在本机反应中找不到 sdk 位置

在当前主题中找不到样式“floatingActionButtonStyle”