זיהוי מתי משתמשים מתחילים או מסיימים פעילות

יכול להיות שיהיה צורך לתכנן את האפליקציה כדי לזהות מתי המשתמש מתחיל או מפסיק לפעול פעילות מסוימת, כגון הליכה, רכיבה על אופניים או נהיגה. לדוגמה, אפליקציית מעקב אחר מרחקים עשויה להתחיל לעקוב אחר מיילים כשמשתמש מתחיל לנסוע, או אפליקציית ההודעות עלולה להשתיק את כל השיחות עד שהמשתמש יפסיק לנהוג.

אפשר להשתמש בממשק ה-API של מעבר לזיהוי פעילות כדי לזהות שינויים פעילות המשתמש. האפליקציה שלך רשומה למעבר בפעילויות מעניינות וה-API שולח התראות לאפליקציה רק במקרה הצורך. בדף הזה נסביר איך להשתמש ממשק API לזיהוי פעילות, שנקרא גם Transit API.

הגדרת הפרויקט

כדי להשתמש בממשק ה-API של המעבר באפליקציה שלכם, עליכם להצהיר על תלות ב ממשק API של זיהוי המיקום והפעילות של Google בגרסה 12.0.0 ואילך וכן ציון ההרשאה com.google.android.gms.permission.ACTIVITY_RECOGNITION בקובץ המניפסט של האפליקציה.

  1. כדי להצהיר על תלות ב-API, צריך להוסיף הפניה ל-Google Maven במאגר ולהוסיף רשומת הטמעה com.google.android.gms:play-services-location:12.0.0 ליחסי התלות בקטע של האפליקציה build.gradle. מידע נוסף זמין במאמר הגדרה Google Play Services
  2. כדי לציין את com.google.android.gms.permission.ACTIVITY_RECOGNITION הרשאה, הוספת <uses-permission> בקובץ המניפסט של האפליקציה, כמו שאפשר לראות בדוגמה הבאה:

     <manifest xmlns:android="http://schemas.android.com/apk/res/android"
             package="com.example.myapp">
    
       <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
       
     </manifest>
    

הרשמה לקבלת עדכונים לגבי מעבר בין פעילויות

כדי להתחיל לקבל התראות על מעברי פעילויות, צריך להטמיע הבאים:

כדי ליצור את ActivityTransitionRequest לאובייקט, צריך ליצור רשימה של ActivityTransition אובייקטים, שמייצגים את המעבר שרוצים לקבל התראות על. ActivityTransition האובייקט כולל את הנתונים הבאים:

הקוד הבא מראה איך ליצור רשימה של ActivityTransition אובייקטים:

Kotlin

val transitions = mutableListOf<ActivityTransition>()

transitions +=
        ActivityTransition.Builder()
          .setActivityType(DetectedActivity.IN_VEHICLE)
          .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
          .build()

transitions +=
        ActivityTransition.Builder()
          .setActivityType(DetectedActivity.IN_VEHICLE)
          .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
          .build()

transitions +=
        ActivityTransition.Builder()
          .setActivityType(DetectedActivity.WALKING)
          .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
          .build()

Java

List<ActivityTransition> transitions = new ArrayList<>();

transitions.add(
        new ActivityTransition.Builder()
          .setActivityType(DetectedActivity.IN_VEHICLE)
          .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
          .build());

transitions.add(
        new ActivityTransition.Builder()
          .setActivityType(DetectedActivity.IN_VEHICLE)
          .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
          .build());

transitions.add(
        new ActivityTransition.Builder()
          .setActivityType(DetectedActivity.WALKING)
          .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
          .build());

אפשר ליצור ActivityTransitionRequest על ידי העברת הרשימה של ActivityTransitions ActivityTransitionRequest, כמו בדוגמה הבאה:

Kotlin

val request = ActivityTransitionRequest(transitions)

Java

ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);

תוכלו להירשם לעדכונים על מעבר בין פעילויות על ידי העברת המופע של ActivityTransitionRequest והאובייקט PendingIntent, requestActivityTransitionUpdates() . ה-method requestActivityTransitionUpdates() מחזירה Task כדי לבדוק אם הצלחת או נכשלה, כפי שמוצג בקוד הבא דוגמה:

Kotlin

// myPendingIntent is the instance of PendingIntent where the app receives callbacks.
val task = ActivityRecognition.getClient(context)
        .requestActivityTransitionUpdates(request, myPendingIntent)

task.addOnSuccessListener {
    // Handle success
}

task.addOnFailureListener { e: Exception ->
    // Handle error
}

Java

// myPendingIntent is the instance of PendingIntent where the app receives callbacks.
Task<Void> task = ActivityRecognition.getClient(context)
          .requestActivityTransitionUpdates(request, myPendingIntent);

task.addOnSuccessListener(
    new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void result) {
            // Handle success
        }
    }
);

task.addOnFailureListener(
    new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {
            // Handle error
        }
    }
);

לאחר שתירשם בהצלחה לעדכונים על מעבר בין פעילויות, האפליקציה מקבל התראות בחשבון PendingIntent הרשום.

אירועי מעבר של פעילות בתהליך

כשמתרחש מעבר הפעילות המבוקש, האפליקציה מקבלת קריאה חוזרת של Intent. ActivityTransitionResult ניתן לחלץ את האובייקט מהקובץ Intent, שכולל רשימה של ActivityTransitionEvent אובייקטים. האירועים מסודרים בסדר כרונולוגי, לדוגמה, אם אפליקציה בקשות IN_VEHICLE בסוג הפעילות ACTIVITY_TRANSITION_ENTER וגם ACTIVITY_TRANSITION_EXIT עובר, ואז הוא מקבל אובייקט ActivityTransitionEvent כשהמשתמש מתחיל לנסוע, ועוד תנועה כאשר המשתמש עובר לפעילות אחרת כלשהי.

כדי לקבל את הרשימה, אפשר להטמיע את הקריאה החוזרת (callback) על ידי יצירת מחלקה משנית של BroadcastReceiver והטמעת השיטה onReceive() של אירועי מעבר בין פעילות. מידע נוסף זמין במאמר הבא: שידורים. הדוגמה הבאה ממחישה איך כדי להטמיע את השיטה onReceive():

Kotlin

override fun onReceive(context: Context, intent: Intent) {
    if (ActivityTransitionResult.hasResult(intent)) {
        val result = ActivityTransitionResult.extractResult(intent)!!
        for (event in result.transitionEvents) {
            // chronological sequence of events....
        }
    }
}

Java

@Override
public void onReceive(Context context, Intent intent) {
    if (ActivityTransitionResult.hasResult(intent)) {
        ActivityTransitionResult result = ActivityTransitionResult.extractResult(intent);
        for (ActivityTransitionEvent event : result.getTransitionEvents()) {
            // chronological sequence of events....
        }
    }
}

ביטול הרישום לקבלת עדכונים על מעבר בין פעילויות

אפשר לבטל את ההרשמה לקבלת עדכונים לגבי מעבר בין פעילויות על ידי קריאה removeActivityTransitionUpdates() ה-method של ActivityRecognitionClient ולהעביר את האובייקט PendingIntent כפרמטר, שמוצגת בדוגמה הבאה:

Kotlin

// myPendingIntent is the instance of PendingIntent where the app receives callbacks.
val task = ActivityRecognition.getClient(context)
        .removeActivityTransitionUpdates(myPendingIntent)

task.addOnSuccessListener {
    myPendingIntent.cancel()
}

task.addOnFailureListener { e: Exception ->
    Log.e("MYCOMPONENT", e.message)
}

Java

// myPendingIntent is the instance of PendingIntent where the app receives callbacks.
Task<Void> task = ActivityRecognition.getClient(context)
        .removeActivityTransitionUpdates(myPendingIntent);

task.addOnSuccessListener(
    new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void result) {
            myPendingIntent.cancel();
        }
    }
);

task.addOnFailureListener(
    new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {
            Log.e("MYCOMPONENT", e.getMessage());
        }
    }
);

מקורות מידע נוספים

למידע נוסף על השימוש ב-API לזיהוי פעילות של המשתמשים, אפשר לעיין במקורות המידע הבאים חומרים:

דוגמיות

דוגמה להמחשת שיטות מומלצות לזיהוי פעילות משתמש.