web-dev-qa-db-ja.com

Android-startDiscovery()でのBluetoothデバイスの検出

目標:ビルドAndroidアプリは、範囲内のBTデバイスの名前とアドレスを検出し、それらの値をWebサービスに送信します。BTデバイスは、以前にホストデバイス、歩きながらすべてをポーリングしたい。

私がやったこと:

  1. ドキュメントを熟読。
  2. ホストデバイスのBTアダプターのローカルインスタンスを実装しました。
  3. BTが有効になっていない場合に有効にする通知を実装しました。
  4. startDiscovery()からの_ACTION_FOUNDs_を解析するための登録済みブロードキャストレシーバーとインテント。
  5. 登録[〜#〜] bluetooth [〜#〜]およびBLUETOOTH_ADMINアクセス許可がマニフェストに登録されています。

物事はstartDiscovery()まで(インクリメンタルコンソールロギングでテストしたように)機能します。


フラストレーション:

  • 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);
        }
    }
}
_

}

15
Lemminkainen

このメソッドを適切に機能させるには、どのコンテキストに配置する必要がありますか。

簡単に言うと、アプリケーションでローカルBluetoothデバイスを検出する場合はstartDiscovery()を使用する必要があります...たとえば、近くのBluetoothをスキャンして動的に追加するListActivityを実装する場合デバイスをListViewに追加します( DeviceListActivity を参照)。

startDiscovery()メソッドの使用法は次のようになります。

  1. ローカルBluetoothアダプターを表すクラス変数を定義します。

    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    
  2. デバイスがすでに「検出中」かどうかを確認します。存在する場合は、検出をキャンセルします。

    if (mBtAdapter.isDiscovering()) {
        mBtAdapter.cancelDiscovery();
    }
    
  3. 発見モードを確認(および場合によってはキャンセル)した直後に、次を呼び出して発見を開始します。

    mBtAdapter.startDiscovery();
    
  4. 誤ってデバイスを誤って検出モードにしておくことについては、一般的に非常に注意してください。デバイス検出の実行は、Bluetoothアダプターにとって重い手順であり、そのリソースの多くを消費します。たとえば、接続を試みる前に、ディスカバリを確認/キャンセルする必要があります。 onDestroyメソッドでも検出をキャンセルしたいと思うでしょう。

これで問題が解決したかどうかを知らせてください...それでも問題が解決しない場合は、logcatの出力やエラーメッセージで回答を更新してください。もう少しお手伝いできますか?.

19
Alex Lockwood