完美解决在Android开发中使用googleAPI在中国位置偏移问题以及更改所在位置的图标
·
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 {
}
}
}
}
成果如下图

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)