Android开发求助:实现点击按钮在Google Map Fragment显示当前位置
Hey there! Great job getting the location coordinates working already—let's get that Google Map Fragment set up to show your current position. Here's a step-by-step guide to make this happen:
Step 1: Add Google Maps Dependencies & Permissions
First, make sure your project is set up to use Google Maps:
- Open your module-level
build.gradlefile and add these dependencies:
dependencies { implementation 'com.google.android.gms:play-services-maps:18.1.0' implementation 'com.google.android.gms:play-services-location:21.0.1' }
- Update your
AndroidManifest.xmlto include required permissions and your Google Maps API key (replaceYOUR_GOOGLE_MAPS_API_KEYwith your actual key from the Google Cloud Console):
<!-- Internet access for map loading --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <meta-data android:name="com.google.android.geo.API_KEY" android:value="YOUR_GOOGLE_MAPS_API_KEY" />
Step 2: Update Your Layout to Include the Map Fragment
Replace your activity_main.xml with this layout to add a Google Map Fragment (we'll remove the TextView since we're showing the location on the map):
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button_location" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginStart="13dp" android:text="Show My Location" /> <!-- Google Map Fragment --> <fragment android:id="@+id/map_fragment" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/button_location" /> </RelativeLayout>
Step 3: Modify MainActivity to Integrate the Map
Update your MainActivity.java to implement map initialization, and display your location on the map once retrieved:
package com.example.hello.sampleapp; import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; public class MainActivity extends AppCompatActivity implements View.OnClickListener, OnMapReadyCallback { private static final int REQUEST_LOCATION = 1; Button button; LocationManager locationManager; private GoogleMap mMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Request location permission on launch ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION); button = findViewById(R.id.button_location); button.setOnClickListener(this); // Initialize the map fragment SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map_fragment); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // Enable the built-in "My Location" layer if permission is granted if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { mMap.setMyLocationEnabled(true); } } @Override public void onClick(View view) { locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { buildAlertMessageNoGps(); } else { getLocation(); } } private void getLocation() { if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission (MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION); return; } // Prioritize GPS location over network/passive Location currentLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (currentLocation == null) currentLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (currentLocation == null) currentLocation = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); if (currentLocation != null && mMap != null) { LatLng myLocation = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()); // Add a marker for your current position mMap.addMarker(new MarkerOptions().position(myLocation).title("My Current Location")); // Move the camera to your location with a zoom level of 15 mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myLocation, 15)); Toast.makeText(this, "Location loaded on map!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Unable to trace your location", Toast.LENGTH_SHORT).show(); } } protected void buildAlertMessageNoGps() { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Please Turn ON your GPS Connection") .setCancelable(false) .setPositiveButton("Yes", (dialog, id) -> startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))) .setNegativeButton("No", (dialog, id) -> dialog.cancel()); final AlertDialog alert = builder.create(); alert.show(); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_LOCATION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (mMap != null) { try { mMap.setMyLocationEnabled(true); } catch (SecurityException e) { e.printStackTrace(); } } } else { Toast.makeText(this, "Location permission denied", Toast.LENGTH_SHORT).show(); } } } }
Quick Notes for Improvement
getLastKnownLocationmight returnnullif no recent location data exists. For better reliability, you can add aLocationListenerto receive real-time location updates.- Make sure you've enabled the Maps SDK for Android in your Google Cloud Console project, otherwise the map won't load.
内容的提问来源于stack exchange,提问作者Madhumitha
相关产品推荐
相关产品推荐

