はまった。
Androidアプリに、Bluetoothの機能を持たせたいとき。
公式のサンプルであるBluetoothChatでは、
今Bluetoothの機能がOFFになっていたら、ONにするため、
onStartの中で、mBluetoothAdapter.isEnabled()を呼び出して確認しています。
で、OFFになってたら、startActivityForResultを使って端末の設定画面に飛んで、ユーザに手動で
BluetoothをONにしてもらってます。
@Override
public void onStart() {
super.onStart();
if(D) Log.e(TAG, "++ ON START ++");
if (!mBluetoothAdapter.isEnabled()) {
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
} else {
if (mChatService == null) setupChat();
}
}
こう。
その次のonResumeで、接続の初期化をしてます。
@Override
public synchronized void onResume() {
super.onResume();
if(D) Log.e(TAG, "+ ON RESUME +");
if (mChatService != null) {
if (mChatService.getState() == BluetoothChatService.STATE_NONE) {
mChatService.start();
}
}
}
こう。
で、このプログラムだと、最初にBluetoothの機能がOFFのときのプログラムの流れは、
プログラム開始
↓
onCreate()
↓
onStart()
↓
onResume()
↓
onPause()
↓
設定画面へジャンプ
↓
onResume()
というかんじで、onResume()を二回通っているのです。
だから、一回目のonResume()では、まだBluetooth機能がONになってないから、通信の初期化処理を防ぐ機構が必要なのです。
サンプルプログラムでは、mChatServiceがnullかどうか、というのがBluetooth機能のON/OFF状態を示すフラグの代わりになってます。
であるので、mChatServiceをなくしちゃおうと画策する俺のような人は、Bluetooth機能のON/OFFフラグをちゃんと作らないといけないのです。
たぶん。
果てなき野望を追って
2014年11月30日日曜日
2014年9月27日土曜日
3Dメガネという物
http://ux.getuploader.com/eternalyabou/download/43/cardboard.apk
googlecardboardみたいなものをDurovis Diveというのでつくれるんだって。
googlecardboardみたいなものをDurovis Diveというのでつくれるんだって。
2014年8月8日金曜日
2014年7月17日木曜日
Bluetooth TextViewに書き込めない件 thread exiting with uncaught exception
Bluetooth通信のテストをしてるときに、現在の状態をTextViewに出したくなった。
(LogCatは慣れなくて嫌い・・・なんて言ってられないんだろうけど。)
で、ClientThreadとかServerThreadとかAcceptThreadとかなんかそういう感じの名前のThreadが
皆さんのコードの中にもあると思うけど、そこからtextviewを編集しようとすると
thread exiting with uncaught exception
とかいってエラーになってる。
なんだよクソッ!とおもって色々調べてみると、ThreadからUIの編集が出来ないんだって。
詳しくは知らない。
だから、新しいHandlerを作ってその中でtextviewを書き換えればいいらしい。
ということをきっかけにして各位ググるといいんじゃないでしょうか。
(LogCatは慣れなくて嫌い・・・なんて言ってられないんだろうけど。)
で、ClientThreadとかServerThreadとかAcceptThreadとかなんかそういう感じの名前のThreadが
皆さんのコードの中にもあると思うけど、そこからtextviewを編集しようとすると
thread exiting with uncaught exception
とかいってエラーになってる。
なんだよクソッ!とおもって色々調べてみると、ThreadからUIの編集が出来ないんだって。
詳しくは知らない。
だから、新しいHandlerを作ってその中でtextviewを書き換えればいいらしい。
ということをきっかけにして各位ググるといいんじゃないでしょうか。
2014年5月30日金曜日
2014年5月28日水曜日
Bluetoothで通信を行う
Bluetoothで通信を行うって記事を参考にbluetooth通信を行うアプリを作ろうと思ってるんだけど、
さっきからぜんぜんエラーが消えなくて何かと思ってた
元記事Bluetoothで通信を行う(2)
ACTION_DISCOVERY_STARTED
ACTION_DISCOVERY_FINISHED
の2つは、頭にBluetoothAdapter. ってつける必要があって、
ACTION_FOUND
ACTION_NAME_CHANGED
の2つは、頭にBluetoothDevice. ってつける必要があった。
だから、その部分のコードは、
private final BroadcastReceiver DevieFoundReceiver = new BroadcastReceiver(){
//検出されたデバイスからのブロードキャストを受ける
@Override
public void onReceive(Context context, Intent intent){
String action = intent.getAction();
String dName = null;
BluetoothDevice foundDevice;
ListView nonpairedList = (ListView)findViewById(R.id.listview);
if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){
Log.d("ACTION_DISCOVERY_STARTED","スキャン開始");
}
if(BluetoothDevice.ACTION_FOUND.equals(action)){
//デバイスが検出された
foundDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if((dName = foundDevice.getName()) != null){
if(foundDevice.getBondState() != BluetoothDevice.BOND_BONDED){
//接続したことのないデバイスのみアダプタに詰める
connectableDeviceAdapter.add(dName + "\n" + foundDevice.getAddress());
Log.d("ACTION_FOUND", dName);
}
}
nonpairedList.setAdapter(connectableDeviceAdapter);
}
if(BluetoothDevice.ACTION_NAME_CHANGED.equals(action)){
//名前が検出された
Log.d("ACTION_NAME_CHANGED", dName);
foundDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if(foundDevice.getBondState() != BluetoothDevice.BOND_BONDED){
//接続したことのないデバイスのみアダプタに詰める
connectableDeviceAdapter.add(dName + "\n" + foundDevice.getAddress());
}
nonpairedList.setAdapter(connectableDeviceAdapter);
}
if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
Log.d("ACTION_DISCOVERY?FINISHED","スキャン終了");
}
}
};
ってなる。
本来はならないのかな?
よくわかりません。
分かる人教えてください。
おわり
さっきからぜんぜんエラーが消えなくて何かと思ってた
元記事Bluetoothで通信を行う(2)
ACTION_DISCOVERY_STARTED
ACTION_DISCOVERY_FINISHED
の2つは、頭にBluetoothAdapter. ってつける必要があって、
ACTION_FOUND
ACTION_NAME_CHANGED
の2つは、頭にBluetoothDevice. ってつける必要があった。
だから、その部分のコードは、
private final BroadcastReceiver DevieFoundReceiver = new BroadcastReceiver(){
//検出されたデバイスからのブロードキャストを受ける
@Override
public void onReceive(Context context, Intent intent){
String action = intent.getAction();
String dName = null;
BluetoothDevice foundDevice;
ListView nonpairedList = (ListView)findViewById(R.id.listview);
if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){
Log.d("ACTION_DISCOVERY_STARTED","スキャン開始");
}
if(BluetoothDevice.ACTION_FOUND.equals(action)){
//デバイスが検出された
foundDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if((dName = foundDevice.getName()) != null){
if(foundDevice.getBondState() != BluetoothDevice.BOND_BONDED){
//接続したことのないデバイスのみアダプタに詰める
connectableDeviceAdapter.add(dName + "\n" + foundDevice.getAddress());
Log.d("ACTION_FOUND", dName);
}
}
nonpairedList.setAdapter(connectableDeviceAdapter);
}
if(BluetoothDevice.ACTION_NAME_CHANGED.equals(action)){
//名前が検出された
Log.d("ACTION_NAME_CHANGED", dName);
foundDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if(foundDevice.getBondState() != BluetoothDevice.BOND_BONDED){
//接続したことのないデバイスのみアダプタに詰める
connectableDeviceAdapter.add(dName + "\n" + foundDevice.getAddress());
}
nonpairedList.setAdapter(connectableDeviceAdapter);
}
if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
Log.d("ACTION_DISCOVERY?FINISHED","スキャン終了");
}
}
};
ってなる。
本来はならないのかな?
よくわかりません。
分かる人教えてください。
おわり
2014年2月1日土曜日
くりっくしたらでっかくなる
カメラのprojectionをperspectiveにしていると、ゲームオブジェクトの描画に奥行きが出来る。
その状態で、オブジェクトの位置を変更することで、クリック中にオブジェクトを大きく表示させたかった。
純粋にz座標の位置を変化させると、マウスと位置がずれる。
this.transform.Translate(Vector3.back * 0.5f);
カメラとオブジェクトを結ぶ直線上でキャラクターを動かすと、描画がちゃんとする
this.transform.Translate((game_camera.transform.position - this.transform.position).normalized * 0.5f);
その状態で、オブジェクトの位置を変更することで、クリック中にオブジェクトを大きく表示させたかった。
純粋にz座標の位置を変化させると、マウスと位置がずれる。
this.transform.Translate(Vector3.back * 0.5f);
カメラとオブジェクトを結ぶ直線上でキャラクターを動かすと、描画がちゃんとする
this.transform.Translate((game_camera.transform.position - this.transform.position).normalized * 0.5f);
登録:
投稿 (Atom)