Saat ingin melakukan panggilan ke salah satu API di SDK yang didukung oleh layanan Google Play, seperti Login dengan Google atau ML Kit, Anda harus terlebih dahulu membuat instance objek klien API. Objek ini otomatis mengelola koneksi ke layanan Google Play. Saat koneksi tersedia, setiap objek klien API mengeksekusi permintaan secara berurutan. Jika tidak, objek klien akan mengantrekan permintaannya. Kecuali jika dokumentasi menunjukkan sebaliknya, objek klien tidak mahal untuk dibuat; Anda dapat membuat klien API baru setiap kali ingin memanggil metode API.
Panduan ini menunjukkan cara melakukan panggilan API ke salah satu SDK yang didukung oleh layanan Google Play, termasuk cara mengakses layanan yang tidak memerlukan otorisasi dan yang memerlukan otorisasi.
Mulai
Untuk memulai, tambahkan alat dan dependensi yang diperlukan dalam project aplikasi Anda, seperti yang dijelaskan dalam panduan tentang cara menyiapkan layanan Google Play.
Akses saat otorisasi tidak diperlukan
Untuk mengakses layanan yang tidak memerlukan otorisasi API, dapatkan instance
objek klien layanan, yang meneruskan
Context
atau
Activity
saat ini.
Sebelum panggilan API dijalankan, pengguna akan diminta untuk mengupgrade layanan
Google Play jika perlu.
Misalnya, untuk mendapatkan lokasi terakhir perangkat yang diketahui menggunakan Penyedia Lokasi Fusi untuk Android, tambahkan logika yang ditunjukkan dalam cuplikan kode berikut:
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. } });
Akses saat otorisasi diperlukan
Untuk mengakses layanan yang memerlukan otorisasi pengguna, selesaikan langkah-langkah berikut:
- Buat pengguna login.
- Minta izin untuk mengakses cakupan yang diperlukan oleh layanan.
- Dapatkan instance objek klien layanan, dengan meneruskan objek
GoogleSignInAccount
pengguna selain objekContext
atauActivity
.
Contoh berikut menerapkan pembacaan langkah harian pengguna menggunakan Google Fit API. Untuk melihat implementasi serupa dalam konteks project lengkap, lihat aktivitas utama BasicHistoryApiKotlin di GitHub.
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; }
Memeriksa ketersediaan API
Sebelum mengaktifkan fitur di aplikasi yang bergantung pada API layanan Google Play, periksa pemeriksaan ketersediaan API di perangkat. Untuk melakukannya,
panggil checkApiAvailability()
.
Cuplikan kode berikut menunjukkan cara memeriksa ketersediaan penyedia lokasi gabungan.
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.")); }