تشخیص زمان شروع یا پایان فعالیت کاربران

ممکن است لازم باشد برنامه‌تان را طوری طراحی کنید که زمان شروع یا توقف فعالیت خاصی (مثل پیاده‌روی، دوچرخه‌سواری، یا رانندگی) را توسط کاربر شناسایی کند. برای مثال، برنامه ردیابی مسافت پیموده‌شده می‌تواند ردیابی مسافت را وقتی کاربر شروع به رانندگی می‌کند آغاز کند، یا برنامه پیام‌رسانی می‌تواند همه مکالمه‌ها را تا زمانی که کاربر رانندگی را متوقف کند بی‌صدا کند.

از Activity Recognition Transition API می‌توان برای شناسایی تغییرات در فعالیت کاربر استفاده کرد. برنامه شما در انتقال فعالیت‌های موردنظر مشترک می‌شود و API فقط درصورت نیاز به برنامه شما اطلاع می‌دهد. این صفحه نحوه استفاده از Activity Recognition Transition API (که به‌طور خلاصه Transition API نیز نامیده می‌شود) را نشان می‌دهد.

راه‌اندازی پروژه

برای استفاده از Transition API در برنامه‌تان، باید وابستگی به Google Location and Activity Recognition API نسخه ۱۲.۰.۰ یا بالاتر را اعلام کنید و اجازه com.google.android.gms.permission.ACTIVITY_RECOGNITION را در مانیفست برنامه مشخص کنید.

  1. برای اعلام وابستگی به میانای برنامه‌سازی کاربردی، مرجعی به مخزن Google maven اضافه کنید و ورودی پیاده‌سازی را به com.google.android.gms:play-services-location:12.0.0 در بخش وابستگی‌های فایل build.gradle برنامه‌تان اضافه کنید. برای اطلاعات بیشتر، راه‌اندازی خدمات Google Play را ببینید.
  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 را نشان می‌دهد:

کاتلین

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()

جاوا

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());

می‌توانید با ارسال فهرست ActivityTransitions به کلاس ActivityTransitionRequest، شیء ActivityTransitionRequest ایجاد کنید، همان‌طور که در مثال زیر نشان داده شده است:

کاتلین

val request = ActivityTransitionRequest(transitions)

جاوا

ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);

می‌توانید با ارسال نمونه ActivityTransitionRequest و شیء PendingIntent خود به روش requestActivityTransitionUpdates() ، برای به‌روزرسانی‌های انتقال فعالیت ثبت‌نام کنید. روش requestActivityTransitionUpdates() یک شیء Task برمی‌گرداند که می‌توانید آن را برای موفقیت یا شکست بررسی کنید، همان‌طور که در مثال کد زیر نشان داده شده است:

کاتلین

// 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
}

جاوا

// 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 دریافت می‌کند و وقتی کاربر به فعالیت دیگری منتقل می‌شود، شیء دیگری دریافت می‌کند.

می‌توانید با ایجاد زیرکلاس BroadcastReceiver و پیاده‌سازی روش onReceive() برای دریافت فهرست رویدادهای انتقال فعالیت، فراخوانی برگشتی‌تان را پیاده‌سازی کنید. برای اطلاعات بیشتر، به همه‌فرستی‌ها مراجعه کنید. مثال زیر نحوه پیاده‌سازی روش onReceive() را نشان می‌دهد:

کاتلین

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....
        }
    }
}

جاوا

@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() از ActivityRecognitionClient و ارسال شیء PendingIntent به‌عنوان پارامتر، همان‌طور که در مثال زیر نشان داده شده است، از به‌روزرسانی‌های انتقال فعالیت لغو ثبت‌نام کنید:

کاتلین

// 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)
}

جاوا

// 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());
        }
    }
);

منابع بیشتر

برای کسب اطلاعات بیشتر درباره استفاده از میانای برنامه‌سازی کاربردی تشخیص فعالیت کاربر، مطالب زیر را مشاهده کنید:

نمونه‌ها

نمونه برای نشان دادن روال‌های مطلوب برای تشخیص فعالیت کاربر.