Приложение вылетает каждый раз, когда я запускаю его на своем телефоне. Здесь что-то не так? Он говорит, что, к сожалению, "appname" перестало работать. Я также пробовал другие подходы к проверке сервисов googleplay, но он всегда дает сбой. Я обновил свои сервисы Google Play, и у меня отлично работает рабочая карта Google v2. Какие-нибудь решения для этого кода? Он вылетает на моем телефоне под управлением Android 4.1.2 и на моем AVD.

package com.example.checkgoogleplayproject;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;

public class MainActivity extends Activity {

    @Override
    protected void onResume() {
        super.onResume();

        // Getting reference to TextView to show the status
        TextView tvStatus = (TextView)findViewById(R.id.tv_status);

        // Getting status
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());

        // Showing status
        if(status==ConnectionResult.SUCCESS)
            tvStatus.setText("Google Play Services are available");
        else{
            tvStatus.setText("Google Play Services are not available");
            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
            dialog.show();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}
72
user3144836 19 Мар 2014 в 03:47

8 ответов

Лучший ответ

Спасибо, ребята, за ваши ответы. Я только что понял это из своего LogCat. Мне пришлось включить это в свой манифест Android.

<application>
<meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
...
6
user3144836 3 Апр 2014 в 20:30

Чтобы проверить, доступен ли GooglePlayServices, используйте GoogleApiAvailability. isGooglePlayServicesAvailable(), как GooglePlayServicesUtil . isGooglePlayServicesAvailable() не рекомендуется .

public boolean isGooglePlayServicesAvailable(Context context){
    GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();
    int resultCode = googleApiAvailability.isGooglePlayServicesAvailable(context);
    return resultCode == ConnectionResult.SUCCESS;  
}

Обновление: проверьте, доступна ли служба Google Play. Если служба Google Play недоступна и ошибку можно исправить, откройте диалоговое окно для устранения ошибки.

public boolean isGooglePlayServicesAvailable(Activity activity) {
    GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();
    int status = googleApiAvailability.isGooglePlayServicesAvailable(activity);
    if(status != ConnectionResult.SUCCESS) {
        if(googleApiAvailability.isUserResolvableError(status)) {
              googleApiAvailability.getErrorDialog(activity, status, 2404).show();
        }
        return false;
    }
    return true;
}
140
Dhaval Patel 10 Май 2016 в 04:11

Я не знаю, где опубликовать это, но сложность правильного рабочего процесса проверки сервисов Google Play - это умопомрачительный, я использую некоторые пользовательские классы, но вы можете получить точку ...

protected boolean checkPlayServices() {
    final int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity());
    if (resultCode != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode, activity(),
                    PLAY_SERVICES_RESOLUTION_REQUEST);
            if (dialog != null) {
                dialog.show();
                dialog.setOnDismissListener(new OnDismissListener() {
                    public void onDismiss(DialogInterface dialog) {
                        if (ConnectionResult.SERVICE_INVALID == resultCode) activity().finish();
                    }
                });
                return false;
            }
        }
        new CSAlertDialog(this).show("Google Play Services Error",
                "This device is not supported for required Goole Play Services", "OK", new Call() {
                    public void onCall(Object value) {
                        activity().finish();
                    }
                });
        return false;
    }
    return true;
}
19
Renetik 3 Окт 2014 в 11:29

Добавьте этот метод на свой экран-заставку; Ваше приложение вообще не запустится, если у вас не установлены или обновлены сервисы Google Play.

Dialog errorDialog;

private boolean checkPlayServices() {

        GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();

        int resultCode = googleApiAvailability.isGooglePlayServicesAvailable(this);

        if (resultCode != ConnectionResult.SUCCESS) {
            if (googleApiAvailability.isUserResolvableError(resultCode)) {

                if (errorDialog == null) {
                    errorDialog = googleApiAvailability.getErrorDialog(this, resultCode, 2404);
                    errorDialog.setCancelable(false);
                }

                if (!errorDialog.isShowing())
                    errorDialog.show();

            }
        }

        return resultCode == ConnectionResult.SUCCESS;
    }

И называть это только в резюме

@Override
protected void onResume() {
    super.onResume();
    if (checkPlayServices()) {
        startApp();
    }
}
13
Pedro Varela 12 Апр 2017 в 17:52

+ Изменить

int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());

К

int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext();
8
Shayden117 19 Мар 2014 в 00:08

Вы устанавливаете изменение checkPlayServices в документе для чтения в новом 2016 году образцы Google для служб Google

enter image description here

if (checkPlayServices()) {
            // Start IntentService to register this application with GCM.
            Intent intent = new Intent(this, RegistrationIntentService.class);
            startService(intent);
        }



    private boolean checkPlayServices() {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                        .show();
            } else {
                Log.i(TAG, "This device is not supported.");
                finish();
            }
            return false;
        }
        return true;
    }
8
sindyoke 1 Ноя 2018 в 02:12

Насколько я знаю, это минимально необходимый код для проверки сервисов Google Play при запуске приложения на заставке, например, активности. Подобно ответу Дхавела, но без лишнего кода.

Вы можете убедиться, что он работает во всех случаях, просто передав собственный код результата методу getErrorDialog. Все коды результатов перечислены здесь. Важно использовать onResume, поскольку он вызывается после возврата в приложение после обновления сервисов Google Play в Google Play и т. Д.

class MainActivity : AppCompatActivity() {

    override fun onResume() {
        super.onResume()
        if (checkGooglePlayServices()) {
            startActivity(Intent(this, HomeActivity::class.java))
        }
    }

    private fun checkGooglePlayServices(): Boolean {
        val availability = GoogleApiAvailability.getInstance()
        val resultCode = availability.isGooglePlayServicesAvailable(this)
        if (resultCode != ConnectionResult.SUCCESS) {
            availability.getErrorDialog(this, resultCode, 0).show()
            return false
        }
        return true
    }
    
}
3
Simon Bengtsson 12 Апр 2021 в 14:07

Проверить наличие сервисов Play можно так:

/**
 * Check if correct Play Services version is available on the device.
 *
 * @param context
 * @param versionCode
 * @return boolean
 */
public static boolean checkGooglePlayServiceAvailability(Context context, int versionCode) {

    // Query for the status of Google Play services on the device
    int statusCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context);

    if ((statusCode == ConnectionResult.SUCCESS)
            && (GooglePlayServicesUtil.GOOGLE_PLAY_SERVICES_VERSION_CODE >= versionCode)) {
        return true;
    } else {
        return false;
    }
}

И вы можете просто передать -1 для параметра versionCode.

1
IgorGanapolsky 20 Янв 2016 в 14:41