Google Play Hizmetleri tarafından desteklenen bir SDK'daki API'lerden birine (ör. Google ile oturum açma veya ML Kit) çağrı yapmak istediğinizde önce bir API istemci nesnesi örneği oluşturmanız gerekir. Bu nesneler, Google Play Hizmetleri bağlantısını otomatik olarak yönetir. Bağlantı mevcut olduğunda her API istemci nesnesi istekleri sırayla yürütür. Aksi takdirde istemci nesnesi istekleri sıraya alır. Belgelerde aksi belirtilmediği sürece istemci nesnelerini oluşturmak kolaydır. API yöntemlerini her çağırmak istediğinizde yeni API istemcileri oluşturabilirsiniz.
Bu kılavuzda, Google Play Hizmetleri tarafından desteklenen SDK'lardan herhangi birine nasıl API çağrısı yapabileceğiniz gösterilmektedir. Yetkilendirme gerektirmeyen ve yetkilendirme gerektiren hizmetlere nasıl erişebileceğiniz de bu kılavuzda açıklanmaktadır.
Başlayın
Başlamak için Google Play hizmetlerini ayarlama kılavuzunda açıklandığı gibi, uygulama projenize gerekli araçları ve bağımlılıkları ekleyin.
Yetkilendirme gerekmediğinde erişim
API yetkilendirmesi gerektirmeyen bir hizmete erişmek için hizmetin istemci nesnesinin bir örneğini alın. Bu örnekte geçerli Context
veya geçerli Activity
değerini iletin.
Herhangi bir API çağrısı yapılmadan önce, gerekirse kullanıcılardan Google Play hizmetlerini yükseltmeleri istenir.
Örneğin, Android için Birleşik Konum Sağlayıcı'yı kullanarak cihazın bilinen son konumunu almak istiyorsanız aşağıdaki kod snippet'inde gösterilen mantığı ekleyin:
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. } });
Yetkilendirme gerektiğinde erişim
Kullanıcı yetkilendirmesi gerektiren bir hizmete erişmek için aşağıdaki adımları uygulayın:
- Kullanıcı için oturum açın.
- Hizmetin gerektirdiği kapsamlara erişmek için izin isteyin.
- Bir
Context
veyaActivity
nesnesi ile birlikte kullanıcınınGoogleSignInAccount
nesnesini iletmek suretiyle hizmetin istemci nesnesinin bir örneğini alın.
Aşağıdaki örnekte, Google Fit API'yi kullanarak bir kullanıcının günlük adım sayısını okuma işlemi uygulanmaktadır. Benzer bir uygulamayı tam bir proje bağlamında görmek için GitHub'da BasicHistoryApiKotlin uygulamasının ana etkinliğini inceleyin.
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'nin kullanılabilir olup olmadığını kontrol etme
Uygulamanızda Google Play Hizmetleri API'sine bağlı bir özelliği etkinleştirmeden önce, API'nin cihazda kullanılabilir olup olmadığını kontrol edin. Bunun için checkApiAvailability()
numaralı telefonu arayın.
Aşağıdaki kod snippet'inde, birleştirilmiş konum sağlayıcının kullanılabilirliğinin nasıl kontrol edileceği gösterilmektedir.
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.")); }