Wenn Sie eine der APIs in einem SDK aufrufen möchten, das von Google Play-Diensten wie Google Log-in oder ML Kit bereitgestellt wird, müssen Sie zuerst eine Instanz eines API-Clientobjekts erstellen. Diese Objekte verwalten automatisch die Verbindung zu Google Play-Diensten. Wenn eine Verbindung verfügbar ist, führt jedes API-Clientobjekt Anfragen der Reihe nach aus. Andernfalls stellt das Clientobjekt die Anfragen in die Warteschlange. Sofern in der Dokumentation nicht anders angegeben, sind die Erstellung von Clientobjekten kostengünstig. Sie können also jedes Mal neue API-Clients erstellen, wenn Sie API-Methoden aufrufen möchten.
In diesem Leitfaden wird beschrieben, wie du API-Aufrufe an alle SDKs senden kannst, die von Google Play-Diensten bereitgestellt werden. Außerdem erfährst du, wie du auf Dienste zugreifen kannst, für die keine Autorisierung erforderlich ist oder die autorisiert werden müssen.
Erste Schritte
Fügen Sie Ihrem App-Projekt zuerst die erforderlichen Tools und Abhängigkeiten hinzu, wie in der Anleitung zum Einrichten von Google Play-Diensten beschrieben.
Zugriff, wenn keine Autorisierung erforderlich ist
Wenn Sie auf einen Dienst zugreifen möchten, für den keine API-Autorisierung erforderlich ist, rufen Sie eine Instanz des Clientobjekts des Dienstes ab und übergeben Sie entweder die aktuelle Context
oder die aktuelle Activity
.
Bevor API-Aufrufe ausgeführt werden, werden Nutzer bei Bedarf aufgefordert, die Google Play-Dienste zu aktualisieren.
Wenn Sie beispielsweise den letzten bekannten Standort des Geräts über den Anbieter für kombinierte Standortbestimmung für Android abrufen möchten, fügen Sie die Logik hinzu, die im folgenden Code-Snippet angezeigt wird:
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. } });
Zugriff, wenn Autorisierung erforderlich ist
So greifen Sie auf einen Dienst zu, der eine Nutzerautorisierung erfordert:
- Melden Sie den Nutzer an.
- Berechtigung zum Zugriff auf die Bereiche anfordern, die der Dienst benötigt.
- Ruft eine Instanz des Clientobjekts des Dienstes ab und übergibt ihr das Objekt
GoogleSignInAccount
des Nutzers zusätzlich zu einemContext
- oderActivity
-Objekt.
Im folgenden Beispiel wird das Lesen der täglichen Schritte eines Nutzers mithilfe der Google Fit API implementiert. Wenn Sie eine ähnliche Implementierung im Kontext eines vollständigen Projekts ansehen möchten, rufen Sie die Hauptaktivität der BasicHistoryApiKotlin-Anwendung auf GitHub auf.
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; }
API-Verfügbarkeit prüfen
Bevor Sie eine Funktion in Ihrer App aktivieren, die von einer Google Play Services API abhängig ist, prüfen Sie die Verfügbarkeit der API auf dem Gerät. Rufen Sie dazu checkApiAvailability()
auf.
Das folgende Code-Snippet zeigt, wie Sie die Verfügbarkeit des Anbieters für kombinierte Standortbestimmung prüfen.
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.")); }