2012-07-16 39 views
21

Estoy tratando de enviar un archivo a través de bluetooth en un dispositivo Android. He hecho descubrimiento, conexión y he hecho un socket bluetooth. El problema es cuando estoy escribiendo la matriz de bytes en la secuencia de salida del socket bluetooth, el lado que recibe no recibe nada, aunque acepta que algo está siendo enviado.Android Bluetooth enviando archivo

Esto es lo que hace Iam (malo es el adaptador Bluetooth)

Por favor avise.

try 
    { 
     BluetoothDevice dev = bad.getRemoteDevice(a); 
     bad.cancelDiscovery(); 

     dev.createRfcommSocketToServiceRecord(new UUID(1111, 2222)); 
     Method m = dev.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
     bs = (BluetoothSocket) m.invoke(dev, Integer.valueOf(1)); 
     bs.connect(); 
     tmpOut = bs.getOutputStream(); 
    }catch(Exception e) 
    { 

    } 

    File f = new File(filename); 

    byte b[] = new byte[(int) f.length()]; 
    try 
    { 
     FileInputStream fileInputStream = new FileInputStream(f); 
     fileInputStream.read(b); 
    }catch(IOException e) 
    { 
     Log.d(TAG, "Error converting file"); 
     Log.d(TAG, e.getMessage()); 
    } 

    try { 
     tmpOut.write(b); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

¿Qué se hace esto para: dev.createRfcommSocketToServiceRecord (nuevo UUID (1111, 2222)) ;? Usted crea un BluetoothSocket usando un UUID sin usarlo. Método m = dev.getClass(). GetMethod ("createRfcommSocket", new Class [] {int.class}); bs = (BluetoothSocket) m.invoke (dev, Integer.valueOf (1)); Abre un BluetoothSocket en el RfComm Channel 1. Entonces, solo si el dispositivo al que está intentando enviar un archivo está escuchando en este canal, podrá recibir el archivo – Weeman

+0

OK, eliminé esa línea ahora, pero aún no funciona. Lancé el modo de depuración y me muestra que mi tmpOut (outputstream) es nulo. ¿Soes esto significa un problema con mi zócalo bluetooth? Además, ¿un dispositivo escucha en el canal RFComm 1 de manera predeterminada o también necesito tener un receptor en el dispositivo receptor? Solo quería enviar un archivo que podría ser recibido por el servicio bluetooth predeterminado de otro teléfono. – exorcist

+1

Las aplicaciones comunes, como la transferencia de archivos, se especifican en los denominados perfiles Bluetooth (http://en.wikipedia.org/wiki/Bluetooth_profile), por lo que si desea transferir un archivo utilizando el "servicio bluetooth predeterminado", debe hacerlo de acuerdo con el perfil OBEX que se utiliza para transer archivos (http://en.wikipedia.org/wiki/OBEX) – Weeman

Respuesta

0

puede ser porque dev y Bs Ir fuera de alcance antes tmpout se utiliza debido a que se declaran dentro de su bloque try/catch.

3

Estoy utilizando el código de abajo cortado con tijeras para conectarse al servicio en serie en un dispositivo Bluetooth remoto y está trabajando muy bien para mí. Sólo asegúrese de que el otro dispositivo (puede ser móvil o PC) tiene un socket de servidor para la comunicación en serie a través de Bluetooth (ver el código del lado del servidor abajo)

del lado del cliente: Lado

UUID serialUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
BluetoothDevice btDevice = btAdapter.getRemoteDevice(BTAddress); // Get the BTAddress after scan 
BluetoothSocket btSocket = btDevice.createRfcommSocketToServiceRecord(SERIAL_UUID); 
btSocket.connect(); 
InputStream iStream = btSocket.getInputStream(); 
OutputStream oStream = btSocket.getOutputStream(); 

servidor :

UUID serialUUID = new UUID("1101", true); 
String serviceURL = "btspp://localhost:" + serialUUID 
     + ";name=Android BT Server;authorize=false;authenticate=false"; 
StreamConnectionNotifier connectionNotifier = (StreamConnectionNotifier) Connector 
         .open(serviceURL); 
// Blocking method will wait for client to connect 
StreamConnection connection = connectionNotifier.acceptAndOpen(); 

RemoteDevice remoteDevice = RemoteDevice.getRemoteDevice(connection); 
InputStream btInput = connection.openInputStream(); 
OutputStream btOutput = connection.openOutputStream(); 
+0

¿Qué ocurre si deseo enviar datos al adaptador de impresora Bluetooth (por ejemplo, HP bt500)? ¿Dónde podría escribir el código del servidor? – FARID

1

por qué no utilizar la llamada API estándar en lugar de llamar a través de la reflexión, por ejemplo:

BluetoothSocket socket = destination 
           .createRfcommSocketToServiceRecord(new UUID(...)) ; 

también el bloque catch está vacía. ¿Estás seguro de que el enchufe está conectado sin excepción? Connect lanzará IOException si la conexión falla por alguna razón. Ver este link