#java #android #google-maps
Вопрос:
Я создаю функцию в приложении для Android, которая использует текущее местоположение пользователя для поиска близлежащих мест, указанных в зависимости от типа объекта, который ищет пользователь. Я использую зависимости play-services-maps:17.0.1
amp; play-services-location:18.0.0
, чтобы найти эти близлежащие места.
В onCreate()
том, где я успешно получаю долготу и широту пользователя, а также отображаю пользователю карту. Пользователь может выбрать то, что он хочет, из выпадающего меню, после нажатия кнопки «Найти» создается строка под названием url
«удержание». https://maps.google.com/maps/api/place/nearbysearch/json?location=51.5205959,-0.0629923amp;radius=5000amp;type=hospitalamp;sensor=trueamp;key=AIzaSyDgOKHaA2lDoTv7lYUSCLIZj4GtTvqZ66I
Чем Асинхронная задача execute()
вызывается при передаче параметра url
as, запускается фоновый поток downloadUrl()
, который должен подключить приложение к ссылке URL, однако я получаю file not found exception
сообщение, потому что URL не существует. У меня нет большого опыта работы с API карт, поэтому я не знаю, почему я получаю исключение «Файл не найден».
Я попытался изменить URL-ссылку на https://maps.google.com/maps/api/place/nearbysearch/json?location=51.5205933,-0.06276423amp;radius=5000amp;type=hospitalamp;sensor=trueamp;key=AIzaSyDgOKHaA2lDoTv7lYUSCLIZj4GtTvqZ66I
, но это не помогает, так как я даже не получаю текущую долготу и широту пользователя, потому что я не получаю location
объект от FusedLocationProviderClient
объекта. В ключе api, который я получил из облачной консоли Google, включен API Google maps.
public class MainActivity extends FragmentActivity {
GoogleMap map;
Spinner spinner;
Button btnFind;
SupportMapFragment supportMapFragment;
FusedLocationProviderClient fusedLocationProviderClient;
double currentLat = 0;
double currentLong = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = findViewById(R.id.sp_type);
btnFind = findViewById(R.id.bt_find);
supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.google_map);
final String[] placeTypeList = {"atm", "bank", "hospital", "movie_theater", "restaurant"};
String[] placeNameList = {"ATM", "Bank", "Hospital", "Movie Theater", "Restaurant"};
spinner.setAdapter(new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, placeNameList));
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
getCurrentLocation();
}else{
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 44);
}
btnFind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int i = spinner.getSelectedItemPosition();
String url = "https://maps.google.com/maps/api/place/nearbysearch/json?"
"location=" currentLat "," currentLong
"amp;radius=5000" "amp;type=" placeTypeList[i]
"amp;sensor=true" "amp;key=" getResources().getString(R.string.google_map_key);
new PlaceTask().execute(url);
}
});
}
public void getCurrentLocation() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Task<Location> task = fusedLocationProviderClient.getLastLocation();
task.addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if(location != null){
currentLat = location.getLatitude();
currentLong = location.getLongitude();
supportMapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
map = googleMap;
map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(currentLat, currentLong), 10));
}
});
}
}
});
}
private class PlaceTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... strings) {
String data = null;
try {
data = downloadUrl(strings[0]);
}catch(IOException e){
e.printStackTrace();
}
return data;
}
private String downloadUrl(String string) throws IOException {
URL url = new URL(string);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
StringBuilder builder = new StringBuilder();
String line = "";
while((line = reader.readLine()) != null){
builder.append(line);
}
String data = builder.toString();
reader.close();
return data;
}
}
Комментарии:
1. Насколько я вижу, вы дважды опубликовали один и тот же URL-адрес.
2. Каждый может выполнить эти URL-адреса, чтобы проверить их. Вам не нужен поставщик местоположения для проверки такого URL-адреса. Просто введите широту и долготу.
3. вам не нужно писать connection.connect(); в downloadUrl() в противном случае ваш код верен, просто проверьте URL.