diff --git a/AndroidApp/app/build.gradle b/AndroidApp/app/build.gradle index 60081df..ee2f056 100644 --- a/AndroidApp/app/build.gradle +++ b/AndroidApp/app/build.gradle @@ -1,15 +1,18 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion "25.0.3" + compileSdkVersion 28 + buildToolsVersion "30.0.3" defaultConfig { applicationId "io.github.introml.activityrecognition" minSdkVersion 21 - targetSdkVersion 25 + targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + ndk { + abiFilters "armeabi-v7a" + } } buildTypes { release { @@ -25,11 +28,11 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + implementation fileTree(dir: 'libs', include: ['*.jar']) + androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:25.3.1' - compile 'com.android.support.constraint:constraint-layout:1.0.2' - testCompile 'junit:junit:4.12' + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + testImplementation 'junit:junit:4.12' } diff --git a/AndroidApp/app/src/main/java/io/github/introml/activityrecognition/MainActivity.java b/AndroidApp/app/src/main/java/io/github/introml/activityrecognition/MainActivity.java index 159ea6d..8e4a799 100644 --- a/AndroidApp/app/src/main/java/io/github/introml/activityrecognition/MainActivity.java +++ b/AndroidApp/app/src/main/java/io/github/introml/activityrecognition/MainActivity.java @@ -34,7 +34,7 @@ public class MainActivity extends AppCompatActivity implements SensorEventListen private float[] results; private TensorFlowClassifier classifier; - private String[] labels = {"Downstairs", "Jogging", "Sitting", "Standing", "Upstairs", "Walking"}; + private final String[] labels = {"Downstairs", "Jogging", "Sitting", "Standing", "Upstairs", "Walking"}; @Override protected void onCreate(Bundle savedInstanceState) { @@ -44,12 +44,12 @@ protected void onCreate(Bundle savedInstanceState) { y = new ArrayList<>(); z = new ArrayList<>(); - downstairsTextView = (TextView) findViewById(R.id.downstairs_prob); - joggingTextView = (TextView) findViewById(R.id.jogging_prob); - sittingTextView = (TextView) findViewById(R.id.sitting_prob); - standingTextView = (TextView) findViewById(R.id.standing_prob); - upstairsTextView = (TextView) findViewById(R.id.upstairs_prob); - walkingTextView = (TextView) findViewById(R.id.walking_prob); + downstairsTextView = findViewById(R.id.downstairs_prob); + joggingTextView = findViewById(R.id.jogging_prob); + sittingTextView = findViewById(R.id.sitting_prob); + standingTextView = findViewById(R.id.standing_prob); + upstairsTextView = findViewById(R.id.upstairs_prob); + walkingTextView = findViewById(R.id.walking_prob); classifier = new TensorFlowClassifier(getApplicationContext()); @@ -112,12 +112,12 @@ private void activityPrediction() { results = classifier.predictProbabilities(toFloatArray(data)); - downstairsTextView.setText(Float.toString(round(results[0], 2))); - joggingTextView.setText(Float.toString(round(results[1], 2))); - sittingTextView.setText(Float.toString(round(results[2], 2))); - standingTextView.setText(Float.toString(round(results[3], 2))); - upstairsTextView.setText(Float.toString(round(results[4], 2))); - walkingTextView.setText(Float.toString(round(results[5], 2))); + downstairsTextView.setText(Float.toString(round(results[0]))); + joggingTextView.setText(Float.toString(round(results[1]))); + sittingTextView.setText(Float.toString(round(results[2]))); + standingTextView.setText(Float.toString(round(results[3]))); + upstairsTextView.setText(Float.toString(round(results[4]))); + walkingTextView.setText(Float.toString(round(results[5]))); x.clear(); y.clear(); @@ -135,9 +135,9 @@ private float[] toFloatArray(List list) { return array; } - private static float round(float d, int decimalPlace) { + private static float round(float d) { BigDecimal bd = new BigDecimal(Float.toString(d)); - bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP); + bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP); return bd.floatValue(); } diff --git a/AndroidApp/app/src/main/java/io/github/introml/activityrecognition/TensorFlowClassifier.java b/AndroidApp/app/src/main/java/io/github/introml/activityrecognition/TensorFlowClassifier.java index de8a315..0ff16ff 100644 --- a/AndroidApp/app/src/main/java/io/github/introml/activityrecognition/TensorFlowClassifier.java +++ b/AndroidApp/app/src/main/java/io/github/introml/activityrecognition/TensorFlowClassifier.java @@ -10,9 +10,9 @@ public class TensorFlowClassifier { System.loadLibrary("tensorflow_inference"); } - private TensorFlowInferenceInterface inferenceInterface; + private final TensorFlowInferenceInterface inferenceInterface; private static final String MODEL_FILE = "file:///android_asset/frozen_model.pb"; -// private static final String MODEL_FILE = "file:///android_asset/frozen_har.pb"; + // private static final String MODEL_FILE = "file:///android_asset/frozen_har.pb"; private static final String INPUT_NODE = "inputs"; private static final String[] OUTPUT_NODES = {"y_"}; private static final String OUTPUT_NODE = "y_"; diff --git a/AndroidApp/app/src/main/res/layout/activity_main.xml b/AndroidApp/app/src/main/res/layout/activity_main.xml index 2d771d8..fa32dbc 100644 --- a/AndroidApp/app/src/main/res/layout/activity_main.xml +++ b/AndroidApp/app/src/main/res/layout/activity_main.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - Read the book here + + + +--- + +### My Environments (2021) + +- Android SDK Platform 28 (Android 9.0 Pie) +- Android SDK Build-Tools 30.0.3 (Higher version Supports lower version) +- a Android *Phone* with Android 10 OS (Support lower SDK built apps I guess) + + + +**It works fine on my phone!** + +image-20210114132032334 + +### Changes Should be Made to Run Locally + +- `gradle-wrapper.properties` + - To fit your own `gradle` version. + - BTW, my written version works fine, you can let it run. +- `build.gradle` + - Top-level + - Change to your local **repositories**, I used `aliyun` +- `build.gradle` + - App-level + - `compileSdkVersion` + - `buildToolsVersion` + - `targetSdkVersion` + diff --git a/assets/image-20210114132032334.png b/assets/image-20210114132032334.png new file mode 100644 index 0000000..9dc19af Binary files /dev/null and b/assets/image-20210114132032334.png differ