web-dev-qa-db-ja.com

Android AP​​I v2のGoogleマップに現在地を表示する方法

私はこれに関する答えを高くも低くも探しましたが、フォーラムの質問で誰も助けてくれませんでした。チュートリアルを検索しました。 APIガイド の意味:

現在地ボタンが画面の右上隅に表示されるのは、現在地レイヤーが有効になっている場合のみです。

そのため、このMy Locationレイヤーを探していましたが、何も見つかりませんでした。 Googleマップに現在地を表示するにはどうすればよいですか?

55
Yos233

APIガイドではすべて間違っています(本当にGoogleですか?)。 Maps API v2では、レイヤーを表示する必要はありません。マップで作成したGoogleMapsインスタンスへの簡単な呼び出しがあります。

Googleドキュメント

Googleが提供する実際のドキュメントから回答が得られます。あなたはただする必要があります

Kotlinを使用している場合

// map is a GoogleMap object
map.isMyLocationEnabled = true


Javaを使用している場合

// map is a GoogleMap object
map.setMyLocationEnabled(true);

そして魔法が起こるのを見てください。

APIレベル23(M)以上で位置許可と 実行時にリクエスト を持っていることを確認してください

139
Yos233

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"/>

現在地を青い円で示します。

37
UdiT

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 を確認してください

16
Vasil Valchev

「現在地」ボタンを表示するには、電話をかける必要があります

map.getUiSettings().setMyLocationButtonEnabled(true);

googleMapオブジェクト上。

14
25Solutions

ActivityGoogleMap.setMyLocationEnabled(true)を呼び出し、Manifestに次の2行のコードを追加します。

<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
7
Terranology

現在地レイヤを有効にする前に、ユーザーに場所の許可を要求する必要があります。このサンプルには、ロケーション許可のリクエストは含まれていません。

コードを簡素化するために、ライブラリ EasyPermissions を使用してロケーション許可のリクエストを行うことができます。

次に、 The Location Location Layer my codeが次のように機能する公式ドキュメントの例に従ってくださいGoogleのサービスを含むすべてのバージョンのAndroid

  1. マップを含み、インターフェースOnMyLocationClickListener y OnMyLocationButtonClickListenerを実装するアクティビティを作成します。
  2. App/build.gradle implementation 'pub.devrel:easypermissions:2.0.1'で定義します
  3. メソッドonRequestPermissionsResult()内のEasyPermissionsに結果を転送します

    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);

  4. 許可を要求し、requestLocationPermission()を使用してユーザーの応答に従って操作します

  5. requestLocationPermission()を呼び出して、リスナーをonMapReady()に設定します。

MapsActivity.Java

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();
    }
}

ソース

0
CORONEL Braian