我在iPad上有一个应用程序,它发送蓝牙LE信息代替其设备名称.我正试图在我的Android代码中捕获该信息并以某种方式更新UI.基本上我需要连续扫描设备并根据我的协议使用"设备名称"来更新我的Android UI.我知道这不是正确的做事方式,我确实计划重构两个应用程序以正确使用蓝牙LE,但我很快就需要这样做,我现在没有时间.
在下面的代码中,我知道scanLeDevices由于我放入的一些Logs而被调用,但是我在onLeScan中的print语句永远不会被调用.谁能告诉我为什么?我已经坚持了很久......
public class MainActivity extends Activity {
private static final String TAG = "...";
List listItems=new ArrayList();
ArrayAdapter adapter;
BluetoothManager mBluetoothManager;
private BluetoothAdapter mBluetoothAdapter;
TextView mainView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_main);
setProgressBarIndeterminate(true);
mBluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
mBluetoothAdapter = mBluetoothManager.getAdapter();
mainView = (TextView) findViewById(R.id.main_view);
scanLeDevice(true);
}
@Override
protected void onResume() {
super.onResume();
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
//Bluetooth is disabled
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(enableBtIntent);
finish();
return;
}
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "No LE Support.", Toast.LENGTH_SHORT).show();
finish();
return;
}
scanLeDevice(true);
}
private static final long SCAN_TIME = 1000;
boolean mScanning = false;
private void scanLeDevice(final boolean enable) {
Log.i(null, "Inside scanLeDevice");
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
Log.i(null, "Calling stopLeScan");
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}, SCAN_TIME);
mScanning = true;
Log.i(null, "Calling startLeScan");
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.i(null, "INSIDE ONLESCAN");
//DO MY WORK
}
});
}
};
}