FusedLocationProviderClientで位置情報の取得し、それをGoogle Mapで地図表示をすることがと可能です。
Android Studio
2021.2.1
2021.2.1
FusedLocationProviderClient
GPSだけでなく、WiFiや電話網を使った位置情報はFusedLocationProviderClientで取得できます
位置情報といえばGPSと思う人が多いとは思いますが、スマホでの位置情報はGPS以外にWiFiや電話網を駆使して短時間で効率の良い情報を取得で...
また、Google MapはAPI キーを取得して地図表示することは自由度はありますが、使用量による費用が発生することもあります。Intentを使ってGoogle Mapアプリを起動させてしまうのが簡単です
API key 無しでIntentを使って簡単に Google Map を呼び出して地図を表示させる方法です。
GoogleMapを...
作成手順としては以下を合体させます
- FusedLocationProviderClientの更新リエストを作成
- IntentでGoogle Mapに飛ばして地図表示
MapsActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
//package your.package.name; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import android.Manifest; import android.annotation.SuppressLint; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.net.Uri; import android.os.Bundle; import android.os.Looper; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationCallback; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationResult; import com.google.android.gms.location.LocationServices; public class MainActivity extends AppCompatActivity { private LocationCallback locationCallback; private LocationRequest locationRequest; private FusedLocationProviderClient fusedLocationClient; private boolean requestingLocationUpdates = false; private TextView textView1, textView2; private final ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult( new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { requestingLocationUpdates = true; } else { Toast toast = Toast.makeText(this, "これ以上なにもできません", Toast.LENGTH_SHORT); toast.show(); } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissionLauncher.launch( Manifest.permission.ACCESS_FINE_LOCATION); } else { requestingLocationUpdates = true; } textView1 = findViewById(R.id.text_view1); textView2 = findViewById(R.id.text_view2); locationRequest = LocationRequest.create(); locationRequest.setPriority( Priority.PRIORITY_HIGH_ACCURACY) .setFastestInterval(5000) .setInterval(10000); locationCallback = new LocationCallback() { @Override public void onLocationResult(@NonNull LocationResult locationResult) { for (Location location : locationResult.getLocations()) { // 緯度の表示 String str1 = " Latitude:" + location.getLatitude(); textView1.setText(str1); // 経度の表示 String str2 = " Longitude:" + location.getLongitude(); textView2.setText(str2); // Google Map moveToGMap(location); } } }; fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); } private void startLocationUpdates() { if (ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()); } @SuppressLint("QueryPermissionsNeeded") private void moveToGMap(Location location){ String str1 = String.valueOf(location.getLatitude()); String str2 = String.valueOf(location.getLongitude()); // geo:[lat,lng][?param[¶m]...], param:z=zoom Uri uri = Uri.parse("geo:"+str1+","+str2+"?z=10"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } } private void stopLocationUpdates() { fusedLocationClient.removeLocationUpdates(locationCallback); } @Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } } @Override protected void onPause() { super.onPause(); stopLocationUpdates(); } } |
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/text_view1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:textColor="#44f" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.501" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.2" /> <TextView android:id="@+id/text_view2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#f44" android:layout_margin="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.3" /> </androidx.constraintlayout.widget.ConstraintLayout> |
play-services-locationのライブラリ追加
build.gradle(Module…)
1 2 3 4 5 6 7 8 9 10 11 12 |
plugins { ... } android { ... } dependencies { implementation 'com.google.android.gms:play-services-location:20.0.0' ... } |
位置情報のパーミッション
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... > <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <application ... </application> </manifest> |
emulatorのLocationをハワイにセットして実行してみました
関連記事:
- FusedLocationProviderClient による位置情報取得
- 複数の権限をリクエストする
- FusedLocationProvider とGoogle Mapで地図を表示
- GPSでの位置情報
- アプリの権限、位置情報をリクエストする実装
References:
直近の位置情報を取得する – Android Developers
現在地の更新情報をリクエストする – Android デベロッパー
位置情報の設定を変更する – Android デベロッパー
FusedLocationProviderClient
アプリの権限をリクエストする
一般的なインテント
インテントとインテント フィルタ