1
votes

i want to search and listing bluetooth devices in android, my program now able to list all the active devices but not able to send pairing request to the other devices .I want to implement this onItemClick of list element.And also if bluetooth is not enabled of my device then show a permission to active device,if i go for yes then ok,but if i go for no then permission show again until i press yes..how can i do this?plz help with code..here is my code..

public class Main extends Activity  {  
    TextView out;
      private static final int REQUEST_ENABLE_BT = 1;
      private BluetoothAdapter btAdapter; 
      private ArrayList<BluetoothDevice> btDeviceList = new ArrayList<BluetoothDevice>();
      private ArrayList<String> mylist= new ArrayList<String>();
      private ListView lv;
      private Button btn;
     public Parcelable[] uuidExtra;

      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

      }

      public void search(View view)
      {
          //Register the BroadcastReceiver
            IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
            filter.addAction(BluetoothDevice.ACTION_UUID);
            filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
            filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
            registerReceiver(ActionFoundReceiver, filter); // Don't forget to unregister during onDestroy

            // Getting the Bluetooth adapter
            btAdapter = BluetoothAdapter.getDefaultAdapter();
            Toast.makeText(getApplicationContext(),"\nAdapter: " + btAdapter,5000).show();

            CheckBTState();
      }

      private void setDeviceList(ArrayList<String> list) {
          lv = (ListView) findViewById(R.id.listView);
            ArrayAdapter<String> adapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
            lv.setAdapter(adapter);

    }

    /* This routine is called when an activity completes.*/
      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_ENABLE_BT) {
          CheckBTState();
        }
      }

      @Override
      protected void onDestroy() {
        super.onDestroy();
        if (btAdapter != null) {
          btAdapter.cancelDiscovery();
        }
        unregisterReceiver(ActionFoundReceiver);
      }

      private void CheckBTState() {
        // Check for Bluetooth support and then check to make sure it is turned on
        // If it isn't request to turn it on
        // List paired devices
        // Emulator doesn't support Bluetooth and will return null
        if(btAdapter==null) { 
          Toast.makeText(getApplicationContext(),"\nBluetooth NOT supported. Aborting.",5000).show();
          return;
        } else {
          if (btAdapter.isEnabled()) {
            Toast.makeText(getApplicationContext(),"\nBluetooth is enabled...",5000).show();

            // Starting the device discovery
            btAdapter.startDiscovery();
          } else if (!btAdapter.isEnabled()){
            Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
          }
         /* else{
              Intent intent = new Intent(btAdapter.ACTION_STATE_CHANGED);
            startActivityForResult(intent, RESULT_CANCELED);
          }*/
          }
      }

      private final BroadcastReceiver ActionFoundReceiver = new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent) {
         String action = intent.getAction();
         if(BluetoothDevice.ACTION_FOUND.equals(action)) {
           BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
           Toast.makeText(getApplicationContext(),"\n  Device: " + device.getName() + ", " + device,5000).show();
           mylist.add(device.getName());
           setDeviceList(mylist);
         } else {
           if(BluetoothDevice.ACTION_UUID.equals(action)) {
             BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
             Parcelable[] uuidExtra = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID);
             for (int i=0; i<uuidExtra.length; i++) {
               Toast.makeText(getApplicationContext(),"\n  Device: " + device.getName() + ", " + device + ", Service: " + uuidExtra[i].toString(),5000).show();
             }
           } else {
             if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
               Toast.makeText(getApplicationContext(),"\nDiscovery Started...",5000).show();
             } else {
               if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                 Toast.makeText(getApplicationContext(),"\nDiscovery Finished",5000).show();
                 Iterator<BluetoothDevice> itr = btDeviceList.iterator();
                 while (itr.hasNext()) {
                   // Get Services for paired devices
                   BluetoothDevice device = itr.next();
                   Toast.makeText(getApplicationContext(),"\nGetting Services for " + device.getName() + ", " + device,5000).show();
                   if(!device.fetchUuidsWithSdp()) {
                     Toast.makeText(getApplicationContext(),"\nSDP Failed for " + device.getName(),5000).show();
                   }

                 }
               }
             }
           }
          }
        }
      };       

}  
1

1 Answers

0
votes

It's too late but here is code -> You need to use background thread to connect with bluetooth device as a client. and UUID is Universal Uniquely identification you can use online UUID generator. for secure connections and then get socket with device and connect with it;

ConnectWithDevice(context : ConnectWithBluetooth, device : BluetoothDevice) : Thread(){

    private val mContext : ConnectWithBluetooth = context
    private val mmSocket : BluetoothSocket
    private val mmDevice : BluetoothDevice
    // Default UUID
    private val mmDefaultUUID = UUID.fromString("78c374fd-f84d-4a9e-aa5b-9b0b6292952e")

    init {
        var temp : BluetoothSocket? = null
        mmDevice = device
        try {
            // Try here device.createInsecureConnect if it's work then start with this;
            temp = device.createRfcommSocketToServiceRecord(mmDevice.uuids[0].uuid)
        }catch (en : NullPointerException){
            en.printStackTrace()
            // Try here device.createInsecureConnect if it's work then start with this;
            temp = device.createRfcommSocketToServiceRecord(mmDefaultUUID)
        }catch (e : IOException){
            e.printStackTrace()
            Log.e("TAG","Socket's create() method failed",e)
        }
        mmSocket = temp!!
        Log.i("TAG","Got the Socket")
    }

    override fun run() {
        // Cancel discovery because it otherwise slows down the connection.
        if(mContext.bluetoothAdapter != null){
            mContext.bluetoothAdapter!!.cancelDiscovery()
        }

        try{
            // Connect to the remote device through the socket. This call blocks
            // until it succeeds or throws an exception.
            Log.i("TAG","Connecting...")
            mmSocket.connect()
            Log.i("TAG","Bluetooth Successfully Connected")
        }catch (connectException : IOException){
            // Unable to connect; close the socket and return.
            try{
                mmSocket.close()
            }catch (closeException : IOException){
                Log.e("TAG","Could not close the client socket",closeException)
            }
            return
        }
        // The connection attempt succeeded. Perform work associated with
        // the connection in a separate thread.
        Log.i("TAG","Device is Connected")
        //manageMyConnectedSocket(mmSocket)
    }

    // Closes the client socket and causes the thread to finish.
    // Call this method from the main activity to shut down the connection.
    fun cancel(){
        try {
            mmSocket.close()
        } catch (e: IOException) {
            Log.e(ContentValues.TAG, "Could not close the client socket", e)
        }
    }
}