Gdy chcesz wywołać jeden z interfejsów API pakietu SDK opartego na Usługi Google Play, takie jak Logowanie przez Google czy ML Kit, musisz najpierw w celu utworzenia instancji obiektu klienckiego interfejsu API. Te obiekty automatycznie zarządzają połączenia z Usługami Google Play. Gdy połączenie jest dostępne, każdy interfejs API obiekt klienta wykonuje żądania po kolei. W przeciwnym razie obiekty klienta są umieszczane w kolejce prośby. Jeśli z dokumentacji nie wynika inaczej, obiekty klienta są tanie tworzyć; możesz tworzyć nowe klienty interfejsu API przy każdym wywołaniu Metody API.
Z tego przewodnika dowiesz się, jak wykonywać wywołania interfejsu API do dowolnych obsługiwanych pakietów SDK przez Usługi Google Play, w tym jak uzyskać dostęp do usług, które nie są wymagające autoryzacji oraz tych, które wymagają .
Rozpocznij
Na początek dodaj niezbędne narzędzia i zależności w projekcie aplikacji: opisane w przewodniku po konfigurowaniu Google Play. usługi.
Dostęp, gdy autoryzacja nie jest wymagana
Aby uzyskać dostęp do usługi, która nie wymaga autoryzacji interfejsu API, pobierz instancję
obiektu klienckiego usługi, przekazując go
Context
lub
bieżącego
Activity
Przed wywołaniem interfejsu API użytkownicy są proszeni o przejście na nowszą wersję Google Play
i usług w razie potrzeby.
Aby na przykład poznać ostatnią znaną lokalizację urządzenia za pomocą funkcji uśrednionej lokalizacji Provider for Android, dodaj operator logiczny widoczny w tym fragmencie kodu:
Kotlin
// Code required for requesting location permissions omitted for brevity. val client = LocationServices.getFusedLocationProviderClient(this) // Get the last known location. In some rare situations, this can be null. client.lastLocation.addOnSuccessListener { location : Location? -> location?.let { // Logic to handle location object. } }
Java
// Code required for requesting location permissions omitted for brevity. FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this); // Get the last known location. In some rare situations, this can be null. client.getLastLocation() .addOnSuccessListener(this, location -> { if (location != null) { // Logic to handle location object. } });
Dostęp, gdy wymagana jest autoryzacja
Aby uzyskać dostęp do usługi, która wymaga autoryzacji użytkownika, wykonaj te czynności kroki:
- Zaloguj użytkownika.
- Poproś o uprawnienia dostępu do zakresów, których wymaga usługa.
- Pobieranie instancji obiektu klienckiego usługi i przekazywanie jej
GoogleSignInAccount
opróczContext
lubActivity
obiektu.
Poniższy przykład pokazuje, jak odczytywać codzienne kroki użytkownika za pomocą funkcji Google Interfejs API Fit. Aby wyświetlić podobną implementację w kontekście całego projektu: wyświetlać główne działania BasicHistoryApiKotlin znajdziesz na GitHubie.
Kotlin
class FitFragment : Fragment() { private val fitnessOptions: FitnessOptions by lazy { FitnessOptions.builder() .addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE) .addDataType(DataType.TYPE_STEP_COUNT_DELTA) .build() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { fitSignIn() } /* * Checks whether the user is signed in. If so, executes the specified * function. If the user is not signed in, initiates the sign-in flow, * specifying the function to execute after the user signs in. */ private fun fitSignIn() { if (oAuthPermissionsApproved()) { readDailySteps() } else { GoogleSignIn.requestPermissions( this, SIGN_IN_REQUEST_CODE, getGoogleAccount(), fitnessOptions ) } } private fun oAuthPermissionsApproved() = GoogleSignIn.hasPermissions(getGoogleAccount(), fitnessOptions) /* * Gets a Google account for use in creating the fitness client. This is * achieved by either using the last signed-in account, or if necessary, * prompting the user to sign in. It's better to use the * getAccountForExtension() method instead of the getLastSignedInAccount() * method because the latter can return null if there has been no sign in * before. */ private fun getGoogleAccount(): GoogleSignInAccount = GoogleSignIn.getAccountForExtension(requireContext(), fitnessOptions) /* * Handles the callback from the OAuth sign in flow, executing the function * after sign-in is complete. */ override fun onActivityResult( requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (resultCode) { RESULT_OK -> { readDailySteps() } else -> { // Handle error. } } } /* * Reads the current daily step total. */ private fun readDailySteps() { Fitness.getHistoryClient(requireContext(), getGoogleAccount()) .readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA) .addOnSuccessListener { dataSet -> val total = when { dataSet.isEmpty -> 0 else -> dataSet.dataPoints.first() .getValue(Field.FIELD_STEPS).asInt() } Log.i(TAG, "Total steps: $total") } .addOnFailureListener { e -> Log.w(TAG, "There was a problem getting the step count.", e) } } companion object { const val SIGN_IN_REQUEST_CODE = 1001 } }
Java
public class FitFragment extends Fragment { private final FitnessOptions fitnessOptions = FitnessOptions.builder() .addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE) .addDataType(DataType.TYPE_STEP_COUNT_DELTA) .build(); @Override public void onViewCreated( @NotNull View view, @Nullable Bundle savedInstanceState) { fitSignIn(); } /* * Checks whether the user is signed in. If so, executes the specified * function. If the user is not signed in, initiates the sign-in flow, * specifying the function to execute after the user signs in. */ private void fitSignIn() { if (oAuthPermissionsApproved()) { readDailySteps(); } else { GoogleSignIn.requestPermissions(this, SIGN_IN_REQUEST_CODE, getGoogleAccount(), fitnessOptions); } } private boolean oAuthPermissionsApproved() { return GoogleSignIn.hasPermissions(getGoogleAccount(), fitnessOptions); } /* * Gets a Google account for use in creating the fitness client. This is * achieved by either using the last signed-in account, or if necessary, * prompting the user to sign in. It's better to use the * getAccountForExtension() method instead of the getLastSignedInAccount() * method because the latter can return null if there has been no sign in * before. */ private GoogleSignInAccount getGoogleAccount() { return GoogleSignIn.getAccountForExtension( requireContext(), fitnessOptions); } /* * Handles the callback from the OAuth sign in flow, executing the function * after sign-in is complete. */ @Override public void onActivityResult( int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { readDailySteps(); } else { // Handle error. } } /* * Reads the current daily step total. */ private void readDailySteps() { AtomicInteger total = new AtomicInteger(); Fitness.getHistoryClient(requireContext(), getGoogleAccount()) .readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA) .addOnSuccessListener(dataSet -> { if (!dataSet.isEmpty()) total.set(Integer.parseInt(dataSet.getDataPoints() .get(0).getValue(FIELD_STEPS).toString())); Log.i(TAG, "Total steps: $total"); }) .addOnFailureListener(e -> { Log.w(TAG, "There was a problem getting the step count.", e); }); } private static final int SIGN_IN_REQUEST_CODE = 1001; }
Sprawdź dostępność interfejsu API
Zanim włączysz w aplikacji funkcję, która zależy od Usług Google Play
API, sprawdzić dostępność interfejsu API na urządzeniu. Aby to zrobić:
zadzwoń do: checkApiAvailability()
.
Fragment kodu poniżej pokazuje, jak sprawdzić dostępność dostawca uśrednionej lokalizacji
Kotlin
fun getLastLocationIfApiAvailable(context: Context?): Task<Location>? { val client = getFusedLocationProviderClient(context) return GoogleApiAvailability.getInstance() .checkApiAvailability(client) .onSuccessTask { _ -> client.lastLocation } .addOnFailureListener { _ -> Log.d(TAG, "Location unavailable.")} }
Java
public Task<Location> getLastLocationIfApiAvailable(Context context) { FusedLocationProviderClient client = getFusedLocationProviderClient(context); return GoogleApiAvailability.getInstance() .checkApiAvailability(client) .onSuccessTask(unused -> client.getLastLocation()) .addOnFailureListener(e -> Log.d(TAG, "Location unavailable.")); }