上司離着席状態検知アプリ
お疲れ様です。高橋です。
上司離着席状態検知システムですが、
までは完了しました。次はアプリ化です。
アプリ化
離着席状態はPCからAWSにアップされ、AWS上のAPI(と呼ぶのはおこがましいが)をコールすると、最新の日時と状態を取得出来るようにしたので、それをただただ画像として表現するためだけの物です。
90分で実装~アイコン作成~リリースが完了しました。90分で出来るレベルなので、大したことありません。
このアプリは世界141カ国にリリースされています。141カ国のAndroidユーザが私の上長の離着席状態を知ることが出来る世界は素敵です。
作り方
アイコンは「無料 素材 シルエット 椅子」でググって来たものを使っています。既にどこから拾ってきたのかは忘れましたが、権利系は問題ないはずです。
MainActivity.java – アプリ起動時に呼び出されるコードです。
package jp.curious4dev.preab; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageButton; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageButton btn = (ImageButton) findViewById(R.id.imageButton1); btn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { getCurrentStatus(); } }); getCurrentStatus(); } public void getCurrentStatus() { Uri.Builder builder = new Uri.Builder(); AsyncHttpRequest task = new AsyncHttpRequest(this); task.execute(builder); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
AsyncHttpRequest.java – MainActivityから呼び出される、非同期http通信と画面への画像表示を担当してます。
package jp.curious4dev.preab; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.AsyncTask; import android.widget.ImageButton; import android.widget.TextView; public class AsyncHttpRequest extends AsyncTask<Uri.Builder, Void, String> { private Activity mainActivity; public AsyncHttpRequest(Activity activity) { this.mainActivity = activity; } @Override protected String doInBackground(Uri.Builder... builder) { StringBuffer sb = new StringBuffer(); try { URL url = new URL("http://curious4dev.mydns.jp/richakuseki/now4app.php"); Object content = url.getContent(); if (content instanceof InputStream) { BufferedReader bf = new BufferedReader(new InputStreamReader((InputStream) content)); String line; while ((line = bf.readLine()) != null) { sb.append(line); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } @Override protected void onPostExecute(String result) { String[] aryResult = result.split(","); String strDateTime = aryResult[0]; String strStatus = aryResult[1]; Resources r = mainActivity.getResources(); ImageButton imageButton = (ImageButton) mainActivity.findViewById(R.id.imageButton1); TextView textView1 = (TextView) mainActivity.findViewById(R.id.textView1); textView1.setText(strDateTime + " JST"); if (strStatus.equals("10") == true) { Bitmap bmp = BitmapFactory.decodeResource(r, R.drawable.presence); imageButton.setImageBitmap(bmp); } else { Bitmap bmp = BitmapFactory.decodeResource(r, R.drawable.absence); imageButton.setImageBitmap(bmp); } } }
activity_main.xml – 画面レイアウトの定義です。
<LinearLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="top" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="jp.curious4dev.preab.MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/strDateTime" /> <ImageButton android:id="@+id/imageButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="fill" android:contentDescription="TODO" android:scaleType="fitXY" android:src="@drawable/absence" tools:ignore="ContentDescription,HardcodedText" /> </LinearLayout>
AndroidManifest.xml – 設定ファイル。INTERNETのパーミッションを記載しています。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.curious4dev.preab" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
今回は面倒なので広告IDは取得してません。
残タスク
通知処理が必要かと思います。「着席したその瞬間」に相談に行けば、上司は打ち合わせから戻ってきて「さて自分の仕事をしようか」とエンジンが本格的にかかる前のタイミングなはずで、キリが良いと思われます。
課題
今回作った上司デバイスと部下デバイス間の通信可能距離は、意外に短い可能性が高い事が判明しました。上司デバイスから電波を受け取れる位置にあるPCに部下デバイスをセットして、そこからAWSにデータを飛ばす必要があります。部下デバイスからデータを取得してAWSに飛ばす箇所に、http-proxyの対応を仕込む必要があるかもしれません。
以上、よろしくお願い致します。
関連記事
-
-
街頭インタビュー 実機デバッグ結果
お疲れ様です。高橋です。 先日リリースした街頭インタビューアプリの実機デバッグ、 …
-
-
街頭インタビュー リリースしてみた
お疲れ様です。高橋です。 リリース 街頭インタビューアプリをリリースしました。 …
-
-
街頭インタビュー 実装 #2
お疲れ様です。高橋です。 本日の実装状況 街頭インタビューを構成する要素を、徹底 …
-
-
Twitter上に広がる寝坊市場について
お疲れ様です。高橋です。 遅刻の言い訳アプリ 初週DL数 2/26頃にリリースし …
-
-
選挙運動シミュレータ「衆院選2014」が迷走してきた。
お疲れ様です。高橋です。 選挙運動シミュレーションゲーム「衆院選2014」の見た …
-
-
Win7(64bit)+Unity4.5.5f1で作った物をAndroidエミュで動かしてみた
お疲れ様です。高橋です。 先ほどはcocosを使ったサンプルをエミュで動かす所ま …
-
-
選挙運動を疑似体験出来るシミュレータ「衆院選2014」を作った、が。
お疲れ様です。高橋です。 2014年11月21日に衆議院が解散され、12月2日に …
-
-
遅刻の言い訳提案システム 稼働二日目
お疲れ様です。高橋です。 遅刻の言い訳提案システムについて、先日課題として上げた …
-
-
寝坊検知&遅刻の言い訳提案システム #2
お疲れ様です。高橋です。 昨日作った遅刻の言い訳提案システムですが、Tweetの …
-
-
8bitサウンドを出すAndroidアプリをリリースしてみた。
お疲れ様です。高橋です。 先日の「Androidで8bitサウンドをモノフォニッ …