Как использовать com.google.android.gms.common.api.GoogleApiClient, а не ActivityRecognitionClient, чтобы запрашивать обновления Activity в Android?

Девизом здесь является вызов службы "ActivityTrackerService", когда я говорю requestActivityUpdates(), используя ActivityRecognition.ActivityRecognitionApi от GoogleApiClient, как показано в приведенном ниже коде, когда вызывается googleApiClient.connect(). После подключения API выполняется обратный вызов onConnected и запрашиваются обновления активности. Код работает отлично, так как в результате обратного вызова я получаю успех. Но кое-как класс Service onHandleIntent не вызывается. Я не уверен, начал ли сервис работать или нет.

Класс провайдера услуг:

public class ActivityServiceProvider {
    private Context context;
    private GoogleApiClient googleApiClient;
    private PendingIntent mActivityRecognitionPendingIntent;

    public ActivityServiceProvider(Context context) {
        this.context = context;
        createGoogleLocationServiceClient();
    }

    private void createGoogleLocationServiceClient() {
        googleApiClient = new GoogleApiClient.Builder(context).addApi(ActivityRecognition.API)
                .addConnectionCallbacks(new ConnectionCallbacks() {

                    @Override
                    public void onConnectionSuspended(int arg0) {
                        Log.d(ActivityUtils.APPTAG, "GoogleApiClient Suspended");
                    }

                    @Override
                    public void onConnected(Bundle arg0) {
                        Log.d(ActivityUtils.APPTAG, "GoogleApiClient Connected Now");
                        ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(googleApiClient,
                                ActivityUtils.DETECTION_INTERVAL_MILLISECONDS, getPendingIntent()).setResultCallback(
                                new ResultCallback<Status>() {

                                    @Override
                                    public void onResult(Status arg0) {
                                        if (arg0.isSuccess()) {
                                            Log.d(ActivityUtils.APPTAG, "Updates Requested Successfully");
                                        } else {
                                            Log.d(ActivityUtils.APPTAG, "Updates could not be requested");
                                        }
                                    }
                                });
                    }
                }).addOnConnectionFailedListener(new OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(ConnectionResult arg0) {
                        Log.d(ActivityUtils.APPTAG, "GoogleApiClient Connection Failed");
                    }
                }).build();
    }

    public PendingIntent getRequestPendingIntent() {
        return mActivityRecognitionPendingIntent;
    }

    public void setRequestPendingIntent(PendingIntent intent) {
        mActivityRecognitionPendingIntent = intent;
    }

    private PendingIntent getPendingIntent() {
        Intent intent = new Intent(context, ActivityTrackerService.class);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        setRequestPendingIntent(pendingIntent);
        return pendingIntent;
    }

    private boolean servicesConnected() {
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context);
        if (ConnectionResult.SUCCESS == resultCode) {
            Log.d(ActivityUtils.APPTAG, context.getString(R.string.play_services_available));
            return true;
        } else {
            Log.d(ActivityUtils.APPTAG, context.getString(R.string.play_services_unavailable));
            return false;
        }
    }

    public void connect() {
        if (servicesConnected() && !googleApiClient.isConnected()) {
            Log.d(ActivityUtils.APPTAG, "GoogleApiClient Connection Initiated: connect() Called");
            googleApiClient.connect();
        } else {
            Log.d(ActivityUtils.APPTAG, "GoogleApiClient already connected or is unavailable");
        }
    }

    public void disconnect() {
        if (servicesConnected() && googleApiClient.isConnected()) {
            Log.d(ActivityUtils.APPTAG, "GoogleApiClient disconnection kicked");
            if (mActivityRecognitionPendingIntent != null && googleApiClient != null) {
                ActivityRecognition.ActivityRecognitionApi.removeActivityUpdates(googleApiClient,
                        mActivityRecognitionPendingIntent);
            }
            googleApiClient.disconnect();
        } else {
            Log.d(ActivityUtils.APPTAG, "GoogleApiClient already disconnected or is unavailable");
        }
    }
}

Класс обслуживания:

public class ActivityTrackerService extends IntentService {

    private SharedPreferences mPrefs;

    public ActivityTrackerService() {
        super("ActivityTrackerService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        mPrefs = getApplicationContext().getSharedPreferences(ActivityUtils.SHARED_PREFERENCES, Context.MODE_PRIVATE);
        if (ActivityRecognitionResult.hasResult(intent)) {

            ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
            DetectedActivity mostProbableActivity = result.getMostProbableActivity();
            int confidence = mostProbableActivity.getConfidence();
            int activityType = mostProbableActivity.getType();
            String activityName = ActivityUtils.getNameFromType(activityType);

            Log.d(ActivityUtils.APPTAG, "Activity Detected:" + activityName);

            Intent regularActivityUpdateIntent = new Intent(ActivityUtils.REGULAR_ACTIVITY_UPDATE_INTENT);
            regularActivityUpdateIntent.putExtra(ActivityUtils.EXTRA_ACTIVITY_NAME, activityName);
            regularActivityUpdateIntent.putExtra(ActivityUtils.EXTRA_ACTIVITY_TYPE, activityType);

            getApplicationContext().sendBroadcast(regularActivityUpdateIntent);

            if (!mPrefs.contains(ActivityUtils.KEY_PREVIOUS_ACTIVITY_TYPE)) {
                Editor editor = mPrefs.edit();

                editor.putInt(ActivityUtils.KEY_PREVIOUS_ACTIVITY_TYPE, activityType);
                editor.putString(ActivityUtils.KEY_PREVIOUS_ACTIVITY_NAME, activityName);

                editor.commit();

                Intent newActivityUpdateIntent = new Intent(ActivityUtils.NEW_ACTIVITY_UPDATE_INTENT);
                regularActivityUpdateIntent.putExtra(ActivityUtils.EXTRA_ACTIVITY_NAME, activityName);
                regularActivityUpdateIntent.putExtra(ActivityUtils.EXTRA_ACTIVITY_TYPE, activityType);
                getApplicationContext().sendBroadcast(newActivityUpdateIntent);

            } else if (isMoving(activityType) && activityChanged(activityType) && (confidence >= 50)) {
                sendNotification();
            }
        }
    }

    private void sendNotification() {

        NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());
        builder.setContentTitle("Attention").setContentText("Click to turn on GPS, or swipe to ignore")
                .setSmallIcon(R.drawable.ic_notification).setContentIntent(getContentIntent());
        NotificationManager notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notifyManager.notify(0, builder.build());
    }

    private PendingIntent getContentIntent() {
        Intent gpsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        return PendingIntent.getActivity(getApplicationContext(), 0, gpsIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

    private boolean activityChanged(int currentType) {
        int previousType = mPrefs.getInt(ActivityUtils.KEY_PREVIOUS_ACTIVITY_TYPE, DetectedActivity.UNKNOWN);
        if (previousType != currentType) {
            return true;
        } else {
            return false;
        }
    }

    private boolean isMoving(int type) {
        switch (type) {
        case DetectedActivity.STILL:
        case DetectedActivity.TILTING:
        case DetectedActivity.UNKNOWN:
            return false;
        default:
            return true;
        }
    }
}

Конкретные записи манифеста Android следующие:

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />



<service android:name=".ActivityTrackerService" >
        </service>

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

Кто-нибудь пробовал использовать com.google.android.gms.common.api.GoogleApiClient для запроса обновлений Activity с помощью ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates или есть ли какой-то другой способ использовать GoogleApiClient для запроса обновлений активности?

2 ответа

У меня была такая же проблема, и даже с явным намерением onHandleIntent() не будет вызываться.

Однако я обнаружил, что onStartCommand вызывался и мог обойти его, установив и проверив намеренное действие.

Это не объяснение или решения как таковые, но по крайней мере обходной путь;)

Вы должны написать Gradle вашего проекта (приложение)

 dependencies{
 compile 'com.google.firebase:firebase-appindexing:11.8.0'
 ....
 }

затем добавьте библиотеки и импортируйте.