4

午前9時から午後9時までの5分ごとにユーザーの場所を取得するアプリケーションを作成したいと考えています。今、私はその流れを考えることができません。 私はに混乱しています:Android GPSの場所定期的に

  1. 私は2つの繰り返しアラームマネージャ、5分ごとに1つのタイムスロットのために別のものを実装する必要があります。 ?
  2. 5分ごとに火災報知を行い、それがタイムスロットの間にあるかどうかを確認してから、ロケーションサービスを実行してサーバー作業にアップロードしてください。 ?

助けを借りて助けてください。どのように携帯電話のバッテリー、効率の面で最高のアプローチでこれを達成する。

+1

これまでに5分ごとに配置することをお勧めしますか?私は携帯電話のバッテリーが9時まで続くことはありません – Sanoop

+0

@サノップ私は右を知っています。良い習慣ではありませんが、これはクライアントが必要とするものです。 –

+0

こんにちは、Googleは、より効率的な方法でユーザーの場所を取得するAPIを最近更新しました。 https://android-developers.googleblog.com/2017/06/reduce-friction-with-new-location-apis.html これが役立ちます。 – vijaypalod

答えて

0

場所をキシにするためにハンドラを使用することができますさて、あなたはこの

Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 
     public void run() { 
      currentLocation = getCurrentUserLocation(); 
      handler.postDelayed(this, 1000*60*5); 
     } 
    } 
}; 
handler.postDelayed(runnable, 1000*60*5); 

そして、時間間隔が間にあるチェックのために、あなたは、

をこのタスクのアラームマネージャを設定することができますような何かを行うことができます

そして、制限時間に達すると、あなたは

handleLocation.removeCallbacksAndMessages(null); 
+0

私はこのようにしてみましょう。 –

+0

これは2つのアラームマネージャを設定する必要があることを意味しますか? –

+0

はい、有効にするにはオン、無効にするには – Sanoop

0

によりハンドラのコールバックを削除する必要があなたはハンドラを使用しないでください.postDelayer()は、メモリリークの原因となる可能性があるため、30秒以上の時間間隔で実行してください。短い時間間隔のための1つ、ハンドラと別のものを使用する30秒未満の戦略の2つの戦略を開発します(長い間隔で)。

+0

私はFirebaseジョブディスパッチャを使用できますか?1:9:AMはサービスを開始し、もう1つは9:PMを停止しますか? –

+0

Firebaseのジョブディスパッチャでは動作しませんでしたが、アラームマネージャを使用すると、リセットデバイスが保留中のすべてのアラームをキャンセルするため、デバイスの再起動イベントをリッスンする必要があります。 –

0

は、ロケーションrequest.itで5分もAndroidの「O」との互換性があるとして、あなたは更新間隔を設定することができ

https://codelabs.developers.google.com/codelabs/background-location-updates-android-o/index.html?index=..%2F..%2Findex#0を参照してください。あなたのrequirement-ごとに

それを修正することができますここで私は1 Minute.Youの間隔で現在の位置を与えるサービスを作成した

0

はまた、Gradleの[ファイル]でこれを追加し

compile 'com.google.android.gms:play-services:9.4.0' 

LocationService.class

import android.Manifest; 
import android.app.Service; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ActivityCompat; 
import android.util.Log; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 

import java.text.SimpleDateFormat; 
import java.util.Date; 

public class LocationService extends Service implements GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, LocationListener, ActivityCompat.OnRequestPermissionsResultCallback { 
    protected static final String TAG = "location-updates"; 
    private static final long day = 24 * 60 * 60 * 1000; 
    private static final long hours = 60 * 60 * 1000; 
    private static final long minute = 60 * 1000; 
    private static final long fiveSec = 5 * 1000; 
    private GoogleApiClient mGoogleApiClient; 
    private LocationRequest mLocationRequest; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mGoogleApiClient = new GoogleApiClient.Builder(getApplicationContext()) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(minute); 
     mLocationRequest.setFastestInterval(5000); 
     mLocationRequest.setSmallestDisplacement(0); 

     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

     if (mGoogleApiClient != null) { 
      mGoogleApiClient.connect(); 
     } 
    } 


    @Override 
    public void onConnected(Bundle bundle) { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 


    @Override 
    public void onConnectionSuspended(int i) { 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
    } 

    //Location Listener 
    @Override 
    public void onLocationChanged(final Location location) { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); 
     String currentDateandTime = sdf.format(new Date()); 
     Log.e("Location ", location.getLatitude() + " " + location.getLongitude() + " " + currentDateandTime); 
    } 

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

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     return START_STICKY; 
    } 


    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 


    @Override 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
     boolean isGranted = false; 
     for (int i = 0; i < grantResults.length; i++) 
      if (permissions[i].equals(Manifest.permission.ACCESS_FINE_LOCATION) && (grantResults[i] == PackageManager.PERMISSION_GRANTED)) 
       isGranted = true; 
     if (isGranted) { 
      startService(new Intent(this, LocationService.class)); 

     } else { 

     } 
    } 
} 
+0

バッテリの使用にどのような影響がありますか?これは、1分ごとに起動して場所を確認するようにAlarmManagerを設定するだけではなく、バッテリーの効率が良いでしょうか? – Nikaoto

+1

こんにちは@ニコト、 はい、アラームマネージャを使用してリクエストを定期的に発生させるので、定期的にロケーションチェックを常にチェックするので、より効率的でバッテリーを節約できます。 – PankajSharma