

Android Studioでのアプリ開発で質問です。  
GPSで位置情報を取得してボタンを押したら距離を計算する関数部分を作りたいのですが友達に貰ったこの写真を見てもいまいちJavaに書き起こすことが出来ずに困っています。

GPSの取得自体は出来ていて、「ボタンを押したら計算スタート，毎秒更新」、「終了ボタンで計算終了で結果出力」がやりたいです。  
GPSの取得間隔を1秒に設定する方法も出来れば知りたいです。  
ボタンはonButtonClickで実装しようとしていますが、もし不可能であれば他の方法を知りたいです。

[![友達に貰った架空言語での関数解説](https://i.stack.imgur.com/DGue1.jpg)](https://i.stack.imgur.com/DGue1.jpg)

以下は記述途中のコードです。ご参考ください。  
（package文は省略）

[code]

    import androidx.annotation.RequiresApi;
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.Manifest;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class MainActivity extends  AppCompatActivity{
        double data1, data2;
    
    
        private LocationManager locationManager;
    
        @RequiresApi(api = Build.VERSION_CODES.M)
        public void onCreate(Bundle savedInstanceState) {
            setContentView(R.layout.activity_main);
            super.onCreate(savedInstanceState);
    
            locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    Activity#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for Activity#requestPermissions for more details.
                return;
            }
            locationManager.requestLocationUpdates(provider:"gps", minTimeMs:100, minDistanceM:0, onLocationUpdate);
    
        }
    
        private LocationListener onLocationUpdate = new LocationListener() {
    
            public void onLocationChanged(Location location) {
                TextView textView1 = (TextView) findViewById(R.id.text_view1);
                TextView textView2 = (TextView) findViewById(R.id.text_view2);
                // location.getLatitude(), location.getLongitude()に現在地の緯度経度が。
                data1 = location.getLatitude();
                data2 = location.getLongitude();
                String str1 = "Latitude:"+data1;
                textView1.setText(str1);
    
                // 経度の表示
                String str2 = "Longtude:"+data2;
                textView2.setText(str2);
                //Log.d("debug","checkSelfPermission true");
            }
            public void onProviderDisabled(String provider) {
            }
            public void onProviderEnabled(String provider) {
            }
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
        };
    
    //ここから全くわかってないです↓
        public void onButtonClick(View view){
            switch (view.getId()) {
                case R.id.button1:
                    while(1){
                        
                    }
                    break;
            }
        }
    
        public void onButtonClick(View view){
            switch (view.getId()) {
                case R.id.button2:
                    System.out.println(new Date() + distance + "m");
                    break;
            }
        }
    
    }
    
[/code]


CC BY-SA 4.0
2021-03-08T03:54:20.340
74510
2023-09-03T06:20:47.667
2023-09-03T06:20:47.667
3060
44245
question
java android gps
GPS で位置情報を取得して距離を計算する関数と、ボタン動作に関する質問


開始ボタンを押したら、1秒間隔のタイマーを起動する。  
終了ボタンを押したら、1秒間隔のタイマーを停止する。  
タイマーの処理の中でGPSの値を取得する。  
という流れになると思います。


CC BY-SA 4.0
2021-03-08T04:24:03.220
74511
2021-03-08T04:24:03.220
24490
74510
answer


斜辺^2 = 底辺^2 + 高さ^2  
(三角関数)

で、でますよ。  
ちなみに、X = 底辺 で Y = 高さ っス。  
それを計算するメソッドにパラメータ入れ込めば、斜辺(ここでいう直線での距離)

これを、毎秒位置を追加しながら累計していけば、つまりは総距離が出ます。  
んで、この毎秒の部分ですが、より秒数を細かくすればかくかくしなくなりますので  
精度も上がります。

実際のメソッド的なコードとしてはこんな感じ…。

public double addKyori (int x, int y)  
double hoge = x^2 + y^2;  
double ans = Math.sqrt(hoge);  
return ans;  
}

毎回の斜辺(距離)を出すメソッド。  
後は別スレッドを立ち上げて、累計を出す感じ。


CC BY-SA 4.0
2023-09-03T01:55:22.760
96110
2023-09-03T01:55:22.760
59651
74510
answer