我有装置,该装置使用OBEX对象推送模式(OPP)通过蓝牙发送数据。
利用亚行logcat我看到我的Android设备接收的连接(而中止这方面?)
08-22 11:14:37.939: I/BtOppRfcommListener(22586): Accepted connectoin from 00:07:CF:5F:52:A0
08-22 11:14:37.939: I/BtOpp Service(22586): Start Obex Server
08-22 11:14:38.109: D/Obex ServerSession(22586): java.io.IOException: Software caused connection abort
08-22 11:14:38.109: D/PowerManagerService(180): @PowerManagement: 'BtOppObexServer' releaseWakeLock when screen locked
08-22 11:14:39.219: D/BluetoothEventLoop(180): Device property changed: 00:07:CF:5F:52:A0 property: Connected value: false
当我安装蓝牙文件传输(从市场的免费应用程序),那么我就能够接收文件。 但我不希望安装其他应用程序。
我相信我有(至少部分)解决方案,那么这应该允许文件通过OPP和自定义代码被截获增加。 第一步是去设置>应用程序>运行>蓝牙分享并杀死BluetoothOppService
然后我用反射来访问上的方法BluetoothAdapter
(下面的代码),其允许监听特定端口上。 这之后,我们可以截取传入OPP通信和与所述输入和输出流相互作用。 这个 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();