安卓蓝牙:java.io.IOException: 服务发现失败

4
我正在开发一款Android应用程序,可以将图像从一个设备传输到另一个设备。接收到的图像将显示在我的应用程序中的ImageView上。为了完成任务,我打算发送位图的字节数组。我能够在ImageView上获取第一张图片。但是,当我单击按钮发送另一个图像时,应用程序无法发送位图,并显示异常“java.io.IOException:Service fiscovery failed。”要成功发送任何图像,我需要重新启动接收/远程设备上的应用程序。请问有没有人能提供解决方案?下面附上logcat日志。
建立连接的代码如下:
        private class StartConnectionThread extends Thread{
    private final BluetoothSocket bluetoothSocket;
    private final BluetoothDevice bluetoothDevice;
    public StartConnectionThread(BluetoothDevice device){
        BluetoothSocket tempBluetoothSocket=null;
        bluetoothDevice=device;
        try
        {
            System.out.println(uuid);
            tempBluetoothSocket=device.createRfcommSocketToServiceRecord(uuid);
        }
        catch(IOException ioException)
        {

        }
        bluetoothSocket=tempBluetoothSocket;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        bluetoothAdapter.cancelDiscovery();
        try
        {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            bluetoothSocket.connect();

        }
        catch(IOException ioException)
        {
            System.out.println("bluetoothSocketInThread failed");
            try
            {
                bluetoothSocket.close();
            }
            catch(IOException cancelIOException)
            {

            }
            return;
        }
        manageConnectedSocket(bluetoothSocket);
    }
    public void cancel()
    {
        try
        {
            bluetoothSocket.close();
        }
        catch(IOException ioException)
        {

        }
    }
}

接受连接的代码:

        private class AcceptConnectionThread extends Thread
{
    private final BluetoothServerSocket bluetoothServerSocket;
    public AcceptConnectionThread() {
        // TODO Auto-generated constructor stub
        System.out.println("constructor");
        BluetoothServerSocket tempBluetoothServerSocket=null;
        try
        {
            tempBluetoothServerSocket=bluetoothAdapter.listenUsingRfcommWithServiceRecord("My Souvenirs", uuid);
        }
        catch(IOException ioException)
        {
        }
        bluetoothServerSocket=tempBluetoothServerSocket;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        BluetoothSocket bluetoothSocket=null;
        while(true)
        {
            try
            {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(bluetoothServerSocket);
                if(bluetoothServerSocket!=null)
                {
                    bluetoothSocket=bluetoothServerSocket.accept();
                }
                System.out.println("accept");
            }
            catch(IOException ioException){
                break;
            }
            if(bluetoothSocket!=null)
            {
                manageConnectedSocket(bluetoothSocket);
                try {
                    bluetoothServerSocket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                break;
            }
        }
    }
    public void cancel()
    {
        try{
            bluetoothServerSocket.close();
        }
        catch(IOException ioException){

        }
    }

}

管理连接的代码:

        private class ManageConnectedDevicesThread extends Thread
{
    private final BluetoothSocket connectedBluetoothSocket;
    public ManageConnectedDevicesThread(BluetoothSocket socket) {
        // TODO Auto-generated constructor stub
        connectedBluetoothSocket=socket;
        InputStream tempInputStream=null;
        OutputStream tempOutputStream=null;
        try
        {
            tempInputStream=socket.getInputStream();
            tempOutputStream=socket.getOutputStream();
        }
        catch(IOException ioException)
        {

        }
        inputStream=tempInputStream;
        outputStream=tempOutputStream;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
                    byte[] buffer=new byte[1024*8];
        int bytes;
        while(true)
        {
            try
            {
                bytes=inputStream.read(buffer);
                handler.obtainMessage(MESSAGE_READ,bytes,-1,buffer).sendToTarget();
                System.out.println("handler");
            }
            catch(IOException ioException)
            {
                System.out.println("for handler:" +ioException);
                break;
            }
        }
    }
    public void write(byte[] bytes)
    {
        try
        {
            outputStream.write(bytes);
        }
        catch(IOException ioException){
            System.out.println("exception in wrie tatement of managing connections");
        }

    }


    public void close()
    {
        try {
            connectedBluetoothSocket.close();
        } catch (IOException e) {
            // TODO: handle exception
        }
    }
}

重置连接的代码:

            void resetConnection()  
    {
        if(inputStream!=null)
        {
            try {
                inputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                        }
        }
        if(outputStream!=null)
        {
            try {
                outputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(startConnectionThread!=null)
        {
            System.out.println("start wala active tha");
            startConnectionThread.cancel();
        }
        if(acceptConnectionThread!=null)    
        {
            System.out.println("accept wala active tha");
            acceptConnectionThread.cancel();
        }
        if(manageConnectedDevicesThread!=null)
        {
            System.out.println("manage wala active tha");
            manageConnectedDevicesThread.close();
        }
    }

}

下面是处理程序的代码:

    private final Handler handler=new Handler(){
public void handleMessage(Message msg) {
    switch (msg.what) {
    case MESSAGE_READ:
        System.out.println("MESSAGE_READ");
        byte[] readBuf = (byte[]) msg.obj;
        // construct a string from the valid bytes in the buffer
        String readMessage = new String(readBuf, 0, msg.arg1);
        byte[] b=readMessage.getBytes();
        Bitmap bitmap1=BitmapFactory.decodeByteArray(readBuf, 0, readBuf.length);
        imageView.setImageBitmap(bitmap1);
        break;
    }

};

日志显示如下:

    01-25 14:49:31.800: D/dalvikvm(9451): Debugger has detached; object registry had 1 entries
    01-25 14:49:38.380: V/BluetoothSocket.cpp(9451): initSocketNative
    01-25 14:49:38.380: V/BluetoothSocket.cpp(9451): ...fd 40 created (RFCOMM, lm = 26)
    01-25 14:49:38.380: V/BluetoothSocket.cpp(9451): initSocketFromFdNative
    01-25 14:49:40.420: D/BluetoothUtils(9451): isSocketAllowedBySecurityPolicy start : device null
    01-25 14:49:41.680: I/System.out(9451): bluetoothSocketInThread failed
    01-25 14:49:41.680: V/BluetoothSocket.cpp(9451): abortNative
    01-25 14:49:41.680: V/BluetoothSocket.cpp(9451): ...asocket_abort(40) complete
    01-25 14:49:41.680: V/BluetoothSocket.cpp(9451): destroyNative
    01-25 14:49:41.680: V/BluetoothSocket.cpp(9451): ...asocket_destroy(40) complete

提前感谢您。


你能告诉我如何解决这个问题吗?我非常绝望... - Saeed Entezari
1
抱歉回复晚了。由于服务连接需要几毫秒的时间来执行,请等待大约一秒钟,然后运行您的代码。然后系统将检测到已连接的服务。 - Varun Kumar
谢谢你,我会尝试的。 - Saeed Entezari
1个回答

6
也许你可以尝试添加 thread.sleep 一秒钟?请参见this discussion

“我能解决这个问题的唯一方法是在关闭连接之前添加一个 thread.sleep 一秒钟。”

另请参见丹在this thread上的连续两条评论:

“只有将 findBT(); openBT(); 的调用分开后,我才能使它运行。

否则,mmSocket.connect(); 将抛出异常,“服务发现失败”。

但如果我将 findBT() 放在 onCreate() 中,并仅使用按钮打开 openBT(),它就可以正常工作。

或者,如果我制作第二个按钮,一个用于每个按钮,它也可以正常工作。

有什么建议吗?”

来自第二个评论的摘录:
Set pairedDevices = mBluetoothAdapter.getBondedDevices();
mmDevice = mBluetoothAdapter.getRemoteDevice(“00:06:66:46:5A:91″);
if (pairedDevices.contains(mmDevice))
{
statusText.setText(“Bluetooth Device Found, address: ” + mmDevice.getAddress() );
Log.d(“ArduinoBT”, “BT is paired”);
}

where I entered the address of my Bluetooth device. The original code finds the device and returns the correct address, but mmSocket.connect(); generates an exception “java.io.IOException: Service discovery failed”

Suggestions?


谢谢,它解决了我的问题。现在我在同一个应用程序中遇到另一个问题。下一个问题的链接如下:http://stackoverflow.com/questions/21568601/successive-transfer-of-bitmap-via-bluetooth-generate-multiple-inputstream-read希望您也能帮助我解决这个问题。再次感谢。 - Varun Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接