我正在开发一个使用蓝牙进行打印的内部应用程序。我想在没有用户输入的情况下进行蓝牙配对。我设法通过捕获android.bluetooth.device.action.PAIRING_REQUEST
广播来实现这一目标。
在我的广播接收器中,我调用了setPin方法,配对工作正常,但是BluetoothPairingDialog
会显示一两秒钟,然后消失 - 请参阅下面的链接。
由于广播是非订购的,我无法呼叫abortBroadcast()
,并且想知道是否还有其他方法可以防止出现配对对话框。我能以某种方式挂钩窗口管理器吗?
答案 0 :(得分:3)
老实说,我没有能够在不修改sdk的情况下想出办法。如果您是OEM,那很简单(我在4.3上):
在packages / apps / Settings / AndroidManifest.xml中,注释配对对话框的intent过滤器:
<activity android:name=".bluetooth.BluetoothPairingDialog"
android:label="@string/bluetooth_pairing_request"
android:excludeFromRecents="true"
android:theme="@*android:style/Theme.Holo.Dialog.Alert">
<!-- <intent-filter>
<action android:name="android.bluetooth.device.action.PAIRING_REQUEST" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter> -->
</activity>
在frameworks / base / core / java / android / bluetooth / BluetoothDevice.java中从这个常量中删除@hide javadoc注释
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_PAIRING_REQUEST =
"android.bluetooth.device.action.PAIRING_REQUEST";
和这个方法
public boolean setPairingConfirmation(boolean confirm)
然后为BluetoothDevice.PAIRING_REQUEST操作注册您自己的活动或广播接收器。该广播接收器允许在没有用户输入的情况下继续配对(仅当不需要引脚时):
@Override
public void onReceive(Context context, Intent intent) {
if( intent.getAction().equals(BluetoothDevice.ACTION_PAIRING_REQUEST) ) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
device.setPairingConfirmation( true );
}
}
您需要重新构建sdk并针对新版本编译代码以访问常量和方法,并替换/ system分区上的Settings.apk以禁用该对话框。您可能还需要作为系统应用程序运行,但我认为可能不会。