Autore Topic: Applicazione Bluetooth_Dispositivi  (Letto 2054 volte)

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Applicazione Bluetooth_Dispositivi
« il: 30 Gennaio 2012, 17:56:48 CET »
0
Salve a tutti ,
ho l'intento di realizzare una piccola applicazione bluetooth per i dispositivi Android , ed a questo scopo sto studiando la  BluetoothChat.
Ho notato che premendo il tasto menu compaiono i dispositivi precedentemente accoppiati oppure c'è la possibilità di cercare dei nuovi dispositivi in "zona".
La domanda che voglio porVi è la seguente : esiste(o c'è la possibilità) qualche metodo (o qualche classe) che permette di verificare quali tra i dispositivi accoppiati sono alla portata di una connessione bluetooth, ovviamente senza provare a connettersi?

In poche parole vorrei visualizzare la lista dei dispositivi accoppiati , ma tra questi sapere se sono effettivamente alla portata del mio dispositivo, poichè in questa lista compaiono tutti i terminali con cui mi sono collegato in precedenza anche se in un secondo momento i due cellulari si trovano a km di distanza.
Morotti Alessio

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #1 il: 30 Gennaio 2012, 18:12:41 CET »
0
Premetto che non lo so per certo, ma credo non ci sia modo. Per sapere se un terminale è in zona l'unico modo è provare a connettersi, ed anche in quel caso occorre che abbia il BlueTooth attivo. Conosci qualche applicazione BT che implementa questa caratteristica?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #2 il: 30 Gennaio 2012, 23:50:22 CET »
0
Premetto che anch'io non ho mai provato, ma nella documentazione c'è scritto:
Citazione
To get a BluetoothDevice, use BluetoothAdapter.getRemoteDevice(String) to create one representing a device of a known MAC address (which you can get through device discovery with BluetoothAdapter) or get one from the set of bonded devices returned by BluetoothAdapter.getBondedDevices(). 

Quindi, una volta ottenuta la lista con il metodo getBondedDevices() potresti provare ad usare il metodo getBondState() per ogni BluetoothDevice della lista. Se non dovesse funzionare, in alternativa potresti avviare la scansione, (che mi pare non richieda l'autorizzazione all'utente, a patto di avere il bluetooth attivo) e, appena ricevi un nuovo device nel broadcast receiver, controlli che faccia parte della lista dei dispositivi accoppiati.  ;-)

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Applicazione Bluetooth_Dispositivi
« Risposta #3 il: 01 Febbraio 2012, 16:19:08 CET »
0
Premetto che non lo so per certo, ma credo non ci sia modo. Per sapere se un terminale è in zona l'unico modo è provare a connettersi, ed anche in quel caso occorre che abbia il BlueTooth attivo. Conosci qualche applicazione BT che implementa questa caratteristica?

No non ne conosco di applicazioni che forniscono questo tipo di servizio, quello che vorrei realizzare è appunto una cosa del genere, ma sembra davvero difficile.
Premetto che anch'io non ho mai provato, ma nella documentazione c'è scritto:
Quindi, una volta ottenuta la lista con il metodo getBondedDevices() potresti provare ad usare il metodo getBondState() per ogni BluetoothDevice della lista. Se non dovesse funzionare, in alternativa potresti avviare la scansione, (che mi pare non richieda l'autorizzazione all'utente, a patto di avere il bluetooth attivo) e, appena ricevi un nuovo device nel broadcast receiver, controlli che faccia parte della lista dei dispositivi accoppiati.  ;-)

Con getBondState() verifico se quel dispositivo è stato in precedenza accoppiato con il mio , ma non verifico se è disponibile per la connessione.
Morotti Alessio

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #4 il: 01 Febbraio 2012, 16:23:01 CET »
0
Eh sì.  :D
Mi sa che l'unica alternativa sia la seconda che ho scritto, allora.

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Applicazione Bluetooth_Dispositivi
« Risposta #5 il: 01 Febbraio 2012, 17:18:36 CET »
0
Si devo lavorare sulla seconda opzione che è molto interessante.
Morotti Alessio

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Applicazione Bluetooth_Dispositivi
« Risposta #6 il: 08 Febbraio 2012, 10:53:35 CET »
0
Detto questo , partendo sempre dalla classe BluetoothChat, sto cercando di realizzare una classe che scorrendo la lista dei dispositivi accoppiati tenta di connettersi ad ognuno in maniera da verificare quelli che sono poi effettivamente alla portata del mio dispositivo.
Codice (Java): [Seleziona]
//Funzione per scoprire quali device sono a portata di connesione
    public void ConnectionForAllDevice(Set<BluetoothDevice> pairedDevices){
       
        for (BluetoothDevice device : pairedDevices) {
                        String address = device.getAddress();
                        // Create the result Intent and include the MAC address
                        Intent intent = new Intent();
                        intent.putExtra(EXTRA_DEVICE_ADDRESS, address);
                        //"RESULT_OK", operazione riuscita
                        //setResult, fornisce un risultato al chiamante
                        setResult(Activity.RESULT_OK, intent);
                        try{
                                Thread.sleep(10000);
                        }catch(Exception e){
                                Log.e("Error",e.getMessage());
                    }
                        finish();
        }
    }

Il problema che il dispositivo prova a connettersi solamente con il primo dispositivo della lista.
Quale puo' essere la soluzione più ragionevole?
Morotti Alessio

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #7 il: 08 Febbraio 2012, 11:04:33 CET »
0
Il metodo non funziona perché cambi continuamente il contenuto dell'extra dell'intent e al termine hai solo l'ultimo device della lista. Il result viene inviato all'activity chiamante solo quando richiami il finish (a patto di metterlo al di fuori del ciclo for).
Comunque, la soluzione più ragionevole, come scrissi in un post precedente, è prendere la lista dei dispositivi già accoppiati, avviare la scansione e man mano che ricevi un nuovo dispositivo nell'onReceive controllare se è contenuto nella lista dei dispositivi già accoppiati.
« Ultima modifica: 08 Febbraio 2012, 12:23:47 CET da Verandi »

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #8 il: 08 Febbraio 2012, 11:32:29 CET »
0
Il metodo non funziona perché cambi continuamente il contenuto dell'extra dell'intent e al termine hai solo l'ultimo device della lista. Il result viene inviato all'activity chiamante solo quando richiami il finish.
Comunque, la soluzione più ragionevole, come scrissi in un post precedente, è prendere la lista dei dispositivi già accoppiati, avviare la scansione e man mano che ricevi un nuovo dispositivo nell'onReceive controllare se è contenuto nella lista dei dispositivi già accoppiati.
sicuro della parte in grassetto? io non credo, piu che altro credo la risposta venga utilizzata solo al finish()!
confermo che la soluzione migliore è questa appena detta da te,l'altra ti occupa tempo e risorse per niente!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #9 il: 08 Febbraio 2012, 11:37:08 CET »
0
Comunque, la soluzione più ragionevole, come scrissi in un post precedente, è prendere la lista dei dispositivi già accoppiati, avviare la scansione e man mano che ricevi un nuovo dispositivo nell'onReceive controllare se è contenuto nella lista dei dispositivi già accoppiati.

Sono d'accordo.

Unico dubbio che ho (effettivamente è una cosa che mi chiedo da un po') è che i terminali Android hanno una discoverability che deve essere abilitata esplicitamente e comunque dura solo qualche minuto. Potrebbe accadere che un terminale sia in range, ma non appaia nella scansione?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #10 il: 08 Febbraio 2012, 11:38:11 CET »
0
sicuro della parte in grassetto? io non credo, piu che altro credo la risposta venga utilizzata solo al finish()!

Sì, intendevo che l'extra viene cambiato continuamente durante il ciclo, ma l'intent viene inviato solo una volta richiamato il finish() e patto di richiamare il setResult(), che va ad aggiornare sia il result code che l'intent da passare all'onActivityResult(). No?
« Ultima modifica: 08 Febbraio 2012, 12:08:18 CET da Verandi »

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #11 il: 08 Febbraio 2012, 12:05:34 CET »
0
Sono d'accordo.

 Potrebbe accadere che un terminale sia in range, ma non appaia nella scansione?

Stessa cosa a cui ho pensato anch'io mentre scrivevo. Tuttavia, seguendo il modello della bluetoothchat che ha un thread in attesa di connessioni, usando la "ricerca tramite connessioni", l'applicazione deve comunque essere aperta e il thread di attesa avviato per rendere "presente" il dispositivo. Quindi tanto vale usare la visibilità e magari permettere all'utente di rendere ancora visibile il dispositivo quando il tempo di visibilità è scaduto.
In più, usando il primo metodo si dovrebbe modificare la gestione dei thread della bluetooth chat in quanto, una volta avvenuta la connessione, il thread di attesa connessione viene interrotto e si avvia il thread in attesa di input. Bisognerebbe distinguire una connessione effettuata per testare la presenza del dispositivo da una connessione effettuata per scambiare veramente dati. Però magari esistono altri metodi di connessione, che però non conosco e non ho mai provato.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #12 il: 08 Febbraio 2012, 12:10:02 CET »
0
Sì, intendevo che l'extra viene cambiato continuamente durante il ciclo, ma l'intent viene inviato solo una volta richiamato il finish() e patto di richiamare il setResult(), che va ad aggiornare sia il result code che l'intent da passare all'onActivityResult(). No?
da quel che ho capito io,l'intent viene inviato comunque, mi pare di aver fatto anche delle prove e aver visto che vien mandato due volte...
ad ogni modo, riguardo a ciò che dice bradipao io credo che per i bonded device non serve la discoverability, ma non ne sono sicuro.
fai una prova!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #13 il: 08 Febbraio 2012, 12:21:07 CET »
0
da quel che ho capito io,l'intent viene inviato comunque, mi pare di aver fatto anche delle prove e aver visto che vien mandato due volte...
ad ogni modo, riguardo a ciò che dice bradipao io credo che per i bonded device non serve la discoverability, ma non ne sono sicuro.
fai una prova!

Intendi che richiamando il setResult() due volte consecutivamente, l'onActivityResult() viene richiamato altrettante volte?
Però nel codice della classe activity il setResult() aggiorna solo l'intent e il result code:
Codice (Java): [Seleziona]
 public final void setResult(int resultCode, Intent data) {

        synchronized (this) {
            mResultCode = resultCode;
            mResultData = data;
        }

 }

Quindi immagino che il tutto venga inviato solo al finish().

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Applicazione Bluetooth_Dispositivi
« Risposta #14 il: 08 Febbraio 2012, 15:53:38 CET »
0
effettivamente sembra sia cosi... strano, mi ricordavo di aver fatto delle prove e di aver visto un comportamento diverso... magari erano differenti le mie prove... :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia