Я попытался добавить текущее местоположение пользователей на карту Google, которая у меня была, используя API Google Places, и пока это работало, я заметил, что на уровне API 26 выдавалась ошибка. После уточнения я обнаружил, что ошибка возникает, потому что код требует Ява 8.0. После некоторой отладки я обнаружил, что проблема была в строке: Task PlaceResponse = PlacesClient.findCurrentPlace(request);. Код никогда не попадает в журнал «После поиска текущего места».
Вот весь мой Java-компонент фрагментов:
package com.example.restaurantapp;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentContainer;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.Task;
import com.google.android.libraries.places.api.Places;
import com.google.android.libraries.places.api.model.Place;
import com.google.android.libraries.places.api.model.PlaceLikelihood;
import com.google.android.libraries.places.api.net.FindCurrentPlaceRequest;
import com.google.android.libraries.places.api.net.FindCurrentPlaceResponse;
import com.google.android.libraries.places.api.net.PlacesClient;
import java.util.Collections;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
* Use the {@link GmapsFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class GmapsFragment extends Fragment
{
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public GmapsFragment()
{
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment GmapsFragment.
*/
// TODO: Rename and change types and number of parameters
public static GmapsFragment newInstance(String param1, String param2)
{
GmapsFragment fragment = new GmapsFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (getArguments() != null)
{
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_gmaps, container, false);
SupportMapFragment supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapContainer);
supportMapFragment.getMapAsync(new OnMapReadyCallback()
{
@Override
public void onMapReady(@NonNull GoogleMap googleMap)
{
LatLng def = new LatLng(0, 0);
LatLng bs = new LatLng(31.25150448, 34.79455390);
//googleMap.addMarker(new MarkerOptions().position(def).title("Sydney"));
googleMap.animateCamera(CameraUpdateFactory.newLatLng(def));
CameraPosition cam = new CameraPosition.Builder().target(bs).zoom(10).build();
googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cam));
googleMap.getUiSettings().setCompassEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED) {
googleMap.setMyLocationEnabled(true);}
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.getUiSettings().setRotateGesturesEnabled(true);
}
});
String apiKey = BuildConfig.MAPS_API_KEY;
Places.initializeWithNewPlacesApiEnabled(requireActivity().getApplicationContext(), apiKey);
setCurrentLocation();
return view;
}
public void setCurrentLocation()
{
List
placeFields = Collections.singletonList(Place.Field.DISPLAY_NAME);
Log.d("PlacesDebug", "Before FindCurrentPlaceRequest");
FindCurrentPlaceRequest request = FindCurrentPlaceRequest.newInstance(placeFields);
Log.d("PlacesDebug", "After FindCurrentPlaceRequest");
PlacesClient placesClient = Places.createClient(requireContext());
if (ContextCompat.checkSelfPermission(requireActivity().getApplicationContext(), ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
{
Log.d("PlacesDebug", "Before findCurrentPlace");
Task placeResponse = placesClient.findCurrentPlace(request);
Log.d("PlacesDebug", "After findCurrentPlace");
placeResponse.addOnCompleteListener(task ->
{
if (task.isSuccessful())
{
FindCurrentPlaceResponse response = task.getResult();
for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods())
{
Log.i("CurrentLocation", String.format("Place '%s' has likelihood: %f", placeLikelihood.getPlace().getName(),
placeLikelihood.getLikelihood()));
}
}
else
{
Exception exception = task.getException();
if (exception instanceof ApiException) {
ApiException apiException = (ApiException) exception;
Log.e("NotFound", "Place not found: " + apiException.getStatusCode());
}
}
});
}
else
{
// A local method to request required permissions;
// See https://developer.android.com/training/permissions/requesting
//regetLocationPermission();
}
}
}
Я бы предпочел хотя бы попытаться использовать minSDK 24, несмотря на то, что я понимаю, что мое приложение может быть несовместимо с ним, когда я его завершу. Я бы предпочел не срезать углы, в настоящее время у меня есть варианты: либо создать minSDK 26, либо выполнить резервное копирование. Любая помощь приветствуется.
Я попытался добавить текущее местоположение пользователей на карту Google, которая у меня была, используя API Google Places, и пока это работало, я заметил, что на уровне API 26 выдавалась ошибка. После уточнения я обнаружил, что ошибка возникает, потому что код требует Ява 8.0. После некоторой отладки я обнаружил, что проблема была в строке: Task PlaceResponse = PlacesClient.findCurrentPlace(request);. Код никогда не попадает в журнал «После поиска текущего места». Вот весь мой Java-компонент фрагментов: [code]package com.example.restaurantapp; import static android.Manifest.permission.ACCESS_FINE_LOCATION;
/** * A simple {@link Fragment} subclass. * Use the {@link GmapsFragment#newInstance} factory method to * create an instance of this fragment. */ public class GmapsFragment extends Fragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters private String mParam1; private String mParam2;
public GmapsFragment() { // Required empty public constructor }
/** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment GmapsFragment. */ // TODO: Rename and change types and number of parameters public static GmapsFragment newInstance(String param1, String param2) { GmapsFragment fragment = new GmapsFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } }
public void setCurrentLocation() { List placeFields = Collections.singletonList(Place.Field.DISPLAY_NAME); Log.d("PlacesDebug", "Before FindCurrentPlaceRequest"); FindCurrentPlaceRequest request = FindCurrentPlaceRequest.newInstance(placeFields); Log.d("PlacesDebug", "After FindCurrentPlaceRequest"); PlacesClient placesClient = Places.createClient(requireContext()); if (ContextCompat.checkSelfPermission(requireActivity().getApplicationContext(), ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { Log.d("PlacesDebug", "Before findCurrentPlace"); Task placeResponse = placesClient.findCurrentPlace(request); Log.d("PlacesDebug", "After findCurrentPlace"); placeResponse.addOnCompleteListener(task -> { if (task.isSuccessful()) { FindCurrentPlaceResponse response = task.getResult(); for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) { Log.i("CurrentLocation", String.format("Place '%s' has likelihood: %f", placeLikelihood.getPlace().getName(), placeLikelihood.getLikelihood())); } } else { Exception exception = task.getException(); if (exception instanceof ApiException) { ApiException apiException = (ApiException) exception; Log.e("NotFound", "Place not found: " + apiException.getStatusCode()); } } }); } else { // A local method to request required permissions; // See https://developer.android.com/training/permissions/requesting //regetLocationPermission(); }
} } [/code] Я бы предпочел хотя бы попытаться использовать minSDK 24, несмотря на то, что я понимаю, что мое приложение может быть несовместимо с ним, когда я его завершу. Я бы предпочел не срезать углы, в настоящее время у меня есть варианты: либо создать minSDK 26, либо выполнить резервное копирование. Любая помощь приветствуется.