2014-12-16 8 views
3

코드로 페어링을 시도하고 있으며 일반 장치에서만 작동합니다. 블루투스 스캐너를 사용하면 페어링 할 수 있지만 Android 설정으로 이동하여 입력 장치 확인란을 선택할 때까지 장치가 작동하지 않습니다. 코드로 어떻게 할 수 있습니까?Android 블루투스 패어 링 입력 장치

감사합니다.

여기 내 페어링 코드 :

public static BluetoothSocket createL2CAPBluetoothSocket(String address, int psm){ 
    return createBluetoothSocket(TYPE_L2CAP, -1, false,false, address, psm); 
} 
// method for creating a bluetooth client socket 
private static BluetoothSocket createBluetoothSocket(
     int type, int fd, boolean auth, boolean encrypt, String address, int port){ 
    try { 
     Constructor<BluetoothSocket> constructor = BluetoothSocket.class.getDeclaredConstructor(
       int.class, int.class,boolean.class,boolean.class,String.class, int.class); 
     constructor.setAccessible(true); 
     BluetoothSocket clientSocket = (BluetoothSocket) 
       constructor.newInstance(type,fd,auth,encrypt,address,port); 
     return clientSocket; 
    }catch (Exception e) { return null; } 
} 

private void doPair(final BluetoothDevice device, final int deviceTag) { 
    try { 
     Method method = device.getClass().getMethod("createBond", 
       (Class[]) null); 
     method.invoke(device, (Object[]) null); 
    } catch (Exception e) { 
     Log.e(LOG_TAG, "Cannot pair device", e); 
    } 

    BroadcastReceiver mReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { 
       final int state = intent.getIntExtra(
         BluetoothDevice.EXTRA_BOND_STATE, 
         BluetoothDevice.ERROR); 
       final int prevState = intent.getIntExtra(
         BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, 
         BluetoothDevice.ERROR); 

       if (state == BluetoothDevice.BOND_BONDED 
         && prevState == BluetoothDevice.BOND_BONDING) { 
        Log.d(LOG_TAG, "Paired with new device"); 
        if (listener != null) { 
         listener.onBluetoothPairedDeviceChange(bluetoothAdapter 
           .getBondedDevices().iterator().next() 
           .getName(), deviceTag); 
        } 
        context.unregisterReceiver(this); 
       } else if (state == BluetoothDevice.BOND_NONE 
         && prevState == BluetoothDevice.BOND_BONDING) { 
        Log.d(LOG_TAG, "Cannot pair with new device"); 
        if (listener != null) { 
         listener.onBluetoothStatusChange(BluetoothHelper.IDLE_STATUS); 
        } 
        context.unregisterReceiver(this); 
       } 
      } 
     } 

    }; 

    IntentFilter intent = new IntentFilter(
      BluetoothDevice.ACTION_BOND_STATE_CHANGED); 
    context.registerReceiver(mReceiver, intent); 
} 

답변

0

첫째, API 19 후 대상 버전이, 당신이 사용하는 반사하지 않고 직접 장치를 페어링 BluetoothDevice.createBond()를 사용할 수 있는지. 다음 방법은! 안드로이드 6.0 전에 장치에서 작동

BluetoothAdapter.getDefaultAdapter().getProfileProxy(MainActivity.this, new BluetoothProfile.ServiceListener() { 
    @Override 
    public void onServiceConnected(int profile, BluetoothProfile proxy) { 
      Class<?> clazz = null; 
      try { 
       clazz = Class.forName("android.bluetooth.BluetoothInputDevice"); 
       Object obj = clazz.cast(proxy); 
       Method connectMethod = clazz.getDeclaredMethod("connect",BluetoothDevice.class); 
       boolean resultCode = (boolean) connectMethod.invoke(obj,device); 
       Method setPriority = clazz.getDeclaredMethod("setPriority",BluetoothDevice.class,int.class); 
       setPriority.invoke(obj,device,1000); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } catch (NoSuchMethodException e) { 
       e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
    } 

    @Override 
    public void onServiceDisconnected(int profile) { 
      Log.d("wtf","onservice disconnected "+profile); 
    } 
},INPUT_DEVICE); 

final int INPUT_DEVICE = 4; // this is hidden memeber in BluetoothDevice 
+0

나를 위해 작동하지 않는이 있습니다. 아무것도 추가하면 업데이트하십시오 (6.0 후, 시스템은 이러한 방법을 호출하는 외부 응용 프로그램을 방지하기 위해 일부 발신자 확인을 할 것입니다) 추가해야합니다. – Manmohan