java - Android:如何让我的蓝牙扫描在给定时间后完成?
问题描述
所以我创建了一个扫描附近蓝牙设备的应用程序。现在这部分工作得很好。问题是,我希望它在 30 秒的时间段后停止发现过程。我如何实现这一目标?
这是我的代码:
广播接收器:
private BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
Log.d(TAG,"onReceive: Action Found");
if(action.equals(BluetoothDevice.ACTION_FOUND))
{
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.d(TAG, "onReceive: " + device.getName() + ": " + device.getAddress());
if(device.getName() != null)
{
//System.out.println("JUNGE ER FINDET DOCH SOGAR DAS DEVICE WIESO ZEIGT ER DIE SCHEIßE NICHT AN");
//Jetzt wo keine nullpointer Exception mehr ent
if(device.getName().contains("HC")) {
mBTDevices.add(device);
mDeviceListAdapter = new DeviceListAdapter(context, R.layout.device_adapter_view, mBTDevices);
lvNewDevices.setAdapter((mDeviceListAdapter));
}
}
}
/*else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
Log.v(TAG, "Entered the Finished ");
System.out.println("Entered the Finished");
}
*/
}
} ;
发现方法(当我按下发现按钮时单击)
public void btnDiscover(View view)
{
Log.d(TAG,"btnDiscover: Looking for unpaired Devices");
if(mBluetoothAdapter.isDiscovering())
{
mBluetoothAdapter.cancelDiscovery();
Log.d(TAG,"btnDiscover:Cancelling discovery.");
//Checkt ob die Berechtigungen im Manifest für BT vorliegen
checkBTPermissions();
//start discovery again
mBluetoothAdapter.startDiscovery();
IntentFilter discoverDevicesIntent = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mBroadcastReceiver3,discoverDevicesIntent);
}
if(!(mBluetoothAdapter.isDiscovering()))
{
//another check
checkBTPermissions();
mBluetoothAdapter.startDiscovery();
IntentFilter discoverDevicesIntent = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mBroadcastReceiver3,discoverDevicesIntent);
}
}
解决方案
替换mBluetoothAdapter.startDiscovery();
为scann(mBluetoothAdapter,30);
void scann(final BluetoothAdapter mBluetoothAdapter, int seconds)
{
final long desired_miliseconds=seconds*1000;
final long start_mils=System.currentTimeMillis();
final Timer tm=new Timer();
tm.schedule(new TimerTask() {
@Override
public void run() {
if((System.currentTimeMillis()-start_mils)>=desired_miliseconds&&mBtAdapter.isDiscovering())
{
mBluetoothAdapter.cancelDiscovery();
tm.cancel();
}else if((System.currentTimeMillis()-start_mils)<desired_miliseconds&&!mBtAdapter.isDiscovering())
{
mBluetoothAdapter.startDiscovery();
}
}
},1000,1000);
}
推荐阅读
- php - 将 dash 应用程序本地嵌入到 php 站点中
- database - DB2 恢复找不到 DB2REMOTE 路径
- java - 如何使用子实体-Spring数据JPA检索父实体
- .net - 将 BBcode 转换为 Json 或 xml
- azure - 如何从 Azure 文件共享中删除所有文件?
- excel - 尝试从多个 URL 导入数据但始终停留在第一个 URL
- javascript - 将数据从 ag-Grid 传递到另一个接口
- c# - ASP.NET Core 在 Program.cs 和 Startup.cs 中捕获并显示错误
- database - 如何打开 DataFlex 2.3b .dat 文件
- python - 如何在应用程序启动的同时调用 python 后台作业