Первый переход всегда один и тот же - API распознавания активности - Переход активности - PullRequest
0 голосов
/ 09 мая 2018

Я использую API распознавания активности и переходы активности. Когда я впервые запускаю приложение, первым переходом всегда является. В этом приложении это WALKING-ENTER. Когда я пытался использовать только IN_VEHICLE-ENTER и IN_VEHICLE-EXIT в transitions, это было IN_VEHICLE-ENTER. Я думал об игнорировании первого перехода, но у устройства, на котором я тестировал, такой проблемы не было. Устройства, которые имели эти проблемы, были Android 8.1, а устройство не имело проблемы 6.0.

MainActivity расширяет AppCompatActivity

private static Intent serviceIntent;

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

    int PERMISSION_ALL = 1;
    String[] PERMISSIONS = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};

    if(!hasPermissions(this, PERMISSIONS)){
        ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
    }


    Button button = findViewById(R.id.button);
    button.setOnClickListener(
            new View.OnClickListener() {
                public void onClick(View view) {
                    serviceIntent = new Intent(MainActivity.this, ServiceS.class);
                    MainActivity.this.startService(serviceIntent);
                }
            });

}

public static boolean hasPermissions(Context context, String... permissions) {
    if (permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}

Сервис расширяет Сервис

public ServiceS() {
    super();
}


public static void locationArrived(Context context, Location location) {
    Log.d("hmm: ", location.toString());
}

@SuppressLint("MissingPermission")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onCreate() {
    initActivityTransition();
    super.onCreate();
}

@Override
public void onDestroy() {
    Log.d("hmm: ", "Updates stopped!");
    Task task = ActivityRecognition.getClient(this)
            .removeActivityTransitionUpdates(activityPendingIntent);
    super.onDestroy();
}

// ACTIVITY TRANSITION BLOCK START

private static List<ActivityTransition> transitions = new ArrayList<>();
private static PendingIntent activityPendingIntent;
private static ActivityTransitionRequest transitionRequest;

void initActivityTransition(){
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.IN_VEHICLE)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.IN_VEHICLE)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.WALKING)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.WALKING)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.STILL)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                    .build());
    transitions.add(
            new ActivityTransition.Builder()
                    .setActivityType(DetectedActivity.STILL)
                    .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                    .build());


    Intent activityIntentService = new Intent(this, TransitionReceiver.class);
    activityPendingIntent = PendingIntent.getBroadcast(this, 1, activityIntentService, PendingIntent.FLAG_UPDATE_CURRENT);

    Log.d("hmm: ","DriveBuddyService - initActivityTransition");
}

static void transitionArrived(final ActivityTransitionEvent event, final Context context){
    Log.d("hmm: ", event.toString());

    Toast.makeText(context, event.getActivityType() + "-" + event.getTransitionType(), Toast.LENGTH_LONG).show();

}

@Override
public void onStart(Intent intent, int startId) {
    if(transitionRequest==null) {
        transitionRequest = new ActivityTransitionRequest(transitions);
    }
    Task task = ActivityRecognition.getClient(this)
            .requestActivityTransitionUpdates(transitionRequest, activityPendingIntent);
    super.onStart(intent, startId);
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

TransitionReceiver расширяет BroadcastReceiver.

public void onReceive(final Context context, Intent intent) {
    Log.d("hmm: ","DriveBuddyTransitionReceiver - Enter");
    if (ActivityTransitionResult.hasResult(intent)) {
        ActivityTransitionResult result = ActivityTransitionResult.extractResult(intent);
        for (ActivityTransitionEvent event : result.getTransitionEvents()) {
            ServiceS.transitionArrived(event, context);
        }
    }
}

1 Ответ

0 голосов
/ 08 июня 2018

Я тоже наблюдал то же самое. Кажется, что последнее действие хранится в кэше или что-то в этом роде. Я видел, что это происходит на Android 7.1 и Android 8.1.

Чтобы противостоять этому, я проверяю истекшее время, когда произошел переход. Я игнорирую обратный вызов, если переход произошел более 30 секунд назад.

Вот как выглядит мой код:

@Override
public void onReceive(Context context, Intent i) {

    if (ActivityTransitionResult.hasResult(i)) {
        ActivityTransitionResult result = ActivityTransitionResult.extractResult(i);

        for (ActivityTransitionEvent event : result.getTransitionEvents()) {
            //continue only if the activity happened in the last 30 seconds
            //for some reason callbacks are received for old activities when the receiver is registered
            if(((SystemClock.elapsedRealtime()-(event.getElapsedRealTimeNanos()/1000000))/1000) <= 30) {
                //activity transition is legit. Do stuff here..
            }
        }
    }
}

Я обычно видел, как обратные вызовы приходят через 0-10 секунд после их появления.

...