ممکن است لازم باشد برنامهتان را طوری طراحی کنید که زمان شروع یا توقف فعالیت خاصی (مثل پیادهروی، دوچرخهسواری، یا رانندگی) را توسط کاربر شناسایی کند. برای مثال، برنامه ردیابی مسافت پیمودهشده میتواند ردیابی مسافت را وقتی کاربر شروع به رانندگی میکند آغاز کند، یا برنامه پیامرسانی میتواند همه مکالمهها را تا زمانی که کاربر رانندگی را متوقف کند بیصدا کند.
از 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 را
در مانیفست برنامه مشخص کنید.
- برای اعلام وابستگی به میانای برنامهسازی کاربردی، مرجعی به مخزن Google maven اضافه کنید و ورودی پیادهسازی را به
com.google.android.gms:play-services-location:12.0.0در بخش وابستگیهای فایلbuild.gradleبرنامهتان اضافه کنید. برای اطلاعات بیشتر، راهاندازی خدمات Google Play را ببینید. برای مشخص کردن اجازه
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شیء که نوع فعالیت و انتقال را مشخص میکند. - یک
PendingIntentفراخوانی که در آن برنامهتان اعلانها را دریافت میکند. برای اطلاعات بیشتر، استفاده از قصد معوق را ببینید.
برای ایجاد شیء
ActivityTransitionRequest
، باید فهرستی از اشیاء
ActivityTransition
ایجاد کنید که نشاندهنده انتقالی است که میخواهید درباره آن اعلان دریافت کنید. یک
ActivityTransition
شیء شامل دادههای زیر است:
- نوع فعالیت، که با کلاس
DetectedActivityنشان داده میشود. Transition API از فعالیتهای زیر پشتیبانی میکند: - نوع گذار
ACTIVITY_TRANSITION_ENTERیاACTIVITY_TRANSITION_EXIT. برای اطلاعات بیشتر، به کلاس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()); } } );
منابع بیشتر
برای کسب اطلاعات بیشتر درباره استفاده از میانای برنامهسازی کاربردی تشخیص فعالیت کاربر، مطالب زیر را مشاهده کنید:
نمونهها
نمونه برای نشان دادن روالهای مطلوب برای تشخیص فعالیت کاربر.