중국에서는 구글 플레이 스토어가 지원되지 않는다.
중국에서 발매된 안드로이드 디바이스는 구글 플레이 스토어를 사용할 수 없습니다.
이유는 구글이 중국 정부의 검열 문제 때문에 아예 철수를 해버리게 되면서 모든 구글 서비스가 중단되었기 때문입니다.
하지만 바이두로 앱을 전파하는 경우도 있습니다.
이때, 구글 플레이 스토어가 지원되지 않을 경우, Billing 기능을 고려하여 구글 플레이 서비스 사용 가능 여부 확인이 필요한 경우가 있었습니다. 어떻게 해야 그 여부를 확인할 수 있는지 설명하겠습니다.
GoogleApiAvailability
GoogleApiAvailability 클래스는 Google Play 서비스의 가용성을 확인하고, 필요한 경우 사용자에게 오류를 해결하도록 안내하는 데 사용됩니다. 이 클래스는 Google Play 서비스 API의 일부입니다. 해당 클래스를 통해 사용자에게 플레이 서비스 업데이트 권장 안내까지 할 수 있습니다.
val gApi = GoogleApiAvailability.getInstance()
val resultCode = gApi.isGooglePlayServicesAvailable(context)
val isServicesAvailable = resultCode == ConnectionResult.SUCCESS
isGooglePlayServicesAvailable() 함수를 통해 구글 플레이 서비스 사용 가능 여부를 ConnectionResult Code 값으로 반환받을 수 있습니다. ConnectionResult Code에는 아래와 같은 종류가 있습니다.
public final class ConnectionResult extends AbstractSafeParcelable {
@KeepForSdk
public static final int UNKNOWN = -1;
public static final int SUCCESS = 0;
public static final int SERVICE_MISSING = 1;
public static final int SERVICE_VERSION_UPDATE_REQUIRED = 2;
public static final int SERVICE_DISABLED = 3;
public static final int SIGN_IN_REQUIRED = 4;
public static final int INVALID_ACCOUNT = 5;
public static final int RESOLUTION_REQUIRED = 6;
public static final int NETWORK_ERROR = 7;
public static final int INTERNAL_ERROR = 8;
public static final int SERVICE_INVALID = 9;
public static final int DEVELOPER_ERROR = 10;
public static final int LICENSE_CHECK_FAILED = 11;
public static final int CANCELED = 13;
public static final int TIMEOUT = 14;
public static final int INTERRUPTED = 15;
public static final int API_UNAVAILABLE = 16;
public static final int SIGN_IN_FAILED = 17;
public static final int SERVICE_UPDATING = 18;
public static final int SERVICE_MISSING_PERMISSION = 19;
public static final int RESTRICTED_PROFILE = 20;
public static final int RESOLUTION_ACTIVITY_NOT_FOUND = 22;
public static final int API_DISABLED = 23;
public static final int API_DISABLED_FOR_CONNECTION = 24;
따라서 반환된 값이 0이면 해당 디바이스는 구글 플레이 서비스 사용이 가능하다는 것을 의미합니다.
구글 플레이 스토어 애플리케이션 설치 여부 확인
추가적으로 애플리케이션이 설치되었는지 까지 확인하는 로직을 추가했습니다.
"com.android.vending"이 구글 플레이 스토어 앱의 패키지명이고, 해당 패키지명으로 조회가 되지 않을 경우, 구글 플레이 스토어 앱이 설치되지 않은 것으로 간주할 수 있습니다.
val packageManager = context.packageManager
val isInstallPlayStore = try {
val packageName = "com.android.vending"
val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(PackageManager.GET_ACTIVITIES.toLong()))
} else {
@Suppress("DEPRECATION") packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES)
}
info != null
} catch (e: PackageManager.NameNotFoundException) {
false // Google Play Store is not installed
}
Billing Processor를 활용하는 경우
더 간단하게 isGooglePlayServicesAvailable()를 체크할 수 있습니다. 구글 하위 메서드는 코드 값을 반환하지만 아래 Billing Processor의 메서드를 활용하면 바로 Boolean 값으로 확인이 가능합니다.
BillingProcessor.isIabServiceAvailable(context)
중국에서는 구글 플레이 스토어가 지원되지 않는다.
중국에서 발매된 안드로이드 디바이스는 구글 플레이 스토어를 사용할 수 없습니다.
이유는 구글이 중국 정부의 검열 문제 때문에 아예 철수를 해버리게 되면서 모든 구글 서비스가 중단되었기 때문입니다.
하지만 바이두로 앱을 전파하는 경우도 있습니다.
이때, 구글 플레이 스토어가 지원되지 않을 경우, Billing 기능을 고려하여 구글 플레이 서비스 사용 가능 여부 확인이 필요한 경우가 있었습니다. 어떻게 해야 그 여부를 확인할 수 있는지 설명하겠습니다.
GoogleApiAvailability
GoogleApiAvailability 클래스는 Google Play 서비스의 가용성을 확인하고, 필요한 경우 사용자에게 오류를 해결하도록 안내하는 데 사용됩니다. 이 클래스는 Google Play 서비스 API의 일부입니다. 해당 클래스를 통해 사용자에게 플레이 서비스 업데이트 권장 안내까지 할 수 있습니다.
val gApi = GoogleApiAvailability.getInstance()
val resultCode = gApi.isGooglePlayServicesAvailable(context)
val isServicesAvailable = resultCode == ConnectionResult.SUCCESS
isGooglePlayServicesAvailable() 함수를 통해 구글 플레이 서비스 사용 가능 여부를 ConnectionResult Code 값으로 반환받을 수 있습니다. ConnectionResult Code에는 아래와 같은 종류가 있습니다.
public final class ConnectionResult extends AbstractSafeParcelable {
@KeepForSdk
public static final int UNKNOWN = -1;
public static final int SUCCESS = 0;
public static final int SERVICE_MISSING = 1;
public static final int SERVICE_VERSION_UPDATE_REQUIRED = 2;
public static final int SERVICE_DISABLED = 3;
public static final int SIGN_IN_REQUIRED = 4;
public static final int INVALID_ACCOUNT = 5;
public static final int RESOLUTION_REQUIRED = 6;
public static final int NETWORK_ERROR = 7;
public static final int INTERNAL_ERROR = 8;
public static final int SERVICE_INVALID = 9;
public static final int DEVELOPER_ERROR = 10;
public static final int LICENSE_CHECK_FAILED = 11;
public static final int CANCELED = 13;
public static final int TIMEOUT = 14;
public static final int INTERRUPTED = 15;
public static final int API_UNAVAILABLE = 16;
public static final int SIGN_IN_FAILED = 17;
public static final int SERVICE_UPDATING = 18;
public static final int SERVICE_MISSING_PERMISSION = 19;
public static final int RESTRICTED_PROFILE = 20;
public static final int RESOLUTION_ACTIVITY_NOT_FOUND = 22;
public static final int API_DISABLED = 23;
public static final int API_DISABLED_FOR_CONNECTION = 24;
따라서 반환된 값이 0이면 해당 디바이스는 구글 플레이 서비스 사용이 가능하다는 것을 의미합니다.
구글 플레이 스토어 애플리케이션 설치 여부 확인
추가적으로 애플리케이션이 설치되었는지 까지 확인하는 로직을 추가했습니다.
"com.android.vending"이 구글 플레이 스토어 앱의 패키지명이고, 해당 패키지명으로 조회가 되지 않을 경우, 구글 플레이 스토어 앱이 설치되지 않은 것으로 간주할 수 있습니다.
val packageManager = context.packageManager
val isInstallPlayStore = try {
val packageName = "com.android.vending"
val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(PackageManager.GET_ACTIVITIES.toLong()))
} else {
@Suppress("DEPRECATION") packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES)
}
info != null
} catch (e: PackageManager.NameNotFoundException) {
false // Google Play Store is not installed
}
Billing Processor를 활용하는 경우
더 간단하게 isGooglePlayServicesAvailable()를 체크할 수 있습니다. 구글 하위 메서드는 코드 값을 반환하지만 아래 Billing Processor의 메서드를 활용하면 바로 Boolean 값으로 확인이 가능합니다.
BillingProcessor.isIabServiceAvailable(context)