コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

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");
   }
 }
}