我通常使用这个
private void ensureDiscoverable() {
if(D) Log.d(TAG, "ensure discoverable");
if (mBluetoothAdapter.getScanMode() !=
BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
}
}
但是这会提示用户确认。有没有办法以编程方式绕过这个?
另外,我认为“总是可以发现mode”没有“新闻”?
答案 0 :(得分:6)
经过一些研究后,我得出结论,在没有用户交互的情况下设置可发现的超时,它只能通过root访问(如前面的答案中已经提到的那样)。但是对于需要的人来说,这是必要的解决方案:
private void ensureBluetoothDiscoverability() {
try {
IBluetooth mBtService = getIBluetooth();
Log.d("TESTE", "Ensuring bluetoot is discoverable");
if(mBtService.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
Log.e("TESTE", "Device was not in discoverable mode");
try {
mBtService.setDiscoverableTimeout(100);
// mBtService.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, 1000);
} catch(Exception e) {
Log.e("TESTE", "Error setting bt discoverable",e);
}
Log.i("TESTE", "Device must be discoverable");
} else {
Log.e("TESTE", "Device already discoverable");
}
} catch(Exception e) {
Log.e("TESTE", "Error ensuring BT discoverability", e);
}
}
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
然后创建一个新的软件包android.bluetooth,将两个文件放在IBluetooth.aidl和IBluetoothCallback.aidl中,并将代码放在here内。
这将允许访问标准API上不可用的功能,但对于其中一些功能,您将需要“编写安全设置”的权限(上面的注释行是您因缺乏权限而获得该异常的地方)进程/用户)。
答案 1 :(得分:2)
这就是我所做的,对我来说效果很好:
方法:
public void makeDiscoverable (int timeOut){
Class <?> baClass = BluetoothAdapter.class;
Method [] methods = baClass.getDeclaredMethods();
Method mSetScanMode = methods[44];
try {
mSetScanMode.invoke(Util.mBluetoothAdapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeOut);
} catch (Exception e) {
Log.e("discoverable", e.getMessage());
}
}
添加权限:
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
答案 2 :(得分:1)
没什么 - 它仍然需要用户确认。
始终可被发现的是电池消耗 - 因此没有简单的解决方案 这也是一个隐私问题。 最好问问用户。