Auf Google APIs zugreifen

Wenn Sie eine der APIs in einem SDK aufrufen möchten, das auf Google Play-Diensten basiert, z. B. Google Sign-in oder ML Kit, müssen Sie zuerst eine Instanz eines API-Clientobjekts erstellen. Diese Objekte verwalten die Verbindung zu den Google Play-Diensten automatisch. Wenn eine Verbindung verfügbar ist, führt jedes API-Clientobjekt Anfragen nacheinander aus. Andernfalls stellt das Clientobjekt die Anfragen in die Warteschlange. Sofern nicht anders in der Dokumentation angegeben, sind Clientobjekte kostengünstig zu erstellen. Sie können also jedes Mal neue API-Clients erstellen, wenn Sie API-Methoden aufrufen möchten.

In diesem Leitfaden erfahren Sie, wie Sie API-Aufrufe an alle SDKs senden können, die von Google Play-Diensten unterstützt werden. Außerdem wird beschrieben, wie Sie auf Dienste zugreifen, für die keine Autorisierung erforderlich ist, und auf Dienste, für die eine Autorisierung erforderlich ist.

Jetzt starten

Fügen Sie als Erstes die erforderlichen Tools und Abhängigkeiten in Ihr App-Projekt ein, wie im Leitfaden 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 ihm entweder die aktuelle Context oder die aktuelle Activity. Bevor API-Aufrufe ausgeführt werden, werden Nutzer aufgefordert, gegebenenfalls Google Play-Dienste zu aktualisieren.

Wenn Sie beispielsweise den zuletzt bekannten Standort des Geräts mit dem Anbieter für kombinierte Standortbestimmung für Android abrufen möchten, fügen Sie die Logik aus dem folgenden Code-Snippet hinzu:

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 eine Autorisierung erforderlich ist

So greifen Sie auf einen Dienst zu, für den eine Nutzerautorisierung erforderlich ist:

  1. Melden Sie den Nutzer an.
  2. Anfordern der Berechtigung zum Zugriff auf die Bereiche, die für den Dienst erforderlich sind.
  3. Rufe eine Instanz des Clientobjekts des Dienstes ab und übergebe ihm zusätzlich zu einem Context- oder Activity-Objekt das GoogleSignInAccount-Objekt des Nutzers.

Im folgenden Beispiel wird implementiert, wie die täglichen Schritte eines Nutzers mithilfe der Google Fit API gelesen werden. Eine ähnliche Implementierung im Kontext eines vollständigen Projekts finden Sie auf GitHub in der Hauptaktivität der App „BasicHistoryApiKotlin“.

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-Dienst-API abhängt, sollten Sie prüfen, ob die API auf dem Gerät verfügbar ist. Rufen Sie dazu checkApiAvailability() auf.

Im folgenden Code-Snippet wird gezeigt, wie die Verfügbarkeit des Anbieters für den kombinierten Standort geprüft wird.

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."));
}