Java Android: Broadcast Reciver für Bluetooth

ali7566

Lieutenant
Registriert
Feb. 2007
Beiträge
980
Hallo,

ich bin gerade dabei mich mit den Bluetooth Apis von Android auseinanderzusetzen. Ich habe per Code Bluetooth aktiviert und auch als Sichtbar makiert.

Nun habe ich einen Broadcast Reciver implementiert der bei "BluetoothDevice.ACTION_FOUND"
den Gerätenamen und Adresse in eine ArrayList speichert!

Ich debugge das Ganze auf einem S3 mit Android 4.1 und habe noch ein anderes Androidtablet hier welches ich nutze um es als aktives Bluetooth Gerät zu finden. Bei beiden Geräten ist die Sichtbarkeit an, jedoch kommt es auch nach längerer Wartezeit (ca. 1 min) nicht dazu das ich irgend einen Eintrag in der ArrayList habe.

Hier mal der Code:

Code:
import java.util.ArrayList;

import android.app.*;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.*;
import android.bluetooth.BluetoothDevice;
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.ArrayAdapter;
import android.widget.Toast;

public class blueWork extends Activity {

	private final static int REQUEST_ENABLE_BT=1;
	ArrayList<String> nameArr = new ArrayList(); // Um die Bluetooth-Geräte abzulegen!
	ArrayList<String> adressArr = new ArrayList();
	BluetoothAdapter mBluetoothAdapter;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		Bundle extras= new Bundle();
		
		try
		{
			extras = getIntent().getExtras();
		}
		catch(Exception e)
		{
			Toast.makeText(this, "Es ist ein Fehler bei dem Auslesen des Intents aufgetreten", Toast.LENGTH_SHORT).show();
		}
		
		String val= extras.get("connectionType").toString();
		
		
		
		if(val.equals("Server"))
		{
			setContentView(R.layout.connect_blue_server);
		}
		else if(val.equals("Client"))
		{
			setContentView(R.layout.connect_blue_client);
		}
	}
	
	//Methode um Bluetooth-support zu prüfen und danach zu aktivieren
	 public void activBT(View view)
	    {
		 if(view.getId() == R.id.bt_activateBT || view.getId()== R.id.bt_search)
		 {
			 try
			 {
			  mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
		    	
		    	if(mBluetoothAdapter == null)
		    	{
		    		Toast.makeText(this, "Leider unterstützt dieses Gerät kein Bluetooth", Toast.LENGTH_LONG).show();
		    	}
		    	
		    	else
		    	{
		    		Toast.makeText(this, "Bluetooth ist schonmal da!", Toast.LENGTH_LONG).show();
		    		if(mBluetoothAdapter.isEnabled()== false)
		    		{
		    			Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
		    			startActivityForResult(enableBTIntent, REQUEST_ENABLE_BT);
		    		}
		    	}
			 }
			 catch(Exception e)
			 {
				 Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_LONG).show();
			 }
		 }

	    }
	
	 
	 public void discoverBT()
	 {
		 Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
		 discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); //300 sek. sichtbar!
		 startActivity(discoverableIntent);
	 }


	 public void activateForClient(View view)
	 {
		 activBT(view);
		 searchBT(view);
	 }
	 
	 public void searchBT(View view)
	 {
		 	if(view.getId() == R.id.bt_search)
		 	{ 
			 discoverBT();
		 
		 	//Jetzt Broadcast Reciver aktivieren falls Bluetooth Geräte gefunden wurden!
		 
		 	final BroadcastReceiver  mReciver = 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);
						
						//Adresse und Gerätename wird in eine Arraylist geschrieben!!!
						nameArr.add(device.getName());
						adressArr.add(device.getAddress());
					} 
			 	}
		 	};
		 
		 	IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
		 	registerReceiver(mReciver, filter);
		 	
		 	
		 }
	 }
	 
	 public void displayFoundedDevices(View view)
	 {
		 mBluetoothAdapter.cancelDiscovery();
		 
		 try{
			 if(view.getId()== R.id.bt_geraeteZeigen)
			 {
				 Toast.makeText(this, "Im Try Block: "+adressArr.size(), Toast.LENGTH_LONG).show();
			 }
		 }
		 catch(Exception e)
		 {
			Toast.makeText(this, "Im Catch Block: "+e.getMessage(), Toast.LENGTH_LONG).show(); 
		 }
	 }
}

Falls ihr wisst wo das Problem liegt wäre ich über Hilfe dankbar :)

Gruß Ali.
 
Sieht grundsätzlich ok aus - einzige Idee, die ich hätte: Permissions vielleicht nicht richtig gesetzt? (siehe Stackoverflow
 
Daran liegt es leider nicht...hab im Manifest schon die Permissions für Bluetooth und sogar Bluetooth Admin gesetzt.

Gruß Ali.
 
Keiner ne idee ?

Gruß Ali.
 
Hab diesen Thread ja total vergessen. Ich hab mir mal etwas mehr Zeit genommen und das Problem war eigentlich ganz Simpel:

mBluetoothAdapter.startDiscovery();


Nur diese Methode hat gefehlt. Sie muss aufgerufen werden, natürlich in Verbindung mit dem Broadcast Receiver.

Gruß Ali.
 
Zurück
Oben