我相信我(至少有一部分)的解决方案应该允许通过OPP和自定义代码添加拦截文件。第一步是去设置>应用>运行>蓝牙共享和杀BluetoothOppService
然后我用反射到上BluetoothAdapter(下面的代码),其允许监听特定端口上访问的方法。之后,我们可以拦截传入的OPP通信并与输入和输出流进行交互。 This SO螺纹将与OPP通信部分帮助,但作为一个初始步骤I读出的数据流,并用OPP“OK”消息reponded即os.writeByte(ObexSession.OBEX_SUCCESS | ObexSession.OBEX_FINAL_BIT);
// simplified exception handling
public class BluetoothAdapterProxy
{
public static final int CHANNEL_OPP = 12;
final BluetoothAdapter target;
static final Class> targetClass = BluetoothAdapter.class;
Method listenOn;
public BluetoothAdapterProxy(BluetoothAdapter target)
{
this.target = target;
Class>[] args = new Class[] { int.class };
try
{
this.listenOn = targetClass.getDeclaredMethod(
"listenUsingRfcommOn", args);
}
catch (NoSuchMethodException e)
{
e.printStackTrace();
}
}
public BluetoothServerSocket listenUsingRfcommOn(int channel)
{
try
{
return (BluetoothServerSocket) (listenOn.invoke(target,
new Object[] { channel }));
}
catch (Exception e)
{
// complain loud, complain long
throw new RuntimeException(ex);
}
}
}
用法:初始化使用
serverSocket = new BluetoothAdapterProxy(BluetoothAdapter.getDefaultAdapter())
.listenUsingRfcommOn(BluetoothAdapterProxy.CHANNEL_OPP);
之后,从单独的Thread(以防止阻止)和远程设备可以通过socket = serverSocket.accept();