package com.example.map; import static android.content.ContentValues.TAG; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.example.map.directionhelpers.FetchURL; import com.example.map.directionhelpers.TaskLoadedCallback; 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; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.Polyline; import com.google.android.gms.maps.model.PolylineOptions; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.Task; public class DirectionActivityNonChinese extends AppCompatActivity implements OnMapReadyCallback, TaskLoadedCallback { private GoogleMap mMap; //private LocationCallback locationCallback; private MarkerOptions place1, place2, place3; Button getDirection; Button goHome; Button homePage; Button btnPlay; Button btnStop; ProgressBar progressBar; private MediaPlayer mediaPlayer; private TextView textLatLong; private Polyline currentPolyline; private static final int REQUEST_CODE_PERMISSION = 1; private int ACCESS_LOCATION_REQUEST_CODE = 10001; Location currentLocation; FusedLocationProviderClient fusedLocationProviderClient; private static final int LOADING_DURATION = 15000; LocationRequest locationRequest; Marker userLocationMarker; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_direction); fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); // Initialize fusedLocationProviderClient locationRequest = locationRequest.create(); locationRequest.setInterval(500); locationRequest.setFastestInterval(500); locationRequest.setPriority(locationRequest.PRIORITY_HIGH_ACCURACY); getDirection = findViewById(R.id.btnGetDirection); goHome = findViewById(R.id.btnGoHome); homePage = findViewById(R.id.btnGoHomePage); btnPlay = findViewById(R.id.btnPlay); btnStop = findViewById(R.id.btnStop); //textLatLong = findViewById(R.id.textLatLong); getLastLocation(); //place1 = new MarkerOptions().position(new LatLng(38.88404333279727, 121.54452203505474)).title("Location 1"); //place2 = new MarkerOptions().position(new LatLng(38.86860801450304, 121.53456197968475)).title("Location 2"); //textLatLong.setText("Latitude: " + place3.getPosition().latitude + ", Longitude: " + place3.getPosition().longitude); getDirection.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startAudio("chinese"); new FetchURL(DirectionActivityNonChinese.this).execute(getUrl(place1.getPosition(), place2.getPosition(), "walking"), "walking"); } }); goHome.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new FetchURL(DirectionActivityNonChinese.this).execute(getUrl(place2.getPosition(), place3.getPosition(), "walking"), "walking"); } }); homePage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mediaPlayer != null) { mediaPlayer.seekTo(0); } Intent intent = new Intent(DirectionActivityNonChinese.this, MainActivity.class); startActivity(intent); } }); btnPlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mediaPlayer != null && !mediaPlayer.isPlaying()) { mediaPlayer.start(); } } }); btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); } } }); //27.658143,85.3199503 //27.667491,85.3208583 MapFragment mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.mapFrag); mapFragment.getMapAsync(this); } private void getLastLocation() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#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 ActivityCompat#requestPermissions for more details. //REQUEST_CODE_PERMISSION ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_PERMISSION); return; } Task<Location> task = fusedLocationProviderClient.getLastLocation(); task.addOnSuccessListener(new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { if (location != null) { currentLocation = location; SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); //mapFragment.getMapAsync(DirectionActivity.this); // 0.0009509, 0.0049614 LatLng currentLatLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()); mMap.addMarker(new MarkerOptions().position(currentLatLng).title("My Current Location")); place3 = new MarkerOptions().position(currentLatLng).title("Current Location"); LatLng route = getRoute(currentLatLng); place1 = new MarkerOptions().position(route).title("Location 1"); place2 = new MarkerOptions().position(new LatLng(38.86860801450304, 121.53456197968475)).title("Location 2"); new FetchURL(DirectionActivityNonChinese.this).execute(getUrl(place3.getPosition(), place1.getPosition(), "walking"), "walking"); //mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15)); mMap.addMarker(place1); mMap.addMarker(place2); //textLatLong.setText("Latitude: " + place3.getPosition().latitude + ", Longitude: " + place3.getPosition().longitude); } } }); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; Log.d("mylog", "Added Markers"); if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { //enableUserLocation(); } else { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, ACCESS_LOCATION_REQUEST_CODE); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, ACCESS_LOCATION_REQUEST_CODE); } } //LatLng currentLatLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()); //this.mMap.addMarker(new MarkerOptions().position(currentLatLng).title("My Current Location")); //LatLng currentLatLng = new LatLng(38.8881962, 121.5293475); //this.mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15)); } LocationCallback locationCallback = new LocationCallback() { @Override public void onLocationResult(@NonNull LocationResult locationResult) { super.onLocationResult(locationResult); Log.d(TAG, "onLocationResult: " + locationResult.getLastLocation()); if (mMap != null) { setUserLocationMarker(locationResult.getLastLocation()); } } }; private void setUserLocationMarker(Location location) { // 0.0009509, 0.0049614 LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); if (userLocationMarker == null) { MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.pandaaa)); markerOptions.rotation(location.getBearing()); userLocationMarker = mMap.addMarker(markerOptions); mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15)); } else { userLocationMarker.setPosition(latLng); userLocationMarker.setRotation(location.getBearing()); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15)); } } private void startLocationUpdates() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#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 ActivityCompat#requestPermissions for more details. return; } fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()); } private void stopLocationUpdates() { fusedLocationProviderClient.removeLocationUpdates(locationCallback); } @Override protected void onStart() { super.onStart(); startLocationUpdates(); } @Override protected void onStop() { super.onStop(); stopLocationUpdates(); } private void enableUserLocation() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#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 ActivityCompat#requestPermissions for more details. return; } mMap.setMyLocationEnabled(true); } private String getUrl(LatLng origin, LatLng dest, String directionMode) { // Origin of route String str_origin = "origin=" + origin.latitude + "," + origin.longitude; // Destination of route String str_dest = "destination=" + dest.latitude + "," + dest.longitude; // Mode String mode = "mode=" + directionMode; // Building the parameters to the web service String parameters = str_origin + "&" + str_dest + "&" + mode; // Output format String output = "json"; // Building the url to the web service String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters + "&key=" + "AIzaSyDGkeIui7CMi6Gb_pOZAE7WpaCpLf7EGIo"; return url; } @Override public void onTaskDone(Object... values) { if (currentPolyline != null) currentPolyline.remove(); currentPolyline = mMap.addPolyline((PolylineOptions) values[0]); } public LatLng getRoute(LatLng currentLocation) { Double lat = currentLocation.latitude; Double lon = currentLocation.longitude; LatLng start = new LatLng(38.88404333279727, 121.54452203505474); return start; } public void startAudio(String audioName) { int resId = getResources().getIdentifier(audioName, "raw", getPackageName()); if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.release(); } mediaPlayer = MediaPlayer.create(this, resId); mediaPlayer.start(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == ACCESS_LOCATION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //enableUserLocation(); } else { } } } } 成果如下图
完美解决在Android开发中使用googleAPI在中国位置偏移问题以及更改所在位置的图标
最新推荐文章于 2025-04-28 22:41:24 发布