2016-11-27 11 views
-1

私は、位置が変更されたらGPS座標を送信するアプリを作成しています。私は車両が動いているときだけデータを送る必要があります。どうすればこのことを知ることができますか?私は、加速度センサー 移動中の車内でAndroid携帯を追跡する最善の方法

これを行うための最善の方法は何を使用してonLocationChanged, getSpeed();

  • を使用して、2つのオプション

    1. を得ましたか。

  • +0

    は大丈夫ですか?編集内容を確認してください。 – Kaushal28

    +0

    @ Kaushal28:チェックしています。ありがとう、 – Senps

    +0

    あなたが完了した場合、あなたは答えを受け入れることができます。 – Kaushal28

    答えて

    3

    onLocationChangedおそらくあなたの最善の策でしょう。これは電池でかなり重くなる可能性があるので、周波数に注意してください。誤っていない場合、加速度計は、デバイスの回転のように、3軸に沿った動きを検出するために使用されます。移動する車は、妥当なユースケースのようには聞こえません。

    1

    @BiGGZの回答によれば、OnLocationChanged()がこれを行う最も良い方法です。ここでは、サービスで実行されるサンプルコードをバックグラウンドで追跡します。

    public class GPSService extends Service implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,LocationListener { 
    
    
    private int i=0; 
    private GoogleApiClient mGoogleApiClient; 
    private DatabaseHelper myDb; 
    private LocationRequest mLocationRequest; 
    private int uniqueInt=0; 
    private PowerManager.WakeLock wakeLock; 
    private String templat, templong; 
    
    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
        return null; 
    } 
    
    
    @Override 
    public void onCreate() { 
        super.onCreate(); 
    
    
        PowerManager mgr = (PowerManager)this.getSystemService(Context.POWER_SERVICE); 
        wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); 
        wakeLock.acquire(); 
    
        mGoogleApiClient = new GoogleApiClient.Builder(this) 
          .addApi(LocationServices.API) 
          .addConnectionCallbacks(this) 
          .addOnConnectionFailedListener(this) 
          .build(); 
        myDb =new DatabaseHelper(this); 
    } 
    
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    
        mGoogleApiClient.connect(); 
    
        return super.onStartCommand(intent, flags, startId); 
    } 
    
    @Override 
    public void onDestroy() { 
    
    
        mGoogleApiClient.disconnect(); 
        wakeLock.release(); 
        super.onDestroy(); 
    
    
    
    } 
    
    
    
    @Override 
    public void onConnected(Bundle bundle) { 
        mLocationRequest = LocationRequest.create(); 
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
        mLocationRequest.setInterval(1000); // Update location every second 
    
        LocationServices.FusedLocationApi.requestLocationUpdates(
          mGoogleApiClient, mLocationRequest, this); 
    } 
    
    @Override 
    public void onConnectionSuspended(int i) { 
        Toast.makeText(this,"GoogleApiClient connection has been suspend",Toast.LENGTH_SHORT).show(); 
    } 
    
    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
        Toast.makeText(this,"GoogleApiClient connection has failed",Toast.LENGTH_SHORT).show(); 
    } 
    
    @Override 
    public void onLocationChanged(Location location) { 
        double lat = location.getLatitude(), lon = location.getLongitude(); 
        // Toast.makeText(this,lat+"--->"+lon,Toast.LENGTH_SHORT).show(); 
    
        //Do your task here!! 
    
    
    } 
    
    } 
    

    そして、私はあなたがバッテリーを節約したい場合は、5秒または10秒に変更し、場所1秒を追跡する頻度を撮影しました。

    EDIT:あなたのデバイスの計算速度について

    、あなたの2間の計算差のための方法以下の使用は、ex((メートルで)座標を追跡した後、トラッキング周波数によって、これを分割できた場合5で割ます。 5秒ごとに位置を追跡しています)。あなたはm/sであなたにスピードを与えます。

    public double distance(String lat1, String lon1, String lat2, String lon2){ 
    
        double earthRadius = 6378.137; 
        double dLat = Double.parseDouble(lat2)*Math.PI/180 - Double.parseDouble(lat1)*Math.PI/180; 
        double dLon = Double.parseDouble(lon2)*Math.PI/180 - Double.parseDouble(lon1)*Math.PI/180; 
    
        double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Double.parseDouble(lat1)*Math.PI/180) * Math.cos(Double.parseDouble(lat2)*Math.PI/180)* 
          Math.sin(dLon/2) * Math.sin(dLon/2); 
    
        double c = 2 * Math.atan2(Math.sqrt(a),Math.sqrt(1-a)); 
        double d = earthRadius*c; 
        return d*1000; //distance in meter. 
    
    
    } 
    

    ・ホープ、このことができます:)

    +0

    返事をありがとう。私は速度を追跡する方法を見つけることができません。 – Senps

    +1

    @Senps for calculate speed、あなたは2つの座標の差を取って、それらをkmまたはマイルに変換しなければなりません。そしてあなたの周波数でそれを分割しなければなりません。 – Kaushal28

    +0

    @Senpsに編集内容が表示されます。 – Kaushal28

    1

    をデバイスのあまりバッテリーを必要とせずに、あなたが望むものを達成するための最良の方法は、ユーザーがAwareness APIを使用して車の中にあるときに検出することです。

    ユーザの現在の活動(、ランニングウォーキング、運転など)を確認するには、次のように取得する必要があります。このAPIを使用する場合は、あなたのAndroidManifestでcom.google.android.gms.permission.ACTIVITY_RECOGNITION許可を宣言することを忘れないでください、とチェック

    Awareness.SnapshotApi.getDetectedActivity(mGoogleApiClient) 
         .setResultCallback(new ResultCallback<DetectedActivityResult>() { 
          @Override 
          public void onResult(@NonNull DetectedActivityResult detectedActivityResult) { 
           if (!detectedActivityResult.getStatus().isSuccess()) { 
            Log.e(TAG, "Could not get the current activity."); 
            return; 
           } 
           ActivityRecognitionResult ar = detectedActivityResult.getActivityRecognitionResult(); 
           DetectedActivity probableActivity = ar.getMostProbableActivity(); 
           Log.i(TAG, probableActivity.toString()); 
          } 
         }); 
    

    実行時のユーザーの許可。

    関連する問題