2014年6月23日月曜日

AndroidでiBeacon(1)

Beaconを貸して頂いたので、これら何回かに分けてAndroidでiBeaconを触ってみる記事を書いてみようと思います

iBeaconについては、いろいろと情報があると思いますので説明は省きます
iBeaconって何?という方は、まずGoogleなどで検索してみてください

必要なもの


BLEに対応したAndroid 4.3以上の端末
Beacon(今回はBeacon USBを利用)

Beaconの設定


最初にBeaconの設定をしておきます
設定する情報は、Proximity UUID(以降、UUIDと略),Major, Minorとありますが、どの情報を使って検出したいBeaconを判別するかによりますので、1台だけならUUIDだけでも良いかもしれませんし、1台でもMajorまで設定しておいても良いかもしれません

今回は、UUID,Major,Minorを全て設定しておきます

※今回利用するBeaconUSBに専用のアプリがまだ無いので、HPに記載されている設定マニュアルにあるとおり「BLE Utility」というアプリを使って設定します。このアプリはiOS用なのでAndroid端末しかない場合は、別途BLがで利用できる設定アプリを探してください



Androidアプリを作る


前提条件


BluetoothはONになっていることとする(ONにしたり、利用可否のチェックは省く)

参照


コードは、Androidの公式情報を基にして書いていきます
http://developer.android.com/guide/topics/connectivity/bluetooth-le.html



Permission


BLUETOOTHを利用するための権限を設定します。

<uses-permission android:name="android.permission.BLUETOOTH"/>

アプリの中でBluetoothのON/OFFなど操作を行う場合にはBLUETOOTH_ADMINの権限も必要となります BLUETOOTHの操作も行いたい場合は、以下の2つを設定してください
※あとで検証したら、BLUETOOTH_ADMINを指定しないと端末が検出できないことが判りました。BLUETOOTH_ADMINは必須のようです

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

BLEに対応した端末だけにインストールを許可したい場合には、以下のuses-featureを設定してください

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

BluetoothAdapterを取得する

BluetoothAdapterはBluetoothManagerから取得します
    private BluetoothAdapter mBluetoothAdapter;
public class MainActivity extends Activity {

    private BluetoothAdapter mBluetoothAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();
    }

}

BLE端末を検出する

BLEを検出する処理を追加します
検出は、BluetoothAdapterのstartLeScanで実行されます
検出が終了するとstartLeScanの引数で指定したコールバックのメソッドが呼び出されます

BLEの検出は何度も繰り返し行われるため、ハードウェア的に問題となるため1秒たったらスキャンを停止する(stopLeScan)ようになっています
※コールバック用のメソッドは後述
    @Override
    protected void onResume() {
        super.onResume();
        scanLeDevice(true);
    }

    private void scanLeDevice(final boolean enable) {
        if (enable) {
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }, SCAN_PERIOD);

            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
    }



BLEの検出結果を処理する


BLEの検出が終わるとstartLeScanで指定したコールバックのメソッドが呼び出されますので、その中で検出結果を解析します
今回はデバイスの名前とアドレスをログに出力してみます

    private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
            Log.d("BeaconSample", "name::" + device.getName());
            Log.d("BeaconSample", "address::" + device.getAddress());
            Log.d("BeaconSample", "------------------------------");
        }
    };

スキャンの停止


 アプリが停止しているときは、スキャンを停止するようにしましょう
    @Override
    protected void onPause() {
        super.onPause();
        scanLeDevice(false);
    }


今回はここまで。
次回は、結果からUUIDなどの情報を取得して、本当に情報を取得したい機器の詳細情報を見てみたいと思います


※もう少し詳しくコードを知りたい方は、Android SDKの中にあるsamplesに参考となるコードがありますので、そちらを参照ください
samples/android-18/legacy/BluetoothLeGatt/src/com/example/bluetooth/le

2014年5月28日水曜日

AndroidのFused Locationでの精度調査

仕事の関係で調査が必要でしたので、AndroidのFused LocationにてGPS、Wi-Fi、携帯ネットワークを使った場合に精度がどのようになるのか検証してみました

以下の条件での検証です
  • Priorityは「LocationRequest.PRIORITY_HIGH_ACCURACY」
  • permissionは「android.permission.ACCESS_FINE_LOCATION」
  • 仕事場近くの道端にて同じ場所に留まった状態で計測
  • Wi-Fiにはe-mobileのPocket Wi-Fi(GL06P)を使用
  • 携帯回線はDocomo
  • 計測は、それぞれの条件で7回(画像の2枚めの前半は重複した情報です)

GPS + Wi-Fi + 携帯ネットワーク


精度は25m~63mくらいでした

複数のプロバイダーを利用しているのでgetProviderの値が[fused]になるのかと思っていましたが、あとの携帯ネットワークだけの時も同じ値となります。そのためFused Locationの場合getProviderは常に[fused]を返すようですね




GPS + 携帯ネットワーク


次はGPS + 携帯ネットワークです
33m~50mと、最初の Wi-Fiも利用したときとあまり変わりませんね
Wi-Fiは精度に影響がなく、携帯ネットワークがあれば、そこそこ精度が出るのかもしれません




 Wi-Fi + 携帯ネットワーク

次に検証したのがWi-Fi + 携帯ネットワークです

精度は60m以上の精度で上の2つと比較すると精度は良くないですが、利用用途によっては十分に利用可能と思います





携帯ネットワークのみ


最後は携帯ネットワークのみの結果です
このデータだけ計測しながら移動しています
最初の3件目のデータまでは、その場所に留まっていたのですが、4件目は仕事場に向かって歩いています
そして、5件目のデータで仕事場のマンションの通路に入った所で精度が一気に悪くなりました
3km近い誤差が出ています
その後、仕事場の部屋に戻ると精度が33mになっているので、場所によって大きく誤差がでるようですね
誤差が大きくでた場所はGPSも反応しない場所なので、この場所で精度を出すのは現状では難しいと思われます




まとめ


以上の結果からは、Fused Locationを使った計測は精度が高いように思われます
今回の検証ではデータが少なすぎて答えは出せませんが、精度を判定して大きな誤差が出そうなデータは捨てていけば、それなりに高い精度で位置測定できそうです
しかし、状況によっては数kmの誤差もありえます

精度は良くても20mくらい。状況によっては精度がもう少し良くなるかもしれませんがピンポイントでの位置特定に利用することは出来ませんね
ピンポイントでの位置特定にはBeaconや音波などなど他の技術と組み合わせて精度を高めることで実現できるかもしれませんが、それはまた別の機会に調査してみたいと思います

以上、せっかく調査してみたのでブログに記事としてまとめてみました

2014年5月12日月曜日

Remote TestKit Webを試してみた

以前(Remote TestKitで実機の動作テスト)で紹介したRemote TestKitがブラウザだけで利用できるようになったので実際に試してみました

まず、ログインすると端末の選択画面がでてきます
専用ソフトの時とだいたいおんなじ感じですね




さっそく、無料でレンタルできる端末の中から「Samsung Galaxy S4」をレンタルしてみます
一覧の右端にある[レンタル]というボタンを押すと、確認ダイアログが表示されます
ダイアログにある[レンタル]を押すとすぐにブラウザ上に端末の動作画面がでてきます




リモート端末にアプリをインストールするには、画面右のメニューから[ファイルを選択]でapkファイルを選択して、[アプリをインストール]のボタンを実行するだけです

今回はApiDemos.apkをインストールして動かしてみました

1.9MBほどあるApiDemos.apkのインストールが完了して動作するまで20秒くらいで、思っていた以上に素早くインストールできました

ドラッグや選択などの動作はリモートなのでそこそこの遅延はあります
試しにApiDemoにあるOpenGL ESのサンプルを動かしてみましたが、少し遅いかな?と感じますが問題なく動作しました




ブラウザを使ってWebサイトを閲覧することもできるのでスマートフォン用のHTML検証にも使えそうです


試しに自分のところのホームページを表示させてみました


これまで専用ソフトをインストールして利用する必要がありましたが、これからはブラウザだけで手軽に複数端末でのテストが行えるのは非常に助かります

スマートフォンのアプリやサイトを開発をされている方はぜひチェックしてみてください!

ちなみに、iPhoneもレンタル可能です


■Remote TestKit Web Browser Version
https://webapp.appkitbox.com/

■Remote TestKit
http://appkitbox.com/testkit/

2014年4月21日月曜日

ThemeをDialogにしてDialogっぽくしたActivityで枠外をタップした際に画面を閉じるには次のような処理を追加すれば良い

@Override  
public boolean dispatchTouchEvent(MotionEvent event) {  
    Rect dialogRect = new Rect();  
    getWindow().getDecorView().getHitRect(dialogRect);  
  
    if (dialogRect.contains((int) event.getX(), (int) event.getY()) == false) {  
        finish();  
    }  
    return super.dispatchTouchEvent(event);  
}  

2014年1月20日月曜日

今日、打ちあわせの際にMS Officeのファイルを見る必要があったんだけど、Nexu7に入れてあったQuickOfficeでは遅くて表示ができないということがありました


そんな時に今回紹介するAndrOpen Officeを教えてもらったので、紹介しようと思います

AndrOpen OfficeはAndroidで利用できるOpen Officeで、パソコンで使うOpenOfficeと同じような表示になっています
Open Officeを使ったことが無い方はOffice 2003みたいな見た目と思ってください
(下に画像を載せています)

パソコンと同じような画面なので、すごくメニューとか操作するボタンが小さいです
最初は画面をタッチすることで操作しようとしていて「使い難いな」と思っていたのですが、操作メニューを出すと非常に使いやすくなりました



操作メニューは画面右下にあるディスプレイのマークを押す表示されます




今回は見るだけの利用だったので、編集とかの操作性についてはわかりませんが、表示だけならかなり良さそうです

※右クリックで表示されるメニューは画面を長押しする表示されます

利用できるのは
・文書ドキュメント
・表計算ドキュメント
・プレゼンテーション
・図形描画
・データベース
・数式
となっています

メニューバーとかのサイズが小さいのですが、これは変更することができないようです(たぶん)


設定としては出来るのは以下の3つだけです
・倍率(Default:100%)
・カスタムフォント(Default:設定なし)
・フレームレート(Default:5fps)

表示がカクカクする場合はフレームレートを上げると良いと思います

万能で安定している。と、いう訳ではないですがMS Officeを表示しないとマズイ場面になった時にでも思い出してみてください




Cover art


AndrOpen Office(andropenoffice.com)

無料

https://play.google.com/store/apps/developer?id=andropenoffice.com&hl=ja




2013年11月21日木曜日

スライドするメニューを作る

Googleのアプリでよくある画面の横端をスワイプもしくはメニューボタンを押すことで画面端から出てくるメニューをアプリに組み込んでみました

Goggleのサービスと同じようなタイプのメニューであればSupport Libraryにある「Navigation Drawer」を組み込む事で簡単に実装できます

■Android Developers Creating Navigation Drawer
http://developer.android.com/training/implementing-navigation/nav-drawer.html


Navigation Drawerを使うと、画面左端(右端にも設定できる)からスワイプすればメニューがニュッと出てきて、コンテンツの上に表示されます

これでも良いのですがNavigation Drawerはカスタマイズ可能なオプションが少なく、コードの改変なしには細かな要望に応えるのが難しいです

顧客が「Facebookのように、コンテンツの方がスライドしてメニューが下から出てくるようなメニューにしたい」といった場合には対処ができません


Facebookのようなメニュー表示


そこで利用したいのが「SlidingMenu」です
SlidingMenuはGithubにてソースコードが公開されているます

■SlidingMenu
https://github.com/jfeinstein10/SlidingMenu

使い方も非常に簡単です
使い方については上記に記載したサイトの方に記載がありますの割愛します

どんな事ができるの?
と、動きが気になる方はデモアプリがGoogle Playで公開されているので、そちらをインストールしてご覧ください

○SlidingMenu デモ
https://play.google.com/store/apps/details?id=com.slidingmenu.example


カスタマイズも色々できて、メニューを開いた時にコンテンツ部分をどの程度残して表示するかや影のつけ方など指定できます
詳細については上記に紹介したサイトをご覧いただくか、Githubよりソースコードを取得するとデモアプリのコードも入っているので、それをみても分かると思います


こういうライブラリを公開してくれている人がいるのは開発者としては非常にありがたいですよね
いつもライブラリを利用させてもらってるばかりなので、何か自分でも作って貢献しなければ!




2013年9月26日木曜日

Remote TestKitで実機の動作テスト

世の中にいったい何種類の端末があるの?ほんと困るよー
という状況のAndroidアプリ開発の現場ですが、便利なサービスも増えてきて助かりますね


今回は「Remote TestKit」というサービスを使って実機検証をしてみましたので、その使用感などを書いてみたいと思います

Remote TestKitとは?


サイトの文書をそのまま引用すると、次のように記載されています

Remote TestKitはスマートフォンの「リモート・レンタル・サービス」です。
コレだけ読むと、「端末を郵送で送ってくれて、それを使うのかな?」と思うのですが、続きがあります

増加する様々なスマートフォン端末に、インターネットを経由して「リモートアクセス」。
一般的な実機レンタルとは一線を画す、利便性の高い検証環境を実現します。

専用ソフトからインターネット経由で端末をリモートアクセスできるサービスなんですね
他にも同じようなサービスがあった気がしますが、他は使った事がないので比較する事はできませんが便利そうです!

Androidだけじゃなくて、iOS端末もあります



何ができる?

アプリをインストールして動作させることができます
その為のサービスなので、当然ですね。。。

動作中のログを見ることができます。しかしステップ実行はできません(たぶん)

操作中の画面を録画したりスクリーンショットを取ることができるので、ドキュメント作成の時にも使えそうですね

詳しくはサイトの機能一覧を見て貰うと良いと思います



費用は?


利用はチケット制になっていて、端末を30分(3チケット)から利用できます
6チケット(1時間分)で945円なので、どうしても特定の端末でテストしたいときには非常に助かります

その他にも10時間分のチケットで9,450円のPro10や50時間分のPro50などのプランもあります
費用はPayPalや請求書での支払いなどに対応しています
PayPalでさっと支払してスグに使えるのが良いです!!

詳しくはサイトのご利用料金をみてください



どんな端末が利用できるの?


2013年9月26日に確認したところ・・・たくさんあります。。。
サイトで確認してもらったほうが早いですね



どうやって利用するの?


まずは、専用ソフトをダウンロードする必要があります
動作環境は次の通りのようです

・windows XP SP2以降、Vista、7、8(32bit/64bit)
・MacOS Ⅹ(10.7、10.8)
・Port 443に直接つながることが可能なインターネット環境

まず、ソフトをインストールしてアカウントを作成します
アカウントの作成にはメールアドレスが必要です

アカウントを作ると、登録したメールアドレスに確認コードが送られてきます
その確認コードを入力しないと利用はできません


起動すると、次のように現在利用できる空き端末の一覧が表示されます
この中から、利用したい端末を選択します
無料のお試し端末があるので、まずはお試しの端末を使ってみるといいです
ただし、無料の端末を他のユーザーが利用している場合は一覧に出てきませんのでしばらく待つ必要があります


端末を選択して、[レンタル]を選択すると端末の画面が表示されます
あとは、いろいろ触ってみてください

カメラとかGPSとかは利用できるの?

利用制限があります
GPSはセキュリティの問題で利用できないようです
カメラは撮影はできますが、カバーがされているので、何も写りません
実際に試してみたら、真黒ではなくうっすら光が写ってるなーという画像が撮影できました

利用制限については、いろいろ変更もあるかもしれないので常に最新情報を!
と、いうわけでサイトを参照してください
http://appkitbox.com/support/faq#02-02

その他の情報はFAQを見ると良いと思います
http://appkitbox.com/support/faq


使ってみた感想

 いままで、顧客から●●の端末で表示が・・・などの連絡を頂いても対応が出来なかったのですが、このサービスで利用可能な端末であれば動作確認できるので重宝しそうです
(検証できる機能に限るけど)

ちょっとだけ表示確認したいのに、30分単位でしかレンタルできないのが少し不満ですね
10分(1チケット)単位で利用できると、もっと便利に使えそうです
ただ、利用後にファクトリーリセットをしてると思われるので、10分毎だと効率が悪いんでしょうね


実機検証に困っている開発者の方は、一度利用してみることをおすすめします