יכול להיות שיהיה צורך לתכנן את האפליקציה כדי לזהות מתי המשתמש מתחיל או מפסיק לפעול פעילות מסוימת, כגון הליכה, רכיבה על אופניים או נהיגה. לדוגמה, אפליקציית מעקב אחר מרחקים עשויה להתחיל לעקוב אחר מיילים כשמשתמש מתחיל לנסוע, או אפליקציית ההודעות עלולה להשתיק את כל השיחות עד שהמשתמש יפסיק לנהוג.
אפשר להשתמש בממשק ה-API של מעבר לזיהוי פעילות כדי לזהות שינויים פעילות המשתמש. האפליקציה שלך רשומה למעבר בפעילויות מעניינות וה-API שולח התראות לאפליקציה רק במקרה הצורך. בדף הזה נסביר איך להשתמש ממשק API לזיהוי פעילות, שנקרא גם Transit API.
הגדרת הפרויקט
כדי להשתמש בממשק ה-API של המעבר באפליקציה שלכם, עליכם להצהיר על תלות ב
ממשק API של זיהוי המיקום והפעילות של Google בגרסה 12.0.0 ואילך וכן
ציון ההרשאה com.google.android.gms.permission.ACTIVITY_RECOGNITION
בקובץ המניפסט של האפליקציה.
- כדי להצהיר על תלות ב-API, צריך להוסיף הפניה ל-Google Maven
במאגר ולהוסיף רשומת הטמעה
com.google.android.gms:play-services-location:12.0.0
ליחסי התלות בקטע של האפליקציהbuild.gradle
. מידע נוסף זמין במאמר הגדרה Google Play Services כדי לציין את
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
שמציין את סוג הפעילות והמעבר. - קריאה חוזרת (callback) של
PendingIntent
שבה האפליקציה מקבלת התראות. למידע נוסף, ראה שימוש בהמתנה Intent.
כדי ליצור את
ActivityTransitionRequest
לאובייקט, צריך ליצור רשימה של
ActivityTransition
אובייקטים, שמייצגים את המעבר שרוצים לקבל התראות
על.
ActivityTransition
האובייקט כולל את הנתונים הבאים:
- סוג פעילות, המיוצג על ידי
DetectedActivity
בכיתה. ממשק ה-Conversion API תומך בפעילויות הבאות: - סוג מעבר של
ACTIVITY_TRANSITION_ENTER
אוACTIVITY_TRANSITION_EXIT
מידע נוסף זמין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 לזיהוי פעילות של המשתמשים, אפשר לעיין במקורות המידע הבאים חומרים:
דוגמיות
דוגמה להמחשת שיטות מומלצות לזיהוי פעילות משתמש.