Я получаю исключение «файл не найден» при попытке подключиться к google maps api

#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.