私のアプリケーションでは、ユーザーのデバイスにインストールされているGoogle Playサービスのバージョンを確認する必要があります。出来ますか ?はいの場合、どうすればそれができますか? Googleで検索しましたが、何も見つかりませんでした!
私は簡単な解決策を見つけました:
int v = getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ).versionCode;
ただし、versionCode
はAPI 28で非推奨になったため、PackageInfoCompat
を使用できます。
long v = PackageInfoCompat.getLongVersionCode(getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ));
Stan0が提供するリンクを見ると、 this が表示されます。
public static final int GOOGLE_PLAY_SERVICES_VERSION_CODE
このクライアントバージョンとの互換性を保つための最小Google Playサービスパッケージバージョン(AndroidManifest.xml Android:versionCodeで宣言)。定数値:3225000(0x003135a8)
したがって、マニフェストでそれを設定してから isGooglePlayServicesAvailable(context)
を呼び出すと:
public static int isGooglePlayServicesAvailable (Context context)
Google Play開発者サービスがこのデバイスにインストールされ有効になっていること、およびこのデバイスにインストールされているバージョンがこのクライアントに必要なバージョンより古いことを確認します。
戻り値
- エラーが発生したかどうかを示すステータスコード。 ConnectionResultでは、
SUCCESS
、SERVICE_MISSING
、SERVICE_VERSION_UPDATE_REQUIRED
、SERVICE_DISABLED
、SERVICE_INVALID
のいずれかです。
デバイスがアプリで必要なバージョンを使用していることを確認します。そうでない場合は、ドキュメントに従ってアクションを実行できます
GooglePlayServicesUtil.isGooglePlayServicesAvailable()
は非推奨になり、代わりに GoogleApiAvailability.isGooglePlayServicesAvailable()
を使用する必要があります。
ここに私の解決策があります:
private boolean checkGooglePlayServices() {
final int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (status != ConnectionResult.SUCCESS) {
Log.e(TAG, GooglePlayServicesUtil.getErrorString(status));
// ask user to update google play services.
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, 1);
dialog.show();
return false;
} else {
Log.i(TAG, GooglePlayServicesUtil.getErrorString(status));
// google play services is updated.
//your code goes here...
return true;
}
}
2つのオプションがあります。コメントとしてelseブロックにコードを直接記述するか、このメソッドに返されたブール値を使用してカスタムコードを記述します。
このコードが誰かの助けになることを願っています。
int status = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this);
if(status != ConnectionResult.SUCCESS) {
if(status == ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED){
Toast.makeText(this,"please update your google play service",Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(this, "please download the google play service", Toast.LENGTH_SHORT).show();
}
}
私はこのコードで終わった新しいアップデートから、それに関連するすべてのものを管理する便利な方法を作りました。
サービスの可用性に関連するすべての詳細および関連する詳細が利用可能です こちら 。
private void checkPlayService(int PLAY_SERVICE_STATUS)
{
switch (PLAY_SERVICE_STATUS)
{
case ConnectionResult.API_UNAVAILABLE:
//API is not available
break;
case ConnectionResult.NETWORK_ERROR:
//Network error while connection
break;
case ConnectionResult.RESTRICTED_PROFILE:
//Profile is restricted by google so can not be used for play services
break;
case ConnectionResult.SERVICE_MISSING:
//service is missing
break;
case ConnectionResult.SIGN_IN_REQUIRED:
//service available but user not signed in
break;
case ConnectionResult.SUCCESS:
break;
}
}
私はこのように使います
GoogleApiAvailability avail;
int PLAY_SERVICE_STATUS = avail.isGooglePlayServicesAvailable(this);
checkPlayService(PLAY_SERVICE_STATUS);
また、バージョンGoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE;
の場合は提供されます。
そして、私が研究中に見つけた最も有用な答えの1つ ここにあります
IMPORTANT:GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODEは、ユーザーのデバイスにインストールされているプレイサービスのバージョンではなく、アプリに必要な最小バージョンを返します。
アプリケーションマネージャでGoogle Play Servicesを検索すると、インストールされているバージョンが表示されます。
今朝、同じ問題に遭遇しました。そして、stan0からのアドバイスによって実現しました。 stan0に感謝します。
https://developers.google.com/maps/documentation/Android/map のサンプルコードに基づいて必要な変更は1つだけです。
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the
// map.
if (mMap == null) {
FragmentManager mgr = getFragmentManager();
MapFragment mapFragment = (MapFragment)mgr.findFragmentById(R.id.map);
mMap = mapFragment.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
// The Map is verified. It is now safe to manipulate the map.
setUpMap();
}else{
// check if google play service in the device is not available or out-dated.
GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
// nothing anymore, cuz Android will take care of the rest (to remind user to update google play service).
}
}
}
さらに、manifest.xmlに次の属性を追加する必要があります。
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="your.package.name"
Android:versionCode="3225130"
Android:versionName="your.version" >
また、「3225130」の値は、プロジェクトが使用しているgoogle-play-services_libから取得されます。また、その値は、google-play-services_libのmanifest.xmlと同じ場所にあります。
それが助けになることを願っています。
更新(2019.07.03)Kotlinバージョン:
class GooglePlayServicesUtil {
companion object {
private const val GOOGLE_PLAY_SERVICES_AVAILABLE_REQUEST = 9000
fun isGooglePlayServicesWithError(activity: Activity, showDialog: Boolean): Boolean {
val status = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(activity)
return if (status != ConnectionResult.SUCCESS) {
if (showDialog) {
GoogleApiAvailability.getInstance().getErrorDialog(activity, status, GOOGLE_PLAY_SERVICES_AVAILABLE_REQUEST).show()
}
true
} else {
false
}
}
}
}
int apkVersion = GoogleApiAvailability.getInstance().getApkVersion(getContext());
次と同じ結果が得られます。
int v = getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0 ).versionCode;
ただし、2つ目はtry-catch内に配置する必要があります。
次の関数を使用して、Google Playサービスを使用できるかどうかを確認します
private boolean checkGooglePlayServicesAvailable() {
final int connectionStatusCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (GooglePlayServicesUtil.isUserRecoverableError(connectionStatusCode)) {
showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
return false;
}
return true;
}