目標:ビルドAndroidアプリは、範囲内のBTデバイスの名前とアドレスを検出し、それらの値をWebサービスに送信します。BTデバイスは、以前にホストデバイス、歩きながらすべてをポーリングしたい。
私がやったこと:
ACTION_FOUNDs
_を解析するための登録済みブロードキャストレシーバーとインテント。物事はstartDiscovery()
まで(インクリメンタルコンソールロギングでテストしたように)機能します。
フラストレーション:
この方法を機能させることができたなら、私はあなたの知恵を非常に感謝します。
[〜#〜] update [〜#〜]-これは、私を悲しませているコードの簡略化された簡略版です。この簡略化は私のエラーを要約したものです。このコードは実行され、_cat.log
_エラーやその他のエラーをスローせず、単に出力を行いません。
_package aqu.bttest;
import Android.app.Activity;
import Android.bluetooth.BluetoothAdapter;
import Android.bluetooth.BluetoothDevice;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.IntentFilter;
import Android.os.Bundle;
import Android.widget.Toast;
public class BT2Activity extends Activity {
private BluetoothAdapter mBTA;
private SingBroadcastReceiver mReceiver;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//register local BT adapter
mBTA = BluetoothAdapter.getDefaultAdapter();
//check to see if there is BT on the Android device at all
if (mBTA == null){
int duration = Toast.LENGTH_SHORT;
Toast.makeText(this, "No Bluetooth on this handset", duration).show();
}
//let's make the user enable BT if it isn't already
if (!mBTA.isEnabled()){
Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBT, 0xDEADBEEF);
}
//cancel any prior BT device discovery
if (mBTA.isDiscovering()){
mBTA.cancelDiscovery();
}
//re-start discovery
mBTA.startDiscovery();
//let's make a broadcast receiver to register our things
mReceiver = new SingBroadcastReceiver();
IntentFilter ifilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(mReceiver, ifilter);
}
private class SingBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); //may need to chain this to a recognizing function
if (BluetoothDevice.ACTION_FOUND.equals(action)){
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add the name and address to an array adapter to show in a Toast
String derp = device.getName() + " - " + device.getAddress();
Toast.makeText(context, derp, Toast.LENGTH_LONG);
}
}
}
_
}
このメソッドを適切に機能させるには、どのコンテキストに配置する必要がありますか。
簡単に言うと、アプリケーションでローカルBluetoothデバイスを検出する場合はstartDiscovery()
を使用する必要があります...たとえば、近くのBluetoothをスキャンして動的に追加するListActivity
を実装する場合デバイスをListView
に追加します( DeviceListActivity
を参照)。
startDiscovery()
メソッドの使用法は次のようになります。
ローカルBluetoothアダプターを表すクラス変数を定義します。
BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
デバイスがすでに「検出中」かどうかを確認します。存在する場合は、検出をキャンセルします。
if (mBtAdapter.isDiscovering()) {
mBtAdapter.cancelDiscovery();
}
発見モードを確認(および場合によってはキャンセル)した直後に、次を呼び出して発見を開始します。
mBtAdapter.startDiscovery();
誤ってデバイスを誤って検出モードにしておくことについては、一般的に非常に注意してください。デバイス検出の実行は、Bluetoothアダプターにとって重い手順であり、そのリソースの多くを消費します。たとえば、接続を試みる前に、ディスカバリを確認/キャンセルする必要があります。 onDestroy
メソッドでも検出をキャンセルしたいと思うでしょう。
これで問題が解決したかどうかを知らせてください...それでも問題が解決しない場合は、logcatの出力やエラーメッセージで回答を更新してください。もう少しお手伝いできますか?.