2017-09-01 79 views
0

我创建了获取当前位置的全局类,以供我的项目使用。每当用户按下Activity按钮时,我都会获取位置信息。即使设备处于打开状态,熔融位置也能提供超过2000的准确度高精度

public class Get_Current_Location implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 
    GoogleApiClient apiClient; 
    Location CurrentLocation; 
    LocationRequest locationRequest; 
    Context context; 
    Interface_For_Location getLocation; 
    String TAG = "###Current Location###"; 


    public Get_Current_Location(Context context,Interface_For_Location location) { 
     this.context = context; 
     this.getLocation=location; 
     apiClient = new GoogleApiClient.Builder(context) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
     Log.d(TAG, "Google API BUILD Successfully " + apiClient); 
     apiClient.connect(); 
     setLocationRequest(); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     Log.d(TAG,"On Connected Calling"); 

     startLocationUpdate(); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.d(TAG,"On Location Changed Calling "); 
     Log.d(TAG,"Updated Location OnLocationChnaged "+location); 
     CurrentLocation=location; 
     getLocation.currentLoc(CurrentLocation); 
     stopLocationUpdates(); 
    } 

    public void startLocationUpdate() { 
     Log.d(TAG,"Start Location Update Calling "); 
     if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, locationRequest, this); 
    } 

    private void stopLocationUpdates(){ 
     LocationServices.FusedLocationApi.removeLocationUpdates(apiClient,this); 
    } 

    private void setLocationRequest(){ 
     Log.d(TAG,"Set Location Update Request Calling"); 
     locationRequest=new LocationRequest(); 
     locationRequest.setInterval(10*60*1000); 
     locationRequest.setFastestInterval(10*60*1000); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     locationRequest.setNumUpdates(1); 
    }  
} 

我通过调用类上的接口获取位置。我必须显示50米以下的两台设备的距离,但每当我尝试获取彼此相邻的设备的位置时,两者都会产生超过2000的精度。由于这种低精度级别,我无法检测到旁边的设备彼此。

请指导我将此准确度降至100以下,以便我可以在59米以下检测到设备。

回答

0

有时,设备需要一段时间才能获得良好的位置(GPS或网络),因此您可能会在短时间内获得非常不准确的点。你需要添加一个你想要的准确级别的过滤器,并且只有当你得到你想要的点时关闭位置更新。这里是一个如何执行此操作的示例:

@Override 
public void onLocationChanged(Location location) { 
    Log.d(TAG,"On Location Changed Calling "); 
    if (location.getAccuracy() <= MIN_ACCURACY) { 
     Log.d(TAG,"Updated Location OnLocationChnaged "+location); 
     CurrentLocation=location; 
     getLocation.currentLoc(CurrentLocation); 
     stopLocationUpdates(); 
    } 
    //Else don't stop the update until a location with good accuracy is received. 
} 
+0

这样不断调用else语句。是三星设备给我高精度和Nexus设备给我想要的精度 – androidXP

+0

在这种情况下添加超时。获得准确的点并不总是可能的。例如,您应该在公园以外获得所需的准确度,但是如果您在隧道或大型建筑物的中心有500米以下有任何东西,将会感到惊讶。 –

相关问题