تشخیص فعالیت فیزیکی کاربر با استفاده از Activity Recognition
ساخت اپلیکیشن هایی که از محتوا و فعالیت های انجام شده از سوی کاربر آگاهی دارند یکی از بهترین راه ها برای ارائه سرویس های کاربردی به کاربران است، چندین راه برای انجام این کار در اختیار است که به عنوان نمونه می توان به استفاده از سرویس های موقعیت یاب اشاره کرد. در این مطلب آموزشی تمرکز ما بر روی استفاده از سرویس Activity Recognition گوگل پلی نهاده شده که به کمک آن می توانید تشخیص دهید کاربر در حال حاضر در حال انجام چه فعالیتی است، آیا در حال دویدن است، راه می رود، در اتومبیل است، درحال دوچرخه سواری است و یا ایستاده است.
اطلاع از فعالیت های کاربر شما را قادر به ارتقا و بهبود تجربه کاربری اپلیکیشن می گرداند، چنانچه متوجه شوید که کاربر تمرینات ورزشی خود را آغاز نموده می توانید با کمک Google Fit فعالیت های جسمانی او را تحت کنترل قرار دهید و یا چنانچه متوجه شوید که کاربر در حال رانندگی است، از نمایش نوتیفیکیشن به او اجتناب می ورزید. کدهای منبع این مطلب آموزشی در GitHub قرار داده شده و در صورت تمایل می توانید آن را دانلود کنید.
1. راه اندازی پروژه
نخستین گام برای شروع کار، ایجاد یک اپلیکیشن اندروید جدید می باشد. در این اپلیکیشن نمونه مینیموم SDK با مقدار 14 ست شده و یک اکتیویتی خالی ساخته شده است. اندروید استودیو اپلیکیشن پایه را تولید می نماید و باید فایل build.gradle را باز کرده و Play Services را در زیر گره dependencies بیفزایید.
compile 'com.google.android.gms:play-services:8.4.0'
پس از این مرحله یک کلاس جدید با نام ActivityRecognizedSevice ایجاد کنید و آن را از IntentService اکستند نمایید. زمانی که گوگل پلی سرویس فعالیت کنونی کاربر را ارسال کرد، این مقدار به IntentService باز گردانده می شود و بدین ترتیب قادر به اجرای منطق اپلیکیشن در پس زمینه می گردید.
public class ActivityRecognizedService extends IntentService {
public ActivityRecognizedService() {
super("ActivityRecognizedService");
}
public ActivityRecognizedService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
}
}
جهت اتمام مراحل راه اندازی، فایل AndroidManifest.xml را باز کنید، در این مرحله باید ActivityRecognizedService را تعریف کرده و مجوز com.google.android.gms.permission.ACTIVITY_RECOGNISION را به اپلیکیشن اعطا کنید.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tutsplus.activityrecognition">
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".ActivityRecognizedService" />
</application>
</manifest>
با اقدامات مذکور زیرساخت پایه برای اپلیکیشن تکمیل شده است و می توانید به مرحله برقراری ارتباط با گوگل پلی سرویس رفته و داده های مرتبط با فعالیت موردنظر را درخواست کنید.
2. درخواست Activity Recognition
جهت استفاده از گوگل پلی سرویس باید به آن متصل شوید، برای این منظور MainActivity.java را باز کرده و به اجرای رابط های ConnectionCallbacks و OnConnectionFailedListener بپردازید. لازم است یک متغیر عضو از نوع GoogleApiClient ساخته و یک رفرنس به کلاینت API را نگه دارید.
public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
public GoogleApiClient mApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onConnected(@Nullable Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
پس از جایگذاری رابط های موردنیاز برای GoogleApiClient شما قادر به ساخت کلاینت و اتصال به گوگل پلی سرویس خواهید بود، برای این کار از ()onCreate و درخواست ActivityRecognition.API و تخصیص لیسنرها با نمونه GoogleApiClient نیاز دارید.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mApiClient = new GoogleApiClient.Builder(this)
.addApi(ActivityRecognition.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mApiClient.connect();
}
زمانی که نمونه GoogleApiClient متصل شد، متد ()onConnected فراخوانی می شود. با این کار شما باید یک PendingIntent بسازید که به IntentService که قبلا ساخته شده مراجعه کرده و مقدار را برای ActivityRecognitionApi ارسال کند. مشخص کردن یک بازه زمانی برای چک کردن فعالیت های کاربر از سوی API نیز لازم است. برای این اپلیکیشن نمونه مقدار 3000 یا همان 3 ثانیه تعیین شده است، اما در یک اپلیکیشن واقعی این مقدار کمتر خواهد بود، چرا که در غیر این صورت انرژی زیادی مصرف می شود.
@Override
public void onConnected(@Nullable Bundle bundle) {
Intent intent = new Intent( this, ActivityRecognizedService.class );
PendingIntent pendingIntent = PendingIntent.getService( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT );
ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates( mApiClient, 3000, pendingIntent );
}
در این مرحله اپلیکیشن سعی در تشخیص فعالیت کاربر در کمتر از 3 ثانیه می کند و داده های دریافتی را به ActivityRecognitionService ارسال می نماید.
3. مدیریت Activity Recognition
در متد ()onHandleIntent از ActivityRecognisionService نخستین کار اعتبارسنجی Intent دریافت شده است، باید اطمینان حاصل کنید که این Intent دربرگیرنده داده های موردنظر برای تشخیص فعالیت است. در صورت تایید باید ActivityRecognitionResult را از Intent خارج کرده و از فعالیت هایی که کاربر در حال انجام آنهاست اطلاع پیدا کنید. با فراخوانی ()getProbableActivities در آبجکت ActivityRecognitionResult می توانید یک لیست از فعالیت های ممکن را بازیابی نمایید.
@Override
protected void onHandleIntent(Intent intent) {
if(ActivityRecognitionResult.hasResult(intent)) {
ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
handleDetectedActivities( result.getProbableActivities() );
}
}
برای این اپلیکیشن نمونه تمامی فعالیت های تشخیص داده شده به نمایش در می آیند و با فراخوانی ()getConfidence بر روی نمونه DeletedActivity قادر به دریافت میزان اطمینان گوگل پلی سرویس از فعالیت مورد نظر می گردید. چنانچه درصد نمایش داده شده 75 و یا بیشتر باشد، تقریبا از این بابت که کاربر در حال انجام آن فعالیت است اطمینان خواهید داشت.
private void handleDetectedActivities(List<DetectedActivity> probableActivities) {
for( DetectedActivity activity : probableActivities ) {
switch( activity.getType() ) {
case DetectedActivity.IN_VEHICLE: {
Log.e( "ActivityRecogition", "In Vehicle: " + activity.getConfidence() );
break;
}
case DetectedActivity.ON_BICYCLE: {
Log.e( "ActivityRecogition", "On Bicycle: " + activity.getConfidence() );
break;
}
case DetectedActivity.ON_FOOT: {
Log.e( "ActivityRecogition", "On Foot: " + activity.getConfidence() );
break;
}
case DetectedActivity.RUNNING: {
Log.e( "ActivityRecogition", "Running: " + activity.getConfidence() );
break;
}
case DetectedActivity.STILL: {
Log.e( "ActivityRecogition", "Still: " + activity.getConfidence() );
break;
}
case DetectedActivity.TILTING: {
Log.e( "ActivityRecogition", "Tilting: " + activity.getConfidence() );
break;
}
case DetectedActivity.WALKING: {
Log.e( "ActivityRecogition", "Walking: " + activity.getConfidence() );
if( activity.getConfidence() >= 75 ) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentText( "Are you walking?" );
builder.setSmallIcon( R.mipmap.ic_launcher );
builder.setContentTitle( getString( R.string.app_name ) );
NotificationManagerCompat.from(this).notify(0, builder.build());
}
break;
}
case DetectedActivity.UNKNOWN: {
Log.e( "ActivityRecogition", "Unknown: " + activity.getConfidence() );
break;
}
}
}
}
با اجرای اپلیکیشن می توانید بدوید و سپس گوشی را به کامپیوتر متصل کنید، در این شرایط باید قادر به مشاهده کنسول توسعه مشابهی باشید.
E/ActivityRecogition: On Foot: 92
E/ActivityRecogition: Running: 87
E/ActivityRecogition: On Bicycle: 8
E/ActivityRecogition: Walking: 5
در صورت قدم زدن یک نوتیفیکیشن دریافت خواهید کرد که از شما می پرسد آیا در حال قدم زدن هستید یا خیر. چنانچه یک اپلیکیشن برای تمرینات ورزشی داشته باشید، ارائه امکانی به کاربر در جهت پیگیری تمرینات ورزشی گزینه خوبی خواهد بود.
جمع بندی
به لطف گوگل پلی سرویس به راحتی قادر به تشخیص فعالیت کنونی کاربر می باشید، بدین ترتیب می توانید اقدام به ساخت اپلیکیشن های بسیار کاربردی برای کاربران خود نمایید، تنها کار لازم افزودن چندین خط کد به اپلیکیشن و هوشمند نمودن آن می باشد.