2016-09-15 10 views
0

1分ごとに、5メートルごとに融合位置を更新する必要があります(悪い習慣はありますが、テストとログで表示するため)ボタンを押してサービスを開始しますボタンを押した私はlogcatの場所を得たが一度だけ。 サービスクラスonLocationChangedは1分ごとに呼び出す必要がありますが、ほぼ毎分GPSをオンにしてからもう一度コールしないようにしてください。ただし、Logcatにはロケーションアップデートはありません。ここでは、UIやメインスレッドAndroidサービスが場所を更新していない

に影響を与えずに場所を更新ここでは、一度だけ

09-16 03:13:37.125 10419-10419/com.example.com.pro_working1 D/===Location Service===: Service onConnected Calling 
09-16 03:13:37.125 10419-10419/com.example.com.pro_working1 D/===Location Service===: Start Location Update is Calling 
09-16 03:13:38.315 10419-10419/com.example.com.pro_working1 D/===Location Service===: Service OnLocationChanged Calling 
09-16 03:13:38.315 10419-10419/com.example.com.pro_working1 D/===Location Service===: Here is Updated Locations: Latitude 28.5XXXXX Longitude 77.2XXXXX 
09-16 03:13:38.315 10419-10419/com.example.com.pro_working1 D/===Location Service===: Sending Location Starting Accuracy is: 37.5 

位置更新を示しlogcatは私のサービスクラス

です
public class Location_Service_background extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 
    public static final String TAG = "===Location Service==="; 
    GoogleApiClient apiClient; 
    Location mCurrentLocation; 
    LocationRequest locationRequest; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     GoogleApiSetup(); 
     RequestLocationUpdates(); 
     Log.d(TAG,"OnStartCommand Is Calling "); 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 



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

    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (apiClient.isConnected()){ 
      Log.d(TAG,"Service On Destroy Calling and apiClient is Connected"); 
      StopLocationUpdates(); 
      apiClient.disconnect(); 
     } 
    } 

    @Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     Log.d(TAG,"Service onConnected Calling"); 
     if (mCurrentLocation != null) { 
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       return; 
      } 
      mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(apiClient); 

     } 
     else { 
      Log.d(TAG,"Start Location Update is Calling"); 
      StartLocationUpdate(); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Log.d(TAG,"Service OnConnectionSuspended Calling"); 
     apiClient.connect(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.d(TAG,"Service OnLocationChanged Calling"); 
     mCurrentLocation=location; 
     Log.d(TAG,"Here is Updated Locations: Latitude "+mCurrentLocation.getLatitude()+"Longitude "+mCurrentLocation.getLongitude()); 
     String Latitude= String.valueOf(mCurrentLocation.getLatitude()); 
     String Longitude=String.valueOf(mCurrentLocation.getLongitude()); 
     String Accuracy=String.valueOf(mCurrentLocation.getAccuracy()); 
     Log.d(TAG,"Sending Location Starting"+" "+" Accuracy is: "+mCurrentLocation.getAccuracy()); 


    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     Log.d(TAG,"Connection Failed Called "+connectionResult); 
    } 



    private synchronized void GoogleApiSetup() { 
     apiClient = new GoogleApiClient.Builder(this) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
     apiClient.connect(); 
    } 

    private void RequestLocationUpdates() { 
     locationRequest = new LocationRequest(); 
     //1 Min = 60 seconds AND 1000 milliseconds in 1 second 
     locationRequest.setInterval(60 * 1000);//5 Min 300 x 1000=300000 
     locationRequest.setFastestInterval(60 * 1000);//2 Min 
     locationRequest.setSmallestDisplacement(5); 
     locationRequest.setMaxWaitTime(60*1000); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    } 

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

    private void StartLocationUpdate() { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

      return; 
     } 
     if (apiClient.isConnected()) { 
      LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, locationRequest, this); 
     } 
     else { 
      Log.d(TAG,"GoogleApiClient is not connected yet.Please Try Again"); 
      apiClient.connect(); 
     } 
    } 


} 
+0

setsmallestdisplacementを使わずに試してみてください。 –

+0

'setsmallestdisplacement 'を使わずに' onLocationUpdate'を呼び出していることを示していますが、setsmallestdisplacementで定期的な更新を使うにはどうすればいいですか?ありがとうございましたヘルプ – androidXP

答えて

0

あなたが実際にデバイスに期待アップデート間以上5メートルを移動していることを仮定すると、私はsetSmallestDisplacement()メソッドだけで正常に動作しないなLocationRequestクラスに問題があるかもしれないと思います。..少なくとも予想どおりに動作しません。 (私はこれらの問題をother postsに見ました)。あなたは常にsetSmallestDisplacement()を削除し、代わりにやって距離を自分でチェックすることができ

onLocationChanged(){ 

double distance = // [ calculate distance between current lat/long and previous lat/long ] 

if (distance > 5 meters) { 

// do your normal onLocationChanged() code here 

} 

} 

何らかの理由で、FusedLocationProviderはあなたのGPSにアクセスすることができないとされていることpossiblityもあります代わりにwifiまたはcell towerを使用します...その場合、5mは指定するには距離が小さすぎます。あなたのログは正確さが37.5メートルだから、5メートルを測定できるほど正確ではないようです。だから...あなたのマニフェストにFINEアクセス権が設定されていない可能性がありますか?

また、実行時のアクセス許可が正しく行われていないと問題になる可能性がありますか?これを確認するには、ターゲットSDKを一時的に22に設定します。

+0

私は屋内でそれをチェックしていますなぜ正確さが高いのですか、GPSがオンになっている理由の良い場所の許可があります。粗い場所はGPSにアクセスできません。 1分ごとまたは5メートルごとに更新位置が好きです5メートルは交差していないので、1分ごとに更新する必要がありますが、 'setsmallestdisplacement'を使用して更新する必要はなく、距離を計算することをお勧めします2つのポイントの間では不可能 – androidXP

+0

実際の条件で私は間隔を10分または15分として長く設定しなければならず、ユーザーがこれらの時間間隔で数マイル移動すると、彼はそれらの時間間隔の間に旅行した場所を失う。それ以降の場所を送信するためのAPIメソッドに固執する – androidXP

+0

残念ながら、私はそれがsetdisplacementメソッドがどのように動作するかを理解していなかったことに気づいていませんでした。私の理解では、メソッドは次のことを意味します:前の時間が起動されてからユーザーが少なくともXメートル移動した場合にのみ、onLocationChangedメソッドを起動します。それは、5メートルごとに発砲するということではありません。これは、一定の場所を作成してバッテリを節約するために、電話機が一定の位置監視/計算を行う必要があるためです。 –

2

これが、私がこの問題について悩んだ人を救うのに役立ちます。私はFusedLocationAPIを使用して位置更新とGoogleApiClientを要求しています。私はサービスからもこれを行います。

setSmallestDisplacement()は他のパラメータよりも絶対優先順位が高いため、指定した時間間隔では場所の更新はありません。だからあなたが持っていても

locationRequestTimeInterval = LocationRequest.create() 
    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
    .setInterval(1)  
    .setFastestInterval(1)  
    .setMaxWaitTime(1)  
    .setSmallestDisplacement(5); 

これは決して、最小のDisplacementパラメータが満たされるまでトリガされません。

解決策は、2つの別々のLocationRequestsを作成することです。距離にのみ関係するものと、時間にのみ関係するものです.1つのGoogleApiClientを使用して、2つのrequestLocationUpdatesコマンドを作成します。 LocationRequestを使用し、もう1つはDistance LocationRequestを使用します。

だからあなたの2 LocationRequestsは、次のようになります。setFastestInterval()値が距離要求に設定しなければならないことを

locationRequestDistanceInterval = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setFastestInterval(0) // This MUST be set, otherwise no updates 
      .setSmallestDisplacement(LOCATION_REQUEST_MIN_DISTNACE); 

locationRequestTimeInterval = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setInterval(PROVIDER_GPS_UPDATE_TIME_INTERVAL) 
      .setFastestInterval(PROVIDER_GPS_UPDATE_TIME_INTERVAL); 
  • ノート、それ以外の場合は距離要求がトリガされません。0にする必要はありませんが、このフィールドを設定する必要があります。

次に、GoogleApiClients onConnected()に2つのrequestLocationUpdates()呼び出しを追加できます。あなたは、各要求に対する応答を処理するために、同じまたは別のLocationListenersを使用することができます

LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, locationRequestDistanceInterval, new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      // Handle your Distance based updates 
     }); 
    LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, locationRequestTimeInterval, new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      // Handle your Time based updates 
     } 
    }); 

。 これが役立つことを願っています。

関連する問題