Blog - 最新エントリー
Androidは、殆どの機種でBluetoothが搭載され、ヘッドセットやキーボードなどの無線接続に利用されています。
ただ、余り文献が無いという事で、調べた事をメモ的に記載します。
(基本的に2.1以降を対象とします)
【Android内で抽象化されたBluetoothのクラス】
BluetoothAdapter・・・ハードその物を表します。
BluetoothDevice・・・リモートのデバイスを表します、いわゆる相手。
BluetoothSocket・・・相手との通信にStreamを利用する場合のソケット。
BluetoothServerSocket・・・リクエストを待ち受けしているサーバソケット
BluetoothClass・・・Bluetoothのプロパティセット(読み込み専用)
大きくはこんな所、ここでちょっと解りににくいポイントのまとめ
・サーバは待ち受けるリスナー。
・クライアントは、サーバへ接続に来る。
・接続には一般的にSocketを利用する。
【パーミッション】
Bluetoothを利用するには
BLUETOOTH
BLUETOOTH_ADMIN
が必要になる。
【発見機能】
通常、BluetoothはON/OFFですが最近ではむやみに発見されない様に
発見させるかさせないかのON/OFFが機能として実装されています。
【デバイスの接続】
サーバサイドとクライアントサイドの両方の機構で実装が必要になる。
(まあ当然ですが)
同一の RFCOMM チャネル上で、それぞれが接続済みの BluetoothSocket
を受け取ったときに接続されたとみなされます。
ポイント
・ペアリングされたデバイスの場合はこの限りではない
・ペアリングされていないデバイスは検索してBluetoothDeviceを得る必要がある
(そのMACアドレス)
【設計のポイント】
2つの端末で通信をする場合に、どちらかがサーバで一方がクライアントの動きをする
と言う感じになる、先にサーバでSocketを獲得した方がサーバとして振る舞い接続を確立する。
サーチ
発見
BluetoothDeviceを獲得
Sockeを要求、取得
通信開始
と同時に
発見可能へ
サーバソケットリスニング開始(accept())
接続要求受領
Socketを提供
*サーバソケットリスニング停止(破棄)
通信開始
通信終了
発見可能へ
サーバソケットリスニング開始
とこうなる訳ですが、重要なのは※の部分
サーバソケットを停止(破棄していますが)RFCOMMでは同時通信はありません(チャネルあたりひとつ)ですので
接続を待つ必要性がなくなります。よって高負荷の処理は破棄します。
破棄してもSocketは破棄されない為、通信は可能です。
また、acceptはブロックされた呼び出しである為、AndroidのUI(シングル)では高負荷ですのでActivityのUIで
実行するのは現実的ではありません、別スレッドで処理します。
その2へ続く
ただ、余り文献が無いという事で、調べた事をメモ的に記載します。
(基本的に2.1以降を対象とします)
【Android内で抽象化されたBluetoothのクラス】
BluetoothAdapter・・・ハードその物を表します。
BluetoothDevice・・・リモートのデバイスを表します、いわゆる相手。
BluetoothSocket・・・相手との通信にStreamを利用する場合のソケット。
BluetoothServerSocket・・・リクエストを待ち受けしているサーバソケット
BluetoothClass・・・Bluetoothのプロパティセット(読み込み専用)
大きくはこんな所、ここでちょっと解りににくいポイントのまとめ
・サーバは待ち受けるリスナー。
・クライアントは、サーバへ接続に来る。
・接続には一般的にSocketを利用する。
【パーミッション】
Bluetoothを利用するには
BLUETOOTH
BLUETOOTH_ADMIN
が必要になる。
【発見機能】
通常、BluetoothはON/OFFですが最近ではむやみに発見されない様に
発見させるかさせないかのON/OFFが機能として実装されています。
【デバイスの接続】
サーバサイドとクライアントサイドの両方の機構で実装が必要になる。
(まあ当然ですが)
同一の RFCOMM チャネル上で、それぞれが接続済みの BluetoothSocket
を受け取ったときに接続されたとみなされます。
ポイント
・ペアリングされたデバイスの場合はこの限りではない
・ペアリングされていないデバイスは検索してBluetoothDeviceを得る必要がある
(そのMACアドレス)
【設計のポイント】
2つの端末で通信をする場合に、どちらかがサーバで一方がクライアントの動きをする
と言う感じになる、先にサーバでSocketを獲得した方がサーバとして振る舞い接続を確立する。
サーチ
発見
BluetoothDeviceを獲得
Sockeを要求、取得
通信開始
と同時に
発見可能へ
サーバソケットリスニング開始(accept())
接続要求受領
Socketを提供
*サーバソケットリスニング停止(破棄)
通信開始
通信終了
発見可能へ
サーバソケットリスニング開始
とこうなる訳ですが、重要なのは※の部分
サーバソケットを停止(破棄していますが)RFCOMMでは同時通信はありません(チャネルあたりひとつ)ですので
接続を待つ必要性がなくなります。よって高負荷の処理は破棄します。
破棄してもSocketは破棄されない為、通信は可能です。
また、acceptはブロックされた呼び出しである為、AndroidのUI(シングル)では高負荷ですのでActivityのUIで
実行するのは現実的ではありません、別スレッドで処理します。
その2へ続く
Androidの開発をやっていると、Viewの更新をぐりぐりやる処理を作ったりする。
WidgetのImageViewに対してServiceからRemoteViewを経由して
setImageViewBitmapを更新する処理の開発を行っている時にどうもカクカク(処理遅延の様な)したり更新されなかったりする時が有る。
そんな時LOGには
!!! FAILED BINDER TRANSACTION !!!
が連発している事が多いですが、その原因と対処法について
原因は、RemoteViewのsetImageViewBitmapを呼び出すと引数のBitmapを
シリアル化して渡す、その時のメモリが累積してIPCの許容を超えると発生します。
1.RemoteViewをService内で使いまわしている
2.大きな画像をBitmapに指定している
対処法として
1の場合は、
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.レイアウトID);
といったように毎回定義しなおすと回避できる。
2の場合は、
Bitmapのサイズを小さくするもしくは、Bitmap.Config.RGB_565を指定する
アルファチャネルが使えないのが痛いが、背景ならなんとか。
参考までに、2*2のサイズのPNGは大丈夫でした。
また、Eclipseのデバッグ(実機)などで何をしても発生する場合、実機のAPKを一度アンインストールすると直る事が有ります。
(自分はこれにハマりました)
WidgetのImageViewに対してServiceからRemoteViewを経由して
setImageViewBitmapを更新する処理の開発を行っている時にどうもカクカク(処理遅延の様な)したり更新されなかったりする時が有る。
そんな時LOGには
!!! FAILED BINDER TRANSACTION !!!
が連発している事が多いですが、その原因と対処法について
原因は、RemoteViewのsetImageViewBitmapを呼び出すと引数のBitmapを
シリアル化して渡す、その時のメモリが累積してIPCの許容を超えると発生します。
1.RemoteViewをService内で使いまわしている
2.大きな画像をBitmapに指定している
対処法として
1の場合は、
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.レイアウトID);
といったように毎回定義しなおすと回避できる。
2の場合は、
Bitmapのサイズを小さくするもしくは、Bitmap.Config.RGB_565を指定する
アルファチャネルが使えないのが痛いが、背景ならなんとか。
参考までに、2*2のサイズのPNGは大丈夫でした。
また、Eclipseのデバッグ(実機)などで何をしても発生する場合、実機のAPKを一度アンインストールすると直る事が有ります。
(自分はこれにハマりました)
ぐるなびWebサービスからデータを取得するツールを開発しましたが
ぐるなびWebではAPIサービス向けデータのみしか利用できません。
ぐるなびサイトで公開している方が遥かに件数は多い様です。
(ぐるなびサイトに有ってぐるなびWebサービス無いお店が多々あります)
そこで、サイト側を巡回して情報を取得するバージョンを開発しました。
Android関係およびiPhone関係のサービス利用の為ですがご利用になりたい方への販売を開始致します。
ぐるなびWebと同じ様に999件以上は取得制限があり、一気に取得が出来ませんでしたが
条件を細分化する事でエリア単位に取得出来る様になりました。
エリア情報は接続時に自動で解析しますのでぐるなびサイト側でエリアが変更になっても取得する毎に解析します。(全国に対応します)
カテゴリなどの情報を最新に保つ為にぐるなびWebサービスからマスタを取得していますのでキーは必要となります。
あくまでも、データ利用に関してはご利用者にお任せします。
詳細ページへ
http://three-thread.sakura.ne.jp/tt/modules/pico/index.php?content_id=3
ぐるなびWebではAPIサービス向けデータのみしか利用できません。
ぐるなびサイトで公開している方が遥かに件数は多い様です。
(ぐるなびサイトに有ってぐるなびWebサービス無いお店が多々あります)
そこで、サイト側を巡回して情報を取得するバージョンを開発しました。
Android関係およびiPhone関係のサービス利用の為ですがご利用になりたい方への販売を開始致します。
ぐるなびWebと同じ様に999件以上は取得制限があり、一気に取得が出来ませんでしたが
条件を細分化する事でエリア単位に取得出来る様になりました。
エリア情報は接続時に自動で解析しますのでぐるなびサイト側でエリアが変更になっても取得する毎に解析します。(全国に対応します)
カテゴリなどの情報を最新に保つ為にぐるなびWebサービスからマスタを取得していますのでキーは必要となります。
あくまでも、データ利用に関してはご利用者にお任せします。
詳細ページへ
http://three-thread.sakura.ne.jp/tt/modules/pico/index.php?content_id=3
ぐるなびWebサービスからデータを取得するツールを開発しました。
Android関係およびiPhone関係のサービス利用の為ですが
ご利用になりたい方への販売を開始致します。
999件以上は取得制限があり、一気に取得が出来ませんでしたが
条件を細分化する事でエリア単位に取得出来る様になりました。
また、データ中に無いメールアドレスも同時に取得します。
予約のメールを自動で出すなどサービスも考えられるかと思います。
あくまでも、データ利用に関してはご利用者にお任せします。
GPSを利用してお店が近くなったら知らせるとか、お昼に一番近い
今日食べたいお店を知らせるとかいろいろ使い道があるかと思います。
ぐるなび直接使えばって方も居るかも知れませんが、自分のサービスとして
構築したいと思っている方向けになります。
また、ぐるなびアクセスキーを利用するには利用規約がありますので
それをお読みになってご利用下さい。
詳細ページへ
http://three-thread.sakura.ne.jp/tt/modules/pico/index.php?content_id=2
Android関係およびiPhone関係のサービス利用の為ですが
ご利用になりたい方への販売を開始致します。
999件以上は取得制限があり、一気に取得が出来ませんでしたが
条件を細分化する事でエリア単位に取得出来る様になりました。
また、データ中に無いメールアドレスも同時に取得します。
予約のメールを自動で出すなどサービスも考えられるかと思います。
あくまでも、データ利用に関してはご利用者にお任せします。
GPSを利用してお店が近くなったら知らせるとか、お昼に一番近い
今日食べたいお店を知らせるとかいろいろ使い道があるかと思います。
ぐるなび直接使えばって方も居るかも知れませんが、自分のサービスとして
構築したいと思っている方向けになります。
また、ぐるなびアクセスキーを利用するには利用規約がありますので
それをお読みになってご利用下さい。
詳細ページへ
http://three-thread.sakura.ne.jp/tt/modules/pico/index.php?content_id=2
AuraxTSense(Sense系)7.9にSB公式のbuild.propを参考に
魔法の五行を編集して利用しているが
ro.ril.oem.ecclist=110,118,119
ro.ril.enable.a52=0
ro.ril.enable.a53=1
ro.ril.fast.dormancy.timeout=3
ro.ril.enable.sbm.feature=1
バッテリー満タン時には、juicePlotterで40時間近い稼動予定になる。
実際は、ちょこちょこ(稀にヘビーに)使っても2日は持つ感じになる。
音楽再生などで使うと1日くらい、夜中0時から朝6時のスリープ時消費は
大体、2〜3%というところ、グラフで倍率が高いと殆ど横線に見える。
ただ、Sense系以外のROMを使った場合、丁度45度の角度で消費されて行く
満タンからだと8時間くらい使っていれば5時間持つかどうか、以前の
バッテリー大量消費に見舞われてからの現象。
ハードは同じだし、SDかデバイス関連でしょうか。
同じ様な症状の方は、Sense系ROM入れて魔法の5行追加してみては?
追記
→libhtc_ril.soを入れ替えるとSense系以外もなかなか行けます。
AuraxTSenseのlibhtc_ril.soを愛用していますがなかなかです。
(/system/lib以下にあります。)
魔法の五行を編集して利用しているが
ro.ril.oem.ecclist=110,118,119
ro.ril.enable.a52=0
ro.ril.enable.a53=1
ro.ril.fast.dormancy.timeout=3
ro.ril.enable.sbm.feature=1
バッテリー満タン時には、juicePlotterで40時間近い稼動予定になる。
実際は、ちょこちょこ(稀にヘビーに)使っても2日は持つ感じになる。
音楽再生などで使うと1日くらい、夜中0時から朝6時のスリープ時消費は
大体、2〜3%というところ、グラフで倍率が高いと殆ど横線に見える。
ただ、Sense系以外のROMを使った場合、丁度45度の角度で消費されて行く
満タンからだと8時間くらい使っていれば5時間持つかどうか、以前の
バッテリー大量消費に見舞われてからの現象。
ハードは同じだし、SDかデバイス関連でしょうか。
同じ様な症状の方は、Sense系ROM入れて魔法の5行追加してみては?
追記
→libhtc_ril.soを入れ替えるとSense系以外もなかなか行けます。
AuraxTSenseのlibhtc_ril.soを愛用していますがなかなかです。
(/system/lib以下にあります。)
MMSのアプリがSoftBankさんから出たんですが、カスタムROM派には
余り興味が無かった訳ですがSense系のROMでは、有志が作成して下さった
Mms.pakが上手く動作しない、もしくは絵文字が使えなかったり
Senseのコピー機能は欲しいけどMMSの絵文字も使いたいというと二者択一
(私の中ではですが)でした。
AuraxTSenseに有志のMms.apkを入れてUser-Agentを替えれば送受信可能です
(フォントサイズなど変えられて結構快適に使えます)
その上にSoftBankのメールをインストールすると使えない事は無いが
通知を既存のMmsが取得する為、SB側のメールがエラーを発生させる
無視すれば使えない事は無いが、既存Mms側とSBメール両方に通知が残る。
また、既存MmsはwifiでAPNを常時接続にしていないと本文受信が出来なかったりするのでWifiを切るか常時接続にする。(通知は受け取れる)
SBのメールは、3G側を常に使うので常時接続でなくてもそれなりにシームレスに使える様です。
純正ROMだとSBメール入れるとMMSが置き換わるのか解りませんが
単純に、カスタムROM側のMms.apkを削除してSBメールをインストールするだけで実現可能でした、サイズさえ目を瞑れば絵文字も見れるし感情を誤解しない様にはなりそうです。
余り興味が無かった訳ですがSense系のROMでは、有志が作成して下さった
Mms.pakが上手く動作しない、もしくは絵文字が使えなかったり
Senseのコピー機能は欲しいけどMMSの絵文字も使いたいというと二者択一
(私の中ではですが)でした。
AuraxTSenseに有志のMms.apkを入れてUser-Agentを替えれば送受信可能です
(フォントサイズなど変えられて結構快適に使えます)
その上にSoftBankのメールをインストールすると使えない事は無いが
通知を既存のMmsが取得する為、SB側のメールがエラーを発生させる
無視すれば使えない事は無いが、既存Mms側とSBメール両方に通知が残る。
また、既存MmsはwifiでAPNを常時接続にしていないと本文受信が出来なかったりするのでWifiを切るか常時接続にする。(通知は受け取れる)
SBのメールは、3G側を常に使うので常時接続でなくてもそれなりにシームレスに使える様です。
純正ROMだとSBメール入れるとMMSが置き換わるのか解りませんが
単純に、カスタムROM側のMms.apkを削除してSBメールをインストールするだけで実現可能でした、サイズさえ目を瞑れば絵文字も見れるし感情を誤解しない様にはなりそうです。
Buletoothのサーチ(クライアント)中は、待ち受け(サーバ)をしない方が
良いとの事、電波干渉するらしい。
同時(非同期)にしたかったが順番に行う方が良いみたい。
1.デバイス検索
2.デバイスリスト処理 非同期で待ち受け処理
3.デバイス検索(以下繰り返し)
両方終ったら、デバイス検索という処理が理想かなと考察
という事は、
サービス
デバイス検索
完了→非同期 デバイスリスト処理(クラス)、非同期 待ち受け処理(クラス)
処理完了(ハンドラで待ち受け)
デバイス検索
という事で、サービスとして設計する。
良いとの事、電波干渉するらしい。
同時(非同期)にしたかったが順番に行う方が良いみたい。
1.デバイス検索
2.デバイスリスト処理 非同期で待ち受け処理
3.デバイス検索(以下繰り返し)
両方終ったら、デバイス検索という処理が理想かなと考察
という事は、
サービス
デバイス検索
完了→非同期 デバイスリスト処理(クラス)、非同期 待ち受け処理(クラス)
処理完了(ハンドラで待ち受け)
デバイス検索
という事で、サービスとして設計する。
軒並み外国のAndroidサイトから勧誘が来ます。
中国とかドイツ、イギリスなどなど
ん〜翻訳してみるもどうも怪しい感じがしてしまうのは
島国根性の為??フリーのもなら問題なかなぁと思いつつ
二の足を踏んでしまう。
中国とかドイツ、イギリスなどなど
ん〜翻訳してみるもどうも怪しい感じがしてしまうのは
島国根性の為??フリーのもなら問題なかなぁと思いつつ
二の足を踏んでしまう。
SB版の2.2へアップグレードを行うともれなくHBOOT-0.93になり
GoldCardによるRoot化手法が使えなくなる。
そこで、unrEVOked3.21を使う。
HBOOTのUSBドライバを設定して、該当のExeを実行するだけで行ける様だ。
(多少の設定、USBデバックに設定とか外部ストレージモードにするとかあるが待つだけ)
もうちょっと純正を使ってからトライしてみようと思う。
カスタムROMの方が軒並み処理能力やら消費電力やら痒い所に手が届くやら
あるので魅力的。
→ 上記の方法でRootが取れたかも、簡単すぎて微妙な感じですが
ROM ManagerからRootが取れません、カスタムROM入れないと駄目なんだろうか。
→ Root取れてました、ブートの時のロゴが「=SoftBank」でしたので勘違いしていました。
GoldCardによるRoot化手法が使えなくなる。
そこで、unrEVOked3.21を使う。
HBOOTのUSBドライバを設定して、該当のExeを実行するだけで行ける様だ。
(多少の設定、USBデバックに設定とか外部ストレージモードにするとかあるが待つだけ)
もうちょっと純正を使ってからトライしてみようと思う。
カスタムROMの方が軒並み処理能力やら消費電力やら痒い所に手が届くやら
あるので魅力的。
→ 上記の方法でRootが取れたかも、簡単すぎて微妙な感じですが
ROM ManagerからRootが取れません、カスタムROM入れないと駄目なんだろうか。
→ Root取れてました、ブートの時のロゴが「=SoftBank」でしたので勘違いしていました。
やっとこ、アイデアが纏まったので開発に入ります。
内容は、Bluetoothを使った物になります。
詳しくは後ほど。
しかし、iPhoneもこの辺とまりでしょうね。
ハードまで握ったらPC98と同じ事になりますね
デザインとアイデアが、昔のNECよりはあるので
好きに人にはこのままの人気で行くでしょうが
開発の場に上がってくるのはAndroidになって来るでしょうね。
今のうちに習得しておきたいところです。
内容は、Bluetoothを使った物になります。
詳しくは後ほど。
しかし、iPhoneもこの辺とまりでしょうね。
ハードまで握ったらPC98と同じ事になりますね
デザインとアイデアが、昔のNECよりはあるので
好きに人にはこのままの人気で行くでしょうが
開発の場に上がってくるのはAndroidになって来るでしょうね。
今のうちに習得しておきたいところです。