Android. How to use ActivityRecognitionApi library from Google.
Case:
We need know current user activity.
Using ActivityRecognitionApi we can get if user driving, walking, running, ride bicycle.
Android get information from all the sensors and analyse it using ActivityRecognitionApi.
Below simple sample how to implement it.
Please follow the steps:
1. Create android project in Android Studio.
2. Add compile ‘com.google.android.gms:play-services-location:8.4.0’ dependency in build.gradle:
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.hrupin.activityrecognitionwithgoogle" minSdkVersion 21 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.google.android.gms:play-services-location:8.4.0' }
3. Modify AndroidManifest.xml and add
– “com.google.android.gms.permission.ACTIVITY_RECOGNITION” uses-permission
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hrupin.activityrecognitionwithgoogle"> <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <service android:name=".ActivityRecognitionService"></service> <activity android:name=".MainActivity" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
4. Add ActivityRecognitionService which will handle the results.
package com.hrupin.activityrecognitionwithgoogle; import com.google.android.gms.location.ActivityRecognitionResult; import com.google.android.gms.location.DetectedActivity; import android.app.IntentService; import android.content.Intent; import android.util.Log; public class ActivityRecognitionService extends IntentService { public static final String ACTION = "com.hrupin.activityrecognitionwithgoogle.ACTIVITY_RECOGNITION_DATA"; private String TAG = this.getClass().getSimpleName(); public ActivityRecognitionService() { super("My Activity Recognition Service"); } @Override protected void onHandleIntent(Intent intent) { if(ActivityRecognitionResult.hasResult(intent)){ ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); Log.i(TAG, getType(result.getMostProbableActivity().getType()) +"\t" + result.getMostProbableActivity().getConfidence()); Intent i = new Intent(ACTION); i.putExtra("Activity", getType(result.getMostProbableActivity().getType()) ); i.putExtra("Confidence", result.getMostProbableActivity().getConfidence()); sendBroadcast(i); } } private String getType(int type){ if(type == DetectedActivity.IN_VEHICLE) { return "In Vehicle"; }else if(type == DetectedActivity.ON_BICYCLE) { return "On Bicycle"; }else if(type == DetectedActivity.ON_FOOT) { return "On Foot"; }else if(type == DetectedActivity.RUNNING) { return "Running"; }else if(type == DetectedActivity.STILL) { return "Still"; }else if(type == DetectedActivity.TILTING) { return "Tilting"; }else if(type == DetectedActivity.UNKNOWN) { return "Unknown"; }else if(type == DetectedActivity.WALKING) { return "Walking"; }else { return "..."; } } }
6. Added Activity for visualisation.
package com.hrupin.activityrecognitionwithgoogle; import android.support.v7.app.AppCompatActivity; import java.io.File; import java.io.FileWriter; import android.app.Activity; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.text.format.Time; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks; import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; import com.google.android.gms.location.ActivityRecognition; public class MainActivity extends AppCompatActivity implements ConnectionCallbacks, OnConnectionFailedListener, OnClickListener { private static final String version = "1"; private PendingIntent pIntent; private BroadcastReceiver receiver; private TextView tvActivity; private GoogleApiClient client; private Button bSend; private Button bClear; private File tempFile; private FileWriter writer; private static String curAct; private static int curCon; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvActivity = (TextView) findViewById(R.id.tvActivity); bSend = (Button) findViewById(R.id.buttonSend); bSend.setOnClickListener(this); bClear = (Button) findViewById(R.id.buttonClear); bClear.setOnClickListener(this); int resp = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resp == ConnectionResult.SUCCESS) { client = new GoogleApiClient.Builder(this).addApi(ActivityRecognition.API).addConnectionCallbacks(this) .addOnConnectionFailedListener(this).build(); client.connect(); } else { Toast.makeText(this, "Please install Google Play Service.", Toast.LENGTH_SHORT).show(); } receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String time = getTime(); String act = intent.getStringExtra("Activity"); int con = intent.getExtras().getInt("Confidence"); Toast.makeText(MainActivity.this, time + ", A: " + act + ", C: " + con, Toast.LENGTH_SHORT).show(); if(act != null){ if(curAct == null || (!curAct.equals(act) || curCon != con)){ curAct = act; curCon = con; String v = time + ": Activity :" + act + " " + "Confidence : " + con + "\n"; v += tvActivity.getText(); tvActivity.setText(v); } } } }; IntentFilter filter = new IntentFilter(); filter.addAction(ActivityRecognitionService.ACTION); registerReceiver(receiver, filter); Toast.makeText(this, "STARTED !!!", Toast.LENGTH_LONG).show(); } @Override protected void onDestroy() { super.onDestroy(); if (client != null) { ActivityRecognition.ActivityRecognitionApi.removeActivityUpdates(client, pIntent); client.disconnect(); clear(); Toast.makeText(this, "STOPPED !!!", Toast.LENGTH_LONG).show(); } unregisterReceiver(receiver); } @Override public void onConnectionFailed(ConnectionResult arg0) { Toast.makeText(this, "Connection Failed", Toast.LENGTH_SHORT).show(); } @Override public void onConnected(Bundle arg0) { if (client != null) { Intent intent = new Intent(this, ActivityRecognitionService.class); pIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(client, 1000, pIntent); } } @Override public void onConnectionSuspended(int cause) { // TODO Auto-generated method stub } @Override public void onClick(View v) { if (v.getId() == R.id.buttonSend) { String text = null; try { text = tvActivity.getText().toString(); } catch (Exception e) { } if (text != null) { try { tempFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "report" + version + ".txt"); writer = new FileWriter(tempFile); writer.write(text); writer.close(); Toast.makeText(this, "Temporarily saved contents in " + tempFile.getPath(), Toast.LENGTH_SHORT) .show(); } catch (Exception e) { } tempFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "report" + version + ".txt"); Intent email = new Intent(Intent.ACTION_SEND); email.putExtra(android.content.Intent.EXTRA_SUBJECT, "[com.hrupin.activityrecognitionwithgoogle] version " + version); email.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + tempFile.getAbsoluteFile())); email.setType("message/rfc822"); startActivity(Intent.createChooser(email, "Send Report")); clear(); } } else if (v.getId() == R.id.buttonClear) { clear(); } } private void clear() { try { tvActivity.setText(getTime() + ":: cleared"); } catch (Exception e) { } curAct = null; curCon = 0; } private String getTime() { Time t = new Time(); t.setToNow(); return t.format2445(); } }
Full source code here:
0 Comments