BitmapキャッチャVer1.1をリリースしました
SmartWatch用のアプリを初リリースしました。Bitmapキャッチャというアプリです。どんなアプリかと言いますと、単体では特に何もしないアプリです。
それでは、何ができるかと言いますと、Bitmap画像がBitmapキャッチャに向けてBroadcast送信されたならば、それを受け取ってSmartWatchの画面に表示します。これがメイン機能です。もう少し機能を持たせているので、以下に機能を書きます。
- Bitmap画像を受け取って、SmartWatchの画面に表示する。
- Vibrator命令を受け取って、SmartWatchを振動させる。
- SmartWatch画面へのタッチ情報を、Broadcast送信する。
- SmartWatch画面でのスィープ情報を、Broadcast送信する。
この4つが主な機能です。
これができることにより何がどうなるかというと、Bitmapキャッチャを起動しておけば、従来のAndroidアプリからSmartWatchの画面を書き換えたり、振動させたり、画面タッチの情報を読み取ったり出来るようになります。
GooglePlayでのダウンロードはこちらから。
まぁ、何故このアプリを作ろうと思ったかと言うと、1つはSmartWatchをロボット制御の受信器として使えないかと考えたときに、このような仕様のSmartWatchアプリを動かしておいて、Andrid側から制御することができるかなと考えたのが1つと、SmartWatchにこのようなアプリを作れば、LuaridaにSmartWatch用コマンドを用意するだけで、スクリプトでSmartWatchプログラムが作れると考えたからです。
それでは、簡単にプログラムを説明します。
Bitmap画像の受け取り
基本的にBitmapキャッチャは、Bitmap画像のBroadcast送信を待って、無限ループしています。そして、Bitmap画像のBroadcatst送信を待つために、receiver の intent-filterに以下を追加しています。
<!-- Bitmap intents --> <action android:name="com.luaridaworks.extras.BITMAP_SEND" />
そして、拡張データの名前は下記のように付けています。
- BITMAP :Bitmapデータのbyte配列をセットします。
- OFFSETX :画像表示位置のX座標オフセット値です。
- OFFSETY :画像表示位置のY座標オフセット値です。
この情報を受け取ってBitmap画像を画面に表示します。オフセットデータが無い場合は、オフセット無しの絵を表示します。
他アプリからBitmap画像の送信方法
他アプリからBitmapキャッチャに向けて画像を送信するには、下記のようにします。これは1例です。リソースにあるPictureという画像をSmartWatchの画面(50,60)の座標位置から描画するように指定しています。
Resources r = getResources(); Bitmap bitmap = BitmapFactory.decodeResource(r, R.drawable.Picture); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.PNG, 100, baos); byte[] bytebmp = baos.toByteArray(); Intent intent = new Intent("com.luaridaworks.extras.BITMAP_SEND"); intent.putExtra("BITMAP", bytebmp); intent.putExtra("OFFSETX", 50); intent.putExtra("OFFSETY", 60); sendBroadcast(intent);
Vibrator命令の受け取り
Vibrator命令の受信もBitmap画像受信と同様に、無限ループしてBroadcatst送信を待っているだけです。receiver の intent-filterに以下を追加しています。
<!-- Vibrator intents --> <action android:name="com.luaridaworks.extras.VIBRATOR_SEND" />
そして、拡張データの名前は下記のように付けています。
- ONTIME:振動している時間をミリ秒単位でセットします。
- OFFTIME:振動を止める時間をミリ秒単位でセットします。
- REPAET:振動の繰り返し回数をセットします。
この情報を受け取ってSmartWatchを振動させます。振動を止めたいときは、intent.putExtra("REPEAT", 0)としてBroadcast送信します。
また、ONTIMEのみを送信すれば、指定時間だけ振動します。
他アプリからVibrator命令の送信方法
他アプリからBitmapキャッチャに向けてVibrator命令を送信するには、下記のようにします。これは1例です。画面タッチしたときに、60秒振動するようにVibrator命令を送信し、指が離れると繰り替えし 0 を送信して、振動を停止させています。
@Override public boolean onTouchEvent(MotionEvent event){ if(touchFlag==false && event.getAction()!=1){ touchFlag = true; //振動開始 Intent intent = new Intent("com.luaridaworks.extras.VIBRATOR_SEND"); intent.putExtra("ONTIME",60000); sendBroadcast(intent); } else if(touchFlag==true && event.getAction()==1){ touchFlag = false; //振動停止 Intent intent = new Intent("com.luaridaworks.extras.VIBRATOR_SEND"); intent.putExtra("REPEAT", 0); sendBroadcast(intent); } return true; }
画面タッチ情報のBroadcast送信
SmartWatchへの画面タッチ動作が行われたときに、その情報をBroadcast送信します。
Bitmapキャッチャのタッチ情報送信プログラムは下記です。
@Override public void onTouch(final ControlTouchEvent event) { Intent intent = new Intent("com.luaridaworks.extras.TOUCH_SEND"); intent.putExtra("ACTION",event.getAction()); intent.putExtra("TOUCHX",event.getX()); intent.putExtra("TOUCHY",event.getY()); prContext.sendBroadcast(intent); }
下記の拡張データ名が付いてそれぞれのデータが送信されます。
- ACTION :画面タッチ状態です。従来のgetAction()と同じデータです。
- TOUCHX :画面タッチしたときのX座標です。
- TOUCHY :画面タッチしたときのY座標です。
他アプリでのタッチ情報の受信方法
Broadcastを受信するために、Manifestにreceiver を追記してください。intent-filterは下記です。以下では、タッチとスィープの両方をreceiver に追記しています。
<receiver android:name=".TSReceiver"> <intent-filter> <!-- Touch intents --> <action android:name="com.luaridaworks.extras.TOUCH_SEND" /> <action android:name="com.luaridaworks.extras.SWIPE_SEND" /> </intent-filter> </receiver>
受信するために、BroadcastReceiverを継承したクラスを生成します。下記は1例です。
public class TSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals("com.luaridaworks.extras.TOUCH_SEND")){ try{ int action = (Integer) intent.getSerializableExtra("ACTION"); int x = (Integer) intent.getSerializableExtra("TOUCHX"); int y = (Integer) intent.getSerializableExtra("TOUCHY"); } catch(Exception e){ } } } }
画面スィープ情報のBroadcast送信
SmartWatchへの画面スィープ動作が行われたときに、その情報をBroadcast送信します。
Bitmapキャプチャのスィープ情報送信プログラムは下記です。
@Override public void onSwipe(int direction) { Intent intent = new Intent("com.luaridaworks.extras.SWIPE_SEND"); intent.putExtra("DIRECTION",direction); prContext.sendBroadcast(intent); }
DIRECTIONという拡張データ名が付いて送信されます。DIRECTIONの値とスィープ方向の関係は下記です。
- 0 :上方向(UP)スィープ
- 1 :下方向(DOWN)スィープ
- 2 :左方向(LEFT)スィープ
- 3 :右方向(RIGHT)スィープ
他アプリでのスィープ情報の受信方法
Broadcastを受信するために、Manifestにreceiver を追記してください。タッチ受信のときの追記内容と同じです。
スィープ情報を受信するために、BroadcastReceiverを継承したクラスを生成します。下記は1例です。この例だとプログラム的に意味が有りません(^^;。
public class TSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals("com.luaridaworks.extras.SWIPE_SEND")){ int direction = (Integer) intent.getSerializableExtra("DIRECTION"); } } }