2017-09-01 5 views
0

私のプロジェクトの現在位置を取得するグローバルクラスを作成します。ユーザーがアクティビティのボタンを押すたびにLocationを取得しています。デバイスがオンであっても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メートルの下に2つのデバイスの距離を表示する必要がありますが、私はお互いの隣にあるデバイスの場所を取得しようとすると、両方とも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ステートメントです。 Y私に高精度とNexusデバイスを与えるSamsungデバイスは、私に希望の精度を与えます – androidXP

+0

この場合、タイムアウトを追加してください。正確なポイントを得ることは必ずしも可能ではありません。例えば、公園の外では望みの精度を得るべきですが、大きな建物のトンネルや中心部で500m以下のものがあれば驚くでしょう。 –