如何在没有用户确认的情况下以编程方式设置可发现时间?

时间:2012-01-05 12:50:52

标签: java android bluetooth

我通常使用这个

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”没有“新闻”?

3 个答案:

答案 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)

没什么 - 它仍然需要用户确认。

始终可被发现的是电池消耗 - 因此没有简单的解决方案 这也是一个隐私问题。 最好问问用户。