2013-07-31 17 views
12

Sto sviluppando un'applicazione interna che utilizza il Bluetooth per la stampa. Voglio che l'accoppiamento Bluetooth avvenga senza l'intervento dell'utente. Sono riuscito a farlo funzionare intrappolando la trasmissione android.bluetooth.device.action.PAIRING_REQUEST.Android impedisce la finestra di dialogo di accoppiamento Bluetooth

Nel mio ricevitore di trasmissione chiamo il metodo setPin e l'associazione funziona correttamente, ma un BluetoothPairingDialog viene visualizzato per un secondo o due, quindi scompare. Vedere il collegamento di seguito.

https://github.com/android/platform_packages_apps_settings/blob/master/src/com/android/settings/bluetooth/BluetoothPairingDialog.java

Dal momento che la trasmissione è non ordinato, non posso chiamare abortBroadcast(), e si chiedeva se ci fosse un altro modo per evitare che la finestra di abbinamento di apparire. Posso collegare in qualche modo il window manager?

+0

Ho lo stesso problema. Posso chiudere la finestra di dialogo senza l'input dell'utente chiamando device.cancelPairingUserInput(); device.setPairingConfirmation (true); ma solo dopo aver ricevuto l'azione BluetoothDevice.ACTION_BOND_STATE_CHANGED con lo stato BluetoothDevice.BOND_BONDING, quindi la finestra di dialogo viene visualizzata brevemente e quindi viene chiusa. –

risposta

3

Sinceramente non sono stato in grado di trovare un modo per farlo senza modificare il sdk. Se sei l'OEM, è facile (sono in 4.3):

In pacchetti/apps/Impostazioni/AndroidManifest.xml, commentare il filtro intenti per la finestra di abbinamento:

<activity android:name=".bluetooth.BluetoothPairingDialog" 
      android:label="@string/bluetooth_pairing_request" 
      android:excludeFromRecents="true" 
      android:theme="@*android:style/Theme.Holo.Dialog.Alert"> 
    <!-- <intent-filter> 
     <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> --> 
</activity> 

In quadri /base/core/java/android/bluetooth/BluetoothDevice.java rimuovere l'annotazione @hide javadoc da questa costante

@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 
public static final String ACTION_PAIRING_REQUEST = 
     "android.bluetooth.device.action.PAIRING_REQUEST"; 

e questo metodo

public boolean setPairingConfirmation(boolean confirm) 

Quindi registrare la propria attività o ricevitore di trasmissione per l'azione BluetoothDevice.PAIRING_REQUEST. Questo ricevitore trasmissione permette l'accoppiamento di continuare senza l'input dell'utente (solo se non è richiesta alcuna pin):

@Override 
public void onReceive(Context context, Intent intent) {  
    if(intent.getAction().equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) { 
     BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
     device.setPairingConfirmation(true); 
    } 
} 

Avrai bisogno di ricostruire la SDK e compilare il codice contro la nuova versione per ottenere l'accesso alla costante e metodi e sostituire Settings.apk nella partizione/system per disabilitare la finestra di dialogo. Potrebbe anche essere necessario eseguire l'app di sistema, ma penso che probabilmente non lo sia.

Problemi correlati