1

i successfully enabled bluetooth and displayed the list of nearby devices but app closes whenever i click on the device displayed in list. not able to figure out what the problem, it would be really helpful if someone answer this problem

package com.android.clickandsend;

import java.io.IOException;
import java.util.Set;
import java.util.UUID;







import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
 import android.widget.Button;
 import android.widget.ListView;
 import android.widget.Toast;
 import android.widget.AdapterView.OnItemClickListener;

 public class Bluetooth extends Activity{
 final BroadcastReceiver bReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                 // Get the BluetoothDevice object from the Intent
                 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                 // add the name and the MAC address of the object to the arrayAdapter
                 BTArrayAdapter.add(device.getName() );
                 BTArrayAdapter.notifyDataSetChanged();
            }
        }
    };
private static final int REQUEST_ENABLE_BT = 1;
public static BluetoothAdapter myBluetoothAdapter;
private ListView myListView;
public final static UUID my_UUID = UUID.fromString("00001802-0000-1000-8000-00805f9b34fb");
private ArrayAdapter<String> BTArrayAdapter;
private Set<BluetoothDevice> pairedDevices;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
     setContentView(R.layout.bluetooth);
     myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
     Button b=(Button)findViewById(R.id.button1);
     if(myBluetoothAdapter == null){
         Toast.makeText(getApplicationContext(),"Your device does not support Bluetooth",
                 Toast.LENGTH_LONG).show();
         finish();
     }
     else {
         if (!myBluetoothAdapter.isEnabled()) {
             Intent turnOnIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
             startActivityForResult(turnOnIntent, REQUEST_ENABLE_BT);

             Toast.makeText(getApplicationContext(),"Bluetooth turned on" ,
                     Toast.LENGTH_LONG).show();
          }
          else{
             Toast.makeText(getApplicationContext(),"Bluetooth is already on",
                     Toast.LENGTH_LONG).show();
          }
     }
     myListView=(ListView)findViewById(R.id.listView1);

     BTArrayAdapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);

     myListView.setAdapter(BTArrayAdapter);



     b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub


                   if (myBluetoothAdapter.isDiscovering()) {
                       // the button is pressed when it discovers, so cancel the discovery
                       myBluetoothAdapter.cancelDiscovery();
                       Toast.makeText(getApplicationContext(), "cancel dis", Toast.LENGTH_SHORT).show();
                   }
                   else {
                        BTArrayAdapter.clear();
                        myBluetoothAdapter.startDiscovery();
                         Toast.makeText(getApplicationContext(), "start dis", Toast.LENGTH_SHORT).show();
                        registerReceiver(bReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));    
                    } 





             myListView.setOnItemClickListener(new OnItemClickListener() {
                 @Override
                    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                     String  itemValue = (String) myListView.getItemAtPosition(position);

                        String MAC = itemValue.substring(itemValue.length() - 17);

                        BluetoothDevice bluetoothDevice = myBluetoothAdapter.getRemoteDevice(MAC);
                        ConnectingThread t = new ConnectingThread(bluetoothDevice);
                        t.start();
                    }
            });
        }
    });
     Button c=(Button)findViewById(R.id.button2);
     c.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            ListeningThread t = new ListeningThread();
            t.start();
        }
    });

}




@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    unregisterReceiver(bReceiver);
}

     }
    class ConnectingThread extends Thread  {
private final BluetoothSocket bluetoothSocket;
private final BluetoothDevice bluetoothDevice;


public ConnectingThread(BluetoothDevice device) {

    BluetoothSocket temp = null;
    bluetoothDevice = device;

    // Get a BluetoothSocket to connect with the given BluetoothDevice
    try {
        temp = bluetoothDevice.createRfcommSocketToServiceRecord(Bluetooth.my_UUID);
    } catch (IOException e) {
        e.printStackTrace();
    }
    bluetoothSocket = temp;
}

public void run() {
    Bluetooth.myBluetoothAdapter.cancelDiscovery();
    // Cancel any discovery as it will slow down the connection


    try {
        // This will block until it succeeds in connecting to the device
        // through the bluetoothSocket or throws an exception
        bluetoothSocket.connect();
    } catch (IOException connectException) {
        connectException.printStackTrace();
        try {
            bluetoothSocket.close();
        } catch (IOException closeException) {
            closeException.printStackTrace();
        }
    }

    // Code to manage the connection in a separate thread
    /*
        manageBluetoothConnection(bluetoothSocket);
    */
}

// Cancel an open connection and terminate the thread
public void cancel() {
    try {
        bluetoothSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}
class ListeningThread extends Thread {
private final BluetoothServerSocket bluetoothServerSocket;
private final static UUID uuid = UUID.fromString("00001802-0000-1000-8000-00805f9b34fb");
String name="help";
public ListeningThread() {
    BluetoothServerSocket temp = null;
    try {
        temp = Bluetooth.myBluetoothAdapter.listenUsingRfcommWithServiceRecord(name, uuid);

    } catch (IOException e) {
            e.printStackTrace();
    }
        bluetoothServerSocket = temp;
}

public void run() {
    BluetoothSocket bluetoothSocket;
    // This will block while listening until a BluetoothSocket is returned
    // or an exception occurs
    while (true) {
        try {
            bluetoothSocket = bluetoothServerSocket.accept();
        } catch (IOException e) {
            break;
        }
        // If a connection is accepted
        if (bluetoothSocket != null) {

            Toast.makeText(getApplicationContext(), "A connection has been accepted.",
                    Toast.LENGTH_SHORT).show();
            break;
        }
            // Manage the connection in a separate thread

            try {
                bluetoothServerSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
        }
    }


private Context getApplicationContext() {
    // TODO Auto-generated method stub
    return null;
}

// Cancel the listening socket and terminate the thread
public void cancel() {
    try {
        bluetoothServerSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

1 Answers1

0

Just replace your run() with below code,problem is like when you are try to connect the particular device that may already connected with some peripheral so you have to disconnect it first.try this and let me knwo if any problem you facing.

 try {

  bluetoothSocket.close();
  bluetoothSocket.disconnect();
    bluetoothSocket.connect();
} catch (IOException connectException) {
    connectException.printStackTrace();
    try {
        bluetoothSocket.close();
    } catch (IOException closeException) {
        closeException.printStackTrace();
    }
}
Ajay Pandya
  • 2,417
  • 4
  • 29
  • 65