Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android BluetoothSocket写入在4.2.2上失败_Java_Android_Bluetooth - Fatal编程技术网

Java Android BluetoothSocket写入在4.2.2上失败

Java Android BluetoothSocket写入在4.2.2上失败,java,android,bluetooth,Java,Android,Bluetooth,我正在测试华硕MemoPad HD(4.2.2)和LG P769(4.1.2)。我写了一个简单的程序来说明我的问题: package wat.bluetoothtester; import java.util.*; import java.io.*; import android.app.Activity; import android.os.Bundle; import android.bluetooth.*; import android.view.*; import android.u

我正在测试华硕MemoPad HD(4.2.2)和LG P769(4.1.2)。我写了一个简单的程序来说明我的问题:

package wat.bluetoothtester;

import java.util.*;
import java.io.*;

import android.app.Activity;
import android.os.Bundle;
import android.bluetooth.*;
import android.view.*;
import android.util.*;

public class BluetoothTester extends Activity
{
    private final String ADDR = "00:02:72:C6:C2:3C";
    private final UUID _UUID = UUID.fromString("ca444490-3569-4c82-b505-defbc71e9868");

    private BluetoothSocket _socket;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void send(View v){
        try {
            this._socket.getOutputStream().write('x');
        }
        catch (IOException e){
            Log.e("", e.toString());
        }
    }

    public void connect(View v){
        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
        BluetoothDevice device = adapter.getRemoteDevice(ADDR);

        try {
            this._socket = device.createInsecureRfcommSocketToServiceRecord(_UUID);
            this._socket.connect();
        }
        catch (IOException e){
            Log.e("", e.toString());
        }
    }

    public void disconnect(View v){
        try {
            this._socket.close();
        }
        catch (IOException e){
            Log.e("", e.toString());
        }
    }
}
我知道它会阻塞,但这不是问题所在。得到了一个带有3个按钮的简单布局,您可以从代码中猜到。如果有必要,我会发帖的。我的计算机上还运行着一个简单的Python服务器,它只输出它接收到的任何数据,从不发送任何数据

无论如何,我第一次在我的4.2.2设备上运行它时,它工作得非常好。我可以随意连接和断开连接,发送数据,没有问题。现在,由于我正在开发一个应用程序,我必须经常将一个新的APK推送到设备上。一旦我这样做了,不管我是否断开连接,写操作开始失败。最奇怪的是,服务器实际上接收并打印数据,但write()调用仍然阻塞:

11-19 12:34:30.127: E/(3484): java.io.IOException: [JSR82] write: write() failed.
11-19 12:34:30.127: E/(3484):   at android.bluetooth.BluetoothSocket.write(BluetoothSocket.java:702)
11-19 12:34:30.127: E/(3484):   at android.bluetooth.BluetoothOutputStream.write(BluetoothOutputStream.java:56)
11-19 12:34:30.127: E/(3484):   at wat.bluetoothtester.BluetoothTester.send(BluetoothTester.java:29)
11-19 12:34:30.127: E/(3484):   at java.lang.reflect.Method.invokeNative(Native Method)
11-19 12:34:30.127: E/(3484):   at java.lang.reflect.Method.invoke(Method.java:511)
11-19 12:34:30.127: E/(3484):   at android.view.View$1.onClick(View.java:3633)
11-19 12:34:30.127: E/(3484):   at android.view.View.performClick(View.java:4243)
11-19 12:34:30.127: E/(3484):   at android.view.View$PerformClick.run(View.java:17520)
11-19 12:34:30.127: E/(3484):   at android.os.Handler.handleCallback(Handler.java:725)
11-19 12:34:30.127: E/(3484):   at android.os.Handler.dispatchMessage(Handler.java:92)
11-19 12:34:30.127: E/(3484):   at android.os.Looper.loop(Looper.java:153)
11-19 12:34:30.127: E/(3484):   at android.app.ActivityThread.main(ActivityThread.java:5299)
11-19 12:34:30.127: E/(3484):   at java.lang.reflect.Method.invokeNative(Native Method)
11-19 12:34:30.127: E/(3484):   at java.lang.reflect.Method.invoke(Method.java:511)
11-19 12:34:30.127: E/(3484):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
11-19 12:34:30.127: E/(3484):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
11-19 12:34:30.127: E/(3484):   at dalvik.system.NativeStart.main(Native Method)
很明显,这会引发IOException,即使数据已成功发送。这意味着程序在技术上可以工作,但是write()会阻塞UI大约10-15秒,直到抛出异常为止。我尝试将write()放入自己的线程中,然后创建一个TX缓冲区,它可以随意清空。这当然不会导致UI阻塞,但我需要等待write()超时,因此这也不会真正帮助我。这种情况一直持续到我重新启动设备。连接/断开两个传感器仍可以正常工作

这不会发生在我的4.1.2设备上,无论我上传了多少次新的APK或终止进程

我在使用BlueTerm时也证实了同样的问题,BlueTerm是一种用于RFCOMM串行连接的终端类型应用程序(实际上非常好,而且源代码也可用)


我已经将这两种设备都扎根了,我不想再继续下去了,但是有没有办法重新启动蓝牙服务或手动清除连接池,或者其他什么呢?

针对Android的联发科JNI实施效果不太好

  • (writenactive():很长时间没有看到转到)
它创建一个数组来存储连接上下文:

btmtk_jsr82_mmi_context_struct  g_jsr82MMIContext[JSR82_PORT_NUM];
创建新套接字时,它使用第一个上下文位置not inUse,除非正确关闭套接字(请注意这是一个共享服务),否则inUse标志不会清除

问题在于,似乎只有g_jsr82MMIContext[0]在写入()结束时正确地接收事件&u JSR82_MMI_TX_READY_IND事件

套接字文件描述符似乎是硬编码的,并且gèU jsr82MMIContext[0]处的套接字为0x8000,因此通过反射,您可以“伪造”该套接字并关闭它以清除gèU jsr82MMIContext[0]。使用标志,以便下次可以使用它

    public void connect(View v){

        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
        BluetoothDevice device = adapter.getRemoteDevice(ADDR);

        try {
            BluetoothSocket bs = device.createRfcommSocketToServiceRecord(_UUID);
            Field f = bs.getClass().getDeclaredField("mFdHandle");
            f.setAccessible(true);
            f.set(bs, 0x8000);
            bs.close();
            Thread.sleep(2000); // Just in case the socket was really connected 
        } catch (Exception e) {
            Log.e(TAG, "Reset Failed", e);
        } 

        try {
            this._socket = device.createRfcommSocketToServiceRecord(_UUID);
            this._socket.connect();
        } catch (IOException e) {
            Log.e(TAG, "create() failed", e);
        }
    }

jla方法适用于单个蓝牙连接。 如果存在多个蓝牙连接,例如两个连接,则该方法将断开两个连接,而不是特定连接


有人有办法解决不止一个连接情况吗?

我只有在4.2上有相同的问题。你能找到解决这个问题的方法吗?我也被困在这个问题上了。有人找到解决办法了吗?嗨,同样的问题。有人找到解决办法了吗?嗨,我也有类似的问题。你找到解决办法了吗?谢谢嘿,你找到解决办法了吗?