android 掃描特定uuid的ble裝置

ti10na28 2016-09-18 11:56:34
最近在寫ble掃描,我想掃描符合uuid的裝置,該怎麼寫?
現在嘗試用ScanFilter去寫,但是掃描出來的結果一樣是未過濾的,想請教哪裡寫錯了
ScanFilter的設定寫在onResume裡面


public class MainActivity extends Activity implements LocationListener {

String id,sql;
ImageButton btn_add_device;
private ListView show_item;
private SimpleAdapter adapter;
private SQLiteDatabase db;
private Cursor cursor;
private DBHelper dbHelper;

HashMap<String, Integer> record = new HashMap<String, Integer>();
private Long startTime;
private Handler timer = new Handler();
LocationManager locationManager;
private BluetoothAdapter mBluetoothAdapter;
private int REQUEST_ENABLE_BT = 1234;
private Handler mHandler;
private static final long SCAN_PERIOD = 10000;
private BluetoothLeScanner mLEScanner;
private ScanSettings settings;
private List<ScanFilter> filters;
private BluetoothGatt mGatt;
UUID targetUUID = UUID.fromString("4d414749-4241-4447-4e11-0812740111f0");
UUID uuids[] = {targetUUID};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().setDisplayHomeAsUpEnabled(true);
show_item = (ListView) findViewById(R.id.lv_show_item);

//宣告倒數
mHandler = new Handler();
//ble
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "BLE Not Supported",
Toast.LENGTH_SHORT).show();
finish();
}
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

dbHelper = new DBHelper(this);
//解析json
//StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.penaltyLog()
.penaltyDeath()
.build());

//清單面版
adapter = new SimpleAdapter(this, getDatas(),
R.layout.main_item_list,
new String[]{"item_name", "item_mac"},
new int[]{R.id.item_name, R.id.item_mac});
show_item.setAdapter(adapter);
adapter.setViewBinder(new SimpleAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Object data, String textRepresentation) {
return false;
}
});

show_item.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
return false;
}
});

//點選清單
show_item.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub

ListView listView = (ListView) arg0;
View view = listView.getChildAt(arg2);
TextView text = (TextView) view.findViewById(R.id.item_mac);
//Toast.makeText(MainActivity.this,text.getText().toString(),Toast.LENGTH_LONG).show();
gotomap(text.getText().toString());
}
});

//計時器設定
startTime = System.currentTimeMillis();
//設定定時要執行的方法
timer.removeCallbacks(updateTimer);
//設定Delay的時間
timer.postDelayed(updateTimer, 5000);
}

/**
* 設定清單資料
*
* 要去資料庫抓
* 還沒設資料庫k
*
* */
private List getDatas() {
List list = new ArrayList();
//db = openOrCreateDatabase("however_find.db", MODE_PRIVATE, null);
db =dbHelper.getReadableDatabase();
cursor = db.rawQuery("select _id, name from item_info",null);
//cursor = db.rawQuery("delete from item_info",null);

if (cursor != null && cursor.getCount()>=0) {
int i = cursor.getCount();
//for(int k=0;k<i;k++) {
while (cursor.moveToNext()){
try{
//Toast.makeText(MainActivity.this, k+" "+i, Toast.LENGTH_LONG).show();
String mac = cursor.getString(0);
String name = cursor.getString(1);

//Toast.makeText(MainActivity.this, mac+" "+name, Toast.LENGTH_LONG).show();
Map map = new HashMap();
map.put("item_name", name);
map.put("item_mac", mac);
list.add(map);
}
catch (Exception e)
{
Toast.makeText(MainActivity.this, "錯錯錯錯錯", Toast.LENGTH_LONG).show();
}
}
db.close();
}
return list;
}

@Override
protected void onResume() {
super.onResume();
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
} else {
if (Build.VERSION.SDK_INT >= 21) {
mLEScanner = mBluetoothAdapter.getBluetoothLeScanner();

ScanFilter filter = new ScanFilter.Builder()
.setServiceUuid(ParcelUuid.fromString("4d414749-4241-4447-4e11-0812740111f0"))
.build();
filters = new ArrayList<ScanFilter>();
filters.add(filter);

settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
}
scanLeDevice(true);
}
}

@Override
protected void onPause() {
super.onPause();
if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) {
scanLeDevice(false);
} }

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_ENABLE_BT) {
if (resultCode == Activity.RESULT_CANCELED) {
//Bluetooth not enabled.
finish();
return;
} }
super.onActivityResult(requestCode, resultCode, data);
}

private void scanLeDevice(final boolean enable) {
if (enable) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (Build.VERSION.SDK_INT < 21) {
mBluetoothAdapter.stopLeScan(mLeScanCallback);
} else {
mLEScanner.stopScan(mScanCallback);
}
} }, SCAN_PERIOD);

if (Build.VERSION.SDK_INT < 21) {
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mLEScanner.startScan(filters, settings, mScanCallback);
}
} else {
if (Build.VERSION.SDK_INT < 21) {
mBluetoothAdapter.stopLeScan(mLeScanCallback);
} else {
mLEScanner.stopScan(mScanCallback);
} } }

String device_mac;
Integer device_rssi;
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
Log.i("callbackType", String.valueOf(callbackType));
Log.i("result", result.toString());
BluetoothDevice btDevice = result.getDevice();
//connectToDevice(btDevice);
Log.i("jiejv",btDevice.getAddress());
device_mac = btDevice.getAddress();
device_rssi = result.getRssi();

if(device_mac.equals(null) || device_rssi== null)
Log.i("jiejv",device_mac+"空空空"+device_rssi);
else
{
record.put(device_mac,device_rssi);
}
//if(update_record(device_mac,device_rssi))
Log.i("jiejv",device_mac+" "+device_rssi);
}

@Override
public void onBatchScanResults(List<ScanResult> results) {
for (ScanResult sr : results) {
Log.i("ScanResult - Results", sr.toString());
} }

@Override
public void onScanFailed(int errorCode) {
Log.e("Scan Failed", "Error Code: " + errorCode);
}};

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("onLeScan", device.toString());
//connectToDevice(device);
}
});
}
};
}
...全文
550 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ti10na28 2016-09-20
  • 打赏
  • 举报
回复
引用 1 楼 ink_s 的回复:
你可以正常扫描 然后只要和特定ID一样的就行了吧。。。 比如list view 只显示和特定一样的 。。。
可是我要怎麼抓到裝置的uuid 有試過很多方法抓到的都是端口的uuid 不是我要的那種...
ink_s 2016-09-18
  • 打赏
  • 举报
回复
你可以正常扫描 然后只要和特定ID一样的就行了吧。。。 比如list view 只显示和特定一样的 。。。

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧