android - 如何在 android 中刷新位置变化地图(如 Swiggy/uber App)
问题描述
我想更新我的问题。Cocncept 是客户和司机。当司机在路上时,应相应地刷新位置。地图上的跟踪器工作,但标记不移动,折线路径保持不变(它没有被擦除并设置在当前移动位置)。我需要移动标记并相应地设置折线。我已经实现了以下逻辑:请帮助
代码:
public class MapActivity extends AppCompatActivity implements OnMapReadyCallback,Tracker.LocationCallback {
GoogleMap map;
ArrayList<LatLng> markerPoints;
TextView tvDistanceDuration;
String latpick, latdrop, lngpick, lngdrop;
Marker markerfrom, markerto;
LatLng fromLatLong, toLatLong;
@BindView(R.id.btn_back)
Button btnBack;
@BindView(R.id.txt_title)
TextView txtTitle;
String fromaddress,toaddress,titleone,titletwo;
Tracker tracker;
Polyline polyline;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
ButterKnife.bind(this);
tracker = new Tracker(this,this);
try {
if (getIntent() != null) {
latpick = getIntent().getStringExtra("pickuplat");
lngpick = getIntent().getStringExtra("pickuplng");
latdrop = getIntent().getStringExtra("droplat");
lngdrop = getIntent().getStringExtra("droplng");
titleone = getIntent().getStringExtra("titleone");
titletwo = getIntent().getStringExtra("titletwo");
Log.e("LATPICK", latpick);
Log.e("LATPICK", lngpick);
Log.e("LATPICK", latdrop);Log.e("LATPICK", lngdrop);
if(!latpick.equalsIgnoreCase("0")){
}
}
} catch (Exception e) {
e.printStackTrace();
}
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
markerPoints = new ArrayList<LatLng>();
((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
}
public void getAddressFromLocation(final double latitude, final double longitude,
final Context context) {
Thread thread = new Thread() {
@Override
public void run() {
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
String result = null;
try {
List<Address> addressList = geocoder.getFromLocation(
latitude, longitude, 1);
if (addressList != null && addressList.size() > 0) {
Address address = addressList.get(0);
final String addressone = addressList.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
Log.e("addressone",addressone);
final String city = addressList.get(0).getLocality();
String state = addressList.get(0).getAdminArea();
String country = addressList.get(0).getCountryName();
String postalCode = addressList.get(0).getPostalCode();
String knownName = addressList.get(0).getFeatureName(); // Only if available else return NULL
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
fromaddress = addressone;
markerfrom = map.addMarker(new MarkerOptions()
.position(fromLatLong)
.title(titleone)
.snippet(fromaddress)
.icon(BitmapDescriptorFactory
.defaultMarker(
BitmapDescriptorFactory.HUE_AZURE)));
markerfrom.showInfoWindow();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (IOException e) {
Log.e("Address", "Unable connect to Geocoder", e);
}
}
};
thread.start();
}
public void getAddressFromLocation2(final double latitude, final double longitude,
final Context context) {
Thread thread = new Thread() {
@Override
public void run() {
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
String result = null;
try {
List<Address> addressList = geocoder.getFromLocation(
latitude, longitude, 1);
if (addressList != null && addressList.size() > 0) {
Address address = addressList.get(0);
final String addressone = addressList.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
final String city = addressList.get(0).getLocality();
String state = addressList.get(0).getAdminArea();
String country = addressList.get(0).getCountryName();
String postalCode = addressList.get(0).getPostalCode();
String knownName = addressList.get(0).getFeatureName(); // Only if available else return NULL
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e("addressone",addressone);
toaddress = addressone;
markerto = map.addMarker(new MarkerOptions()
.position(toLatLong)
.title(titletwo)
.snippet(toaddress)
.icon(BitmapDescriptorFactory
.defaultMarker(
BitmapDescriptorFactory.HUE_GREEN)));
markerto.showInfoWindow();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (IOException e) {
Log.e("Address", "Unable connect to Geocoder", e);
}
}
};
thread.start();
}
private String getDirectionsUrl(String pickuplat, String pickuplng, String droplat, String droplng) {
Log.e("TAG", "INSIDE DIRECTIONS");
// Origin of route
String str_origin = "origin=" + latpick + "," + lngpick;
// Destination of route
String str_dest = "destination=" + latdrop + "," + lngdrop;
// Sensor enabled
String sensor = "sensor=false";
// Building the parameters to the web service
String parameters = str_origin + "&" + str_dest + "&" + sensor;
// Output format
String output = "json";
String MY_API_KEY = "API KEY";
// Building the url to the web service This IP, site or mobile application is not authorized to use this API key. Request received from IP address 122.178.84.38, with empty referer
String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters + "&key=" + MY_API_KEY;
Log.e("", url);
return url;
}
/**
* A method to download json data from url
*/
private String downloadUrl(String strUrl) throws IOException {
String data = "";
InputStream iStream = null;
HttpURLConnection urlConnection = null;
try {
URL url = new URL(strUrl);
// Creating an http connection to communicate with url
urlConnection = (HttpURLConnection) url.openConnection();
// Connecting to url
urlConnection.connect();
// Reading data from url
iStream = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
}
data = sb.toString();
br.close();
} catch (Exception e) {
Log.d(" while downloading url", e.toString());
} finally {
iStream.close();
urlConnection.disconnect();
}
return data;
}
@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
if (ActivityCompat.checkSelfPermission(MapActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MapActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
googleMap.setMyLocationEnabled(true);
if (googleMap != null) {
googleMap.getUiSettings().setMapToolbarEnabled(false);
googleMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location arg0) {
// if(initialocation==0){
Location newHotSpot = new Location("My Location");
newHotSpot.setLatitude(arg0.getLatitude());
newHotSpot.setLongitude(arg0.getLongitude());
LatLng latLng = new LatLng(arg0.getLatitude(), arg0.getLongitude());
// }
}
});
try {
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
}
@Override
protected void onResume() {
super.onResume();
tracker.connectClient();
}
@Override
protected void onPause() {
super.onPause();
tracker.disConnectClient();
}
@Override
public void onLocationReceived(Location location) {
if(location!=null){
latpick = String.valueOf(location.getLatitude());
lngpick = String.valueOf(location.getLongitude());
Log.e("location receiver","lattidute"+lngpick+" "+latpick);
if (markerfrom!=null){
markerfrom.remove();
} map.clear();
fromLatLong = new LatLng(Double.parseDouble(latpick), Double.parseDouble(lngpick));
markerfrom = map.addMarker(new MarkerOptions()
.position(fromLatLong)
.title(titleone)
.snippet(fromaddress)
.icon(BitmapDescriptorFactory
.defaultMarker(
BitmapDescriptorFactory.HUE_AZURE)));
markerfrom.showInfoWindow();
clearPath();
try {
fromLatLong = new LatLng(Double.parseDouble(latpick), Double.parseDouble(lngpick));
toLatLong = new LatLng(Double.parseDouble(latdrop), Double.parseDouble(lngdrop));
String url = getDirectionsUrl(latpick, lngpick, latdrop, lngdrop);
DownloadTask downloadTask = new DownloadTask();
// Start downloading json data from Google Directions API
downloadTask.execute(url);
map.animateCamera(CameraUpdateFactory.newLatLngZoom(fromLatLong, 10));
double lat1 = Double.parseDouble(latpick);
double log1 = Double.parseDouble(lngpick);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat1, log1), 13.0f));
getAddressFromLocation2(Double.parseDouble(latdrop),Double.parseDouble(lngdrop),MapActivity.this);
getAddressFromLocation(Double.parseDouble(latpick),Double.parseDouble(lngdrop),MapActivity.this);
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
// tracker.stopLocationUpdates();
}
private void clearPath() {
if (polyline != null)
polyline.remove();
polyline = null; }
// Fetches data from url passed
private class DownloadTask extends AsyncTask<String, Void, String> {
// Downloading data in non-ui thread
@Override
protected String doInBackground(String... url) {
// For storing data from web service
String data = "";
try {
// Fetching the data from web service
data = downloadUrl(url[0]);
} catch (Exception e) {
Log.d("Background Task", e.toString());
}
return data;
}
// Executes in UI thread, after the execution of
// doInBackground()
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
ParserTask parserTask = new ParserTask();
// Invokes the thread for parsing the JSON data
parserTask.execute(result);
}
}
/**
* A class to parse the Google Places in JSON format
*/
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {
// Parsing the data in non-ui thread
@Override
protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {
JSONObject jObject;
List<List<HashMap<String, String>>> routes = null;
try {
jObject = new JSONObject(jsonData[0]);
DirectionsJSONParser parser = new DirectionsJSONParser();
// Starts parsing data
routes = parser.parse(jObject);
} catch (Exception e) {
e.printStackTrace();
}
return routes;
}
// Executes in UI thread, after the parsing process
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {
ArrayList<LatLng> points = null;
PolylineOptions lineOptions = null;
MarkerOptions markerOptions = new MarkerOptions();
String distance = "";
String duration = "";
if (result.size() < 1) {
Toast.makeText(getBaseContext(), "No Points", Toast.LENGTH_SHORT).show();
return;
}
// Traversing through all the routes
for (int i = 0; i < result.size(); i++) {
points = new ArrayList<LatLng>();
lineOptions = new PolylineOptions();
// Fetching i-th route
List<HashMap<String, String>> path = result.get(i);
// Fetching all the points in i-th route
for (int j = 0; j < path.size(); j++) {
HashMap<String, String> point = path.get(j);
if (j == 0) { // Get distance from the list
distance = (String) point.get("distance");
continue;
} else if (j == 1) { // Get duration from the list
duration = (String) point.get("duration");
continue;
}
double lat = Double.parseDouble(point.get("lat"));
double lng = Double.parseDouble(point.get("lng"));
LatLng position = new LatLng(lat, lng);
points.add(position);
}
lineOptions.addAll(points);
lineOptions.width(4);
lineOptions.color(Color.RED);
}
map.addPolyline(lineOptions);
}
}
}
解决方案
您可以从 com.google.android.gms.location 包中实现LocationListener 。
然后使用onLocationChanged方法来处理您的逻辑。
编辑:
将您的类声明更改为:
public class MapActivity extends AppCompatActivity implements OnMapReadyCallback,Tracker.LocationCallback, LocationListener {
然后添加方法:
/**
* Callback that fires when the location changes.
*/
@Override
public void onLocationChanged(Location location) {
//your logic to move polyline / markers here
}
推荐阅读
- php - 通过 PHP 调用的 MySQL 存储过程无法正确执行
- regex - 管道之间的正则表达式匹配字符
- expression - 计算 ssrs 中百分比的表达式
- python - Python将函数串在一起并了解函数是否是最后一个
- php - 在 Laravel 的控制器中使用自定义库
- ios - 在部署目标 iOS 8 的应用程序中使用需要 iOS 9 的框架?
- windows - 更改服务以作为特定 Windows 用户启动后,Jenkins 启动失败
- laravel - 如何处理具有多态关系的独一关系?
- android - 在 Android Studio 中使用 firebase 注销:getProviderData() 返回 null
- excel - 将工作表名称添加到工作表更改日志