私はこれに関する答えを高くも低くも探しましたが、フォーラムの質問で誰も助けてくれませんでした。チュートリアルを検索しました。 APIガイド の意味:
現在地ボタンが画面の右上隅に表示されるのは、現在地レイヤーが有効になっている場合のみです。
そのため、このMy Locationレイヤーを探していましたが、何も見つかりませんでした。 Googleマップに現在地を表示するにはどうすればよいですか?
APIガイドではすべて間違っています(本当にGoogleですか?)。 Maps API v2では、レイヤーを表示する必要はありません。マップで作成したGoogleMapsインスタンスへの簡単な呼び出しがあります。
Googleが提供する実際のドキュメントから回答が得られます。あなたはただする必要があります
// map is a GoogleMap object
map.isMyLocationEnabled = true
// map is a GoogleMap object
map.setMyLocationEnabled(true);
そして魔法が起こるのを見てください。
APIレベル23(M)以上で位置許可と 実行時にリクエスト を持っていることを確認してください
Javaコード:
public class MapActivity extends FragmentActivity implements LocationListener {
GoogleMap googleMap;
LatLng myPosition;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
// Getting reference to the SupportMapFragment of activity_main.xml
SupportMapFragment fm = (SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map);
// Getting GoogleMap object from the fragment
googleMap = fm.getMap();
// Enabling MyLocation Layer of Google Map
googleMap.setMyLocationEnabled(true);
// Getting LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Getting the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Getting Current Location
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
// Getting latitude of the current location
double latitude = location.getLatitude();
// Getting longitude of the current location
double longitude = location.getLongitude();
// Creating a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
myPosition = new LatLng(latitude, longitude);
googleMap.addMarker(new MarkerOptions().position(myPosition).title("Start"));
}
}
}
activity_map.xml:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:map="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/map"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
class="com.google.Android.gms.maps.SupportMapFragment"/>
現在地を青い円で示します。
Android 6.0からユーザー権限を確認する必要があります。GoogleMap.setMyLocationEnabled(true)
を使用する場合はCall requires permission which may be rejected by user
エラーが発生します
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mMap.setMyLocationEnabled(true);
} else {
// Show rationale and request permission.
}
さらに読みたい場合は、 google map docs を確認してください
「現在地」ボタンを表示するには、電話をかける必要があります
map.getUiSettings().setMyLocationButtonEnabled(true);
googleMapオブジェクト上。
Activity
でGoogleMap.setMyLocationEnabled(true)
を呼び出し、Manifest
に次の2行のコードを追加します。
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
現在地レイヤを有効にする前に、ユーザーに場所の許可を要求する必要があります。このサンプルには、ロケーション許可のリクエストは含まれていません。
コードを簡素化するために、ライブラリ EasyPermissions を使用してロケーション許可のリクエストを行うことができます。
次に、 The Location Location Layer my codeが次のように機能する公式ドキュメントの例に従ってくださいGoogleのサービスを含むすべてのバージョンのAndroid。
OnMyLocationClickListener
y OnMyLocationButtonClickListener
を実装するアクティビティを作成します。implementation 'pub.devrel:easypermissions:2.0.1'
で定義しますメソッドonRequestPermissionsResult()
内のEasyPermissionsに結果を転送します
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
許可を要求し、requestLocationPermission()
を使用してユーザーの応答に従って操作します
requestLocationPermission()
を呼び出して、リスナーをonMapReady()
に設定します。public class MapsActivity extends FragmentActivity implements
OnMapReadyCallback,
GoogleMap.OnMyLocationClickListener,
GoogleMap.OnMyLocationButtonClickListener {
private final int REQUEST_LOCATION_PERMISSION = 1;
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
requestLocationPermission();
mMap.setOnMyLocationButtonClickListener(this);
mMap.setOnMyLocationClickListener(this);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Forward results to EasyPermissions
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@SuppressLint("MissingPermission")
@AfterPermissionGranted(REQUEST_LOCATION_PERMISSION)
public void requestLocationPermission() {
String[] perms = {Manifest.permission.ACCESS_FINE_LOCATION};
if(EasyPermissions.hasPermissions(this, perms)) {
mMap.setMyLocationEnabled(true);
Toast.makeText(this, "Permission already granted", Toast.LENGTH_SHORT).show();
}
else {
EasyPermissions.requestPermissions(this, "Please grant the location permission", REQUEST_LOCATION_PERMISSION, perms);
}
}
@Override
public boolean onMyLocationButtonClick() {
Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
return false;
}
@Override
public void onMyLocationClick(@NonNull Location location) {
Toast.makeText(this, "Current location:\n" + location, Toast.LENGTH_LONG).show();
}
}