- Forum-Beiträge: 8
06.12.2012, 21:48:04 via Website
06.12.2012 21:48:04 via Website
Ich entwickle gerade meine erste konkrete Android App. Sie soll als Bluetoothtastatur der Playstation 3 dienen.
Nun bin ich gerade Mal so weit, dass er mit Bluetooth einschaltet, falls es noch nicht aktiv ist. Ich möchte, dass er alle Geräte in der Nähe absucht und in der ListView anzeigt. Habe es letztens so hinbekommen, dass er mir alle schon einmal gekoppelte Geräte anzeigt, aber nach neuen Geräten möchte er nicht suchen. Nun wollte ich es so machen, dass nach dem starten des Bluetooth er automatisch nach Geräten in der Umgebung suchen soll.
2
3import java.util.ArrayList;
4import java.util.Set;
5
6import android.os.Bundle;
7import android.app.Activity;
8import android.bluetooth.BluetoothAdapter;
9import android.bluetooth.BluetoothDevice;
10import android.content.BroadcastReceiver;
11import android.content.Context;
12import android.content.Intent;
13import android.content.IntentFilter;
14import android.util.Log;
15import android.view.Menu;
16import android.view.View;
17import android.view.View.OnClickListener;
18import android.widget.AdapterView;
19import android.widget.AdapterView.OnItemClickListener;
20import android.widget.ArrayAdapter;
21import android.widget.Button;
22import android.widget.ListView;
23import android.widget.TextView;
24import android.widget.Toast;
25
26public class StartActivity extends Activity implements OnItemClickListener {
27
28 // Alle Attribute werden erzeugt
29 String tag = "Sunny";
30 ArrayAdapter<String> showPairedDevices;
31 ArrayAdapter<String> listadapter;
32
33 ListView listview;
34 BluetoothAdapter btAdapter;
35 Set<BluetoothDevice> devicesArray;
36
37 ArrayList<String> newDevices;
38 ArrayList<String> pairedDevices;
39 ArrayList<BluetoothDevice> devices;
40 BluetoothDevice selectedDevice;
41
42 IntentFilter filter;
43 BroadcastReceiver receiver;
44
45 Button scannen;
46 Button verbinden;
47
48 TextView tvName;
49 TextView tvAdresse;
50
51 ServerBluetooth sb;
52
53
54 @Override
55 public void onCreate(Bundle savedInstanceState) {
56 super.onCreate(savedInstanceState);
57
58 setContentView(R.layout.start);
59 Log.i(tag, "show layou");
60 init(); //Ausführen der Methode init()
61
62 Log.i(tag, "init method");
63 if (btAdapter == null) { //Falls kein Bluetooth auf dem Gerät vorhanden ist
64 Toast.makeText(getApplicationContext(), //Soll er eine kleine Meldung geben
65 "Kein Bluetooth auf diesem Gerät verfügbar", 0).show();
66 finish(); //Anschliessend soll er die Activity schliessen
67 }
68
69 else {
70 if (!btAdapter.isEnabled()) { //Falls Bluetooth nicht aktiviet wurde
71 turnOnBT(); //Soll Bluetooth eingeschaltet werden mit der Methode turnOnBt()
72 }
73
74 getPairedDevices(); //Hier holt er alle Geräte die schon einmal gekoppelt wurden
75 }
76
77 verbinden.setOnClickListener(new OnClickListener() {
78 public void onClick(View v) {
79 verbinden();
80 }
81 });
82 scannen.setOnClickListener(new OnClickListener() {
83
84 public void onClick(View v) {
85 // TODO Auto-generated method stub
86 startDiscovery();
87 Log.i(tag, "suche lauft");
88 }
89
90 });
91 }
92
93 private void startDiscovery() { //Methode sucht nach Geräten in der Umgebung
94 // TODO Auto-generated method stub
95 btAdapter.startDiscovery(); //Startet die Suche
96 }
97
98 private void turnOnBT() { //Schaltet Bluetooth ein
99 // TODO Auto-generated method stub
100 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); //Fragt den Benutzer ob Bluetooth eingeschaltet werden darf mit der Zulassung
101 //das Bluetooth auf sichtbar eingestellt wird
102 startActivityForResult(intent, 1); // startet eine Activity mit dem oben erstellten Intent
103 }
104
105 public void onBackPressed() { //Wird der "Zurück" Button gedrückt, soll er die Activity beenden und die Anwendung
106 finish(); //Beendet die Activty
107 System.exit(0); //Ruft den Konstruktor auf der klasse onStop()
108 }
109
110 private void getPairedDevices() { //MEthode um alle gepaarten Geräte anzuzeigen
111 // TODO Auto-generated method stub
112 devicesArray = btAdapter.getBondedDevices(); //holt alle geräte, die schon einmal gepaart wurden mit dem Handy und speichert diese in eine ArrayList ab
113 if (devicesArray.size() > 0) { //wenn die ArrayList grösser als 0 ist
114 for (BluetoothDevice device : devicesArray) { //loop für devicesArray
115 pairedDevices.add(device.getName() + "|" + device.getAddress());//eintragen der geräte mit name und adresse in eine ArrayList
116 }
117 }
118
119 showPairedDevices = new ArrayAdapter<String>(this,
120 android.R.layout.simple_list_item_1, pairedDevices); //initalisieren und füllen eines ArrayAdapter mit der ArrayList pairedDevices
121
122 listview.setAdapter(showPairedDevices); //anzeigen des ArrayAdapter in der Listview
123
124 }
125
126 private void init() {
127 // TODO Auto-generated method stub
128 // Alle Attribute werden initialisiert
129 listview = (ListView) findViewById(R.id.bluetoothListe);
130 listview.setOnItemClickListener(this);
131 newDevices = new ArrayList<String>();
132 listadapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, newDevices);
133 sb = new ServerBluetooth(btAdapter);
134 verbinden = (Button) findViewById(R.id.verbinden);
135 scannen = (Button) findViewById(R.id.scannen);
136
137 tvName = (TextView) findViewById(R.id.btName);
138 tvAdresse = (TextView) findViewById(R.id.btAdress);
139
140 btAdapter = BluetoothAdapter.getDefaultAdapter();
141 pairedDevices = new ArrayList<String>();
142 filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
143 devices = new ArrayList<BluetoothDevice>();
144
145 receiver = new BroadcastReceiver() {
146
147 @Override
148 public void onReceive(Context context, Intent intent) {
149 // TODO Auto-generated method stub
150Log.i(tag, "receiver create");
151 String action = intent.getAction(); //der intent speichert eine gefundene Action als String ab. Action ist hier als Gerät gedacht
152 if (BluetoothDevice.ACTION_FOUND.equals(action)) { //wenn der gefundene action mit dem action vom string übereinstimmt
153 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); //dann soll der intent die action holen und als device abspeichern der klasse BLuetoothDevice
154 devices.add(device);//
155 newDevices.add(device.getName() + "|" + device.getAddress()); //jedes gefundene Gerät wird in eine ArrayList abgespeichert
156 }
157
158 else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { //wenn die action der action_discovery_started gleicht bzw. wenn startDiscovery() aufgerufen wird
159 // soll die suche starten und eine Meldung ausgeben, dass die suche läuft
160 Log.i(tag, "action discovery started");
161 Toast.makeText(getApplicationContext(), "Suche läuft!", Toast.LENGTH_SHORT).show();
162 } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { // nach 12sek bricht er die suche ab und ruft automatisch cancelDiscovery() auf
163 // soll eine neue Liste angezeigt werden mit den gefundenen Geräten
164 listview.setAdapter(listadapter);
165
166 } else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
167 // falls Bluetooth während der Ausführung des Programms ausgeschaltet wird
168 // soll, sie wieder eingeschaltet werden
169 turnOnBT();
170 }
171 }
172
173 };
174
175 this.registerReceiver(receiver, filter); //Receiver wird im System registriert
176 filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED); //Filter, der nur Actions von ACTION_DISCOVERY_STARTED abfängt
177 this.registerReceiver(receiver, filter);//Receiver wird im System registriert
178 filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//Filter, der nur Actions von ACTION_DISCOVERY_FINISHED abfängt
179 this.registerReceiver(receiver, filter);//Receiver wird im System registriert
180 filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);//Filter, der nur Actions von ACTION_STATE_CHANGED abfängt
181 }
182
183 private void verbinden() {
184 // TODO Auto-generated method stub
185
186 if (tvName.getText().length() < 2) { //Falls der Text in der TextView kleiner als 2 ist bzw. kein Element der Liste gewählt wurde
187 Toast.makeText(getApplicationContext(),
188 "Bitte zuerst ein Gerät aus der Liste auswählen",
189 Toast.LENGTH_SHORT).show();//Mache eine Meldung
190 } else {
191 Log.i(tag, "start verbindung");//Sonst
192 sb.start(); //starte den Thread
193 }
194
195 }
196
197
198 protected void onPause() { //Wird die App unerwartet pausiert
199 unregisterReceiver(receiver); //muss der Receiver wieder aus dem System genommen werden
200 super.onPause();
201
202 }
203
204 protected void onResume() { //Wird die App fortgesetzt
205 registerReceiver(receiver, filter); //muss der Receiver im System wieder registriert werden
206 super.onResume();
207
208 }
209
210 protected void onStop() { //Wird die App gestoppt
211 unregisterReceiver(receiver);//muss der Receiver wieder aus dem System genommen werden
212 super.onStop();
213 }
214
215 protected void onDestroy() { //Wird der Prozess der App zerstört
216 unregisterReceiver(receiver);//muss der Receiver wieder aus dem System genommen werden
217 super.onDestroy();
218 }
219
220 @Override
221 public boolean onCreateOptionsMenu(Menu menu) { //Erstellt ein Menü, wenn man den Menü Button klickt
222 getMenuInflater().inflate(R.menu.start, menu);
223 return true;
224 }
225
226 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
227 super.onActivityResult(requestCode, resultCode, data);
228 if (resultCode == RESULT_CANCELED) { //Falls der Benutzer bei der Bluetoothabfrage "nein" drückt
229 Log.i(tag, "btCheck");
230 Toast.makeText(getApplicationContext(),
231 "Bluetooth muss eingeschaltet sein!", Toast.LENGTH_SHORT)
232 .show(); //erscheint eine Meldung das Bluetooth eingeschaltet werden muss
233 }
234 }
235
236 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //Wenn man auf ein Element auf der Liste klickt
237 // TODO Auto-generated method stub
238 Log.i(tag, "clickedItem");
239
240 String x = listview.getItemAtPosition(arg2).toString(); //das Element soll als String in eine variable gespeichert werden
241 String xr = x.substring(0, x.indexOf("|")); //der String wird bei "|" getrennt
242 String xc = x.substring(x.indexOf("|") + 1, x.length()); //der String wird nach dem "|" getrennt
243
244 tvName.setText(xr); //anzeigen des String in der Textview
245 tvAdresse.setText(xc);//anzeigen des String in der TextView
246
247
248 }
249
250
251
252
253
254
255}
ServerBluetooth
2
3import java.io.IOException;
4import java.util.UUID;
5
6import android.bluetooth.BluetoothAdapter;
7import android.bluetooth.BluetoothServerSocket;
8import android.bluetooth.BluetoothSocket;
9import android.os.Handler;
10import android.os.Message;
11import android.util.Log;
12
13//ab hier sind noch die Kommentaren vom Internet enthalten.
14 public class ServerBluetooth extends Thread {
15
16
17
18
19 BluetoothAdapter bAdapter;
20
21 public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
22 private final BluetoothServerSocket mmServerSocket;
23 BluetoothServerSocket tmp = null; //neues objekt wird mit null erstellt
24 BluetoothSocket socket = null; // socket wird auf null gesetzt
25
26
27 public ServerBluetooth(BluetoothAdapter adapter) {
28 // Use a temporary object that is later assigned to mmSocket,
29 // because mmSocket is final
30 this.bAdapter = adapter;
31 //Der BluetoothSocket soll sich mit dem gewählten Bluetoothgerät verbinden
32 // Get a BluetoothSocket to connect with the given BluetoothDevice
33 try {
34 // MY_UUID is the app's UUID string, also used by the server
35 // code
36 this.tmp = bAdapter.listenUsingRfcommWithServiceRecord("Sender",
37 MY_UUID); //Der BluetoothSocket soll in das Objekt tmp abgelegt werden mit der UUID
38 } catch (IOException e) {
39 }
40 this.mmServerSocket = tmp; //das Objekt mmServerScoket soll den Inhalt von tmp übernehmen
41 }
42
43 public void run() { // der Thread wird gestartet
44
45 while (true) { //solange true
46 try {
47 socket = mmServerSocket.accept(); //wartet der Server auf eine eingehende Verbindung
48 } catch (IOException e) {
49 break;
50 }
51
52 if (socket != null) {//Sobald die Verbindung zum anderen Bluetoothgerät steht
53 manageConnectedSocket(socket);
54
55 try {
56 mmServerSocket.close(); //Soll die Verbindung geschlossen werden
57 } catch (IOException e) {
58 // TODO Auto-generated catch block
59 Log.i("ServerSocket Close", "Catch server Socket");
60 e.printStackTrace();
61 }
62
63 break;
64 }
65 }
66 }
67
68 public void manageConnectedSocket(BluetoothSocket socket) {
69 // TODO Auto-generated method stub
70
71 }
72
73 /** Will cancel an in-progress connection, and close the socket */
74 public void cancel() { //Methode um den SocketServer zu schliessen bzw. abzubrechen
75 try {
76 mmServerSocket.close();
77 } catch (IOException e) {
78 }
79 }
80 }
ClientBluetooth:
2
3import java.io.IOException;
4import java.util.UUID;
5
6import android.bluetooth.BluetoothAdapter;
7import android.bluetooth.BluetoothDevice;
8import android.bluetooth.BluetoothSocket;
9import android.os.Handler;
10import android.os.Message;
11
12//Ab hier liegt das Problem, warum er keine Verbindung aufbauen möchte, denke ich Mal. Das Logcat sagt genau das gleiche
13
14 public class ClientBluetooth extends Thread {
15
16 BluetoothSocket mmSocket = null;
17 BluetoothDevice mmDevice = null;
18 BluetoothAdapter btAdapter = null;
19
20 public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
21 protected static final int SUCCESS_CONNECT = 0;
22 protected static final int MESSAGE_READ = 1;
23
24 Handler mHandler = new Handler() {
25 public void handleMessage(Message msg) { // Schnittstelle zwischen einem Thread
26 super.handleMessage(msg);
27 switch (msg.what) {
28 case SUCCESS_CONNECT: //Ist die Verbindung erfolgreich soll er eine Nachricht an das andere Gerät senden
29 dataBluetooth connectedthread = new dataBluetooth( //Starten der Datenübertragung durch erzeugen der Instanz
30 (BluetoothSocket) msg.obj);
31 String a = "erfolgreich Verbunden";
32 connectedthread.write(a.getBytes());// String a soll als Bytes gesendet werden
33 break;
34 case MESSAGE_READ: //Ansonsten soll er die Nachricht lesen, die er empfängt
35 }
36 }
37 };
38
39
40 public ClientBluetooth(BluetoothDevice device) {
41 // Use a temporary object that is later assigned to mmSocket,
42 // because mmSocket is final.
43
44
45 this.mmDevice = device;
46
47 // Get a BluetoothSocket to connect with the given BluetoothDevice.
48 try {
49 // MY_UUID is the app’s UUID string, also used by the server
50 // code.
51 this.mmSocket = device.createRfcommSocketToServiceRecord(UUID
52 .fromString("00001101-0000-1000-8000-00805F9B34FB"));
53 } catch (IOException e) {
54 }
55
56 }
57 public ClientBluetooth (BluetoothAdapter adapter) {
58
59 }
60
61
62 public void run() {
63 // Cancel discovery because it will slow down the connection.
64 btAdapter.cancelDiscovery();
65
66 try {
67 // Connect the device through the socket. This will block
68 // until it succeeds or throws an exception.
69 mmSocket.connect();
70 } catch (IOException connectException) {
71 // Unable to connect; close the socket and get out.
72 cancel();
73 return;
74 }
75 mHandler.obtainMessage(SUCCESS_CONNECT);
76
77 // Do work to manage the connection (in a separate thread).
78 manageConnectedSocket(mmSocket);
79 }
80
81 private void manageConnectedSocket(BluetoothSocket mmSocket2) {
82 // TODO Auto-generated method stub
83
84 }
85
86 /** Will cancel an in-progress connection, and close the socket. */
87 public void cancel() {
88 try {
89 mmSocket.close();
90 } catch (IOException e) {
91 }
92 }
93 }
dataBluetooth:
2
3import java.io.IOException;
4import java.io.InputStream;
5import java.io.OutputStream;
6
7import android.bluetooth.BluetoothSocket;
8import android.os.Handler;
9import android.os.Message;
10
11//developer android Internet
12 public class dataBluetooth extends Thread {
13
14
15 private final BluetoothSocket mmSocket;
16 private final InputStream mmInStream;
17 private final OutputStream mmOutStream;
18
19 protected static final int SUCCESS_CONNECT = 0;
20 protected static final int MESSAGE_READ = 1;
21
22 byte[] buffer; // buffer store for the stream
23 int bytes;
24
25 Handler mHandler;
26
27 public dataBluetooth(BluetoothSocket socket) {
28 mmSocket = socket;
29 InputStream tmpIn = null;
30 OutputStream tmpOut = null;
31
32 // Get the input and output streams, using temp objects because
33 // member streams are final
34 try {
35 tmpIn = socket.getInputStream();
36 tmpOut = socket.getOutputStream();
37 } catch (IOException e) {
38 }
39
40 mmInStream = tmpIn;
41 mmOutStream = tmpOut;
42 }
43
44 public void run() {
45 // bytes returned from read()
46
47 // Keep listening to the InputStream until an exception occurs
48 while (true) {
49 try {
50
51 buffer = new byte[1024];
52 // Read from the InputStream
53 bytes = mmInStream.read(buffer);
54 // Send the obtained bytes to the UI activity
55 mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
56 .sendToTarget();
57 } catch (IOException e) {
58 break;
59 }
60 }
61 }
62
63 /* Call this from the main activity to send data to the remote device */
64 public void write(byte[] bytes) {
65 try {
66 mmOutStream.write(bytes);
67 } catch (IOException e) {
68 }
69 }
70
71 /* Call this from the main activity to shutdown the connection */
72 public void cancel() {
73 try {
74 mmSocket.close();
75 } catch (IOException e) {
76 }
77 }
78 }
Logcat
Bitte um Hilfe!!
— geändert am 14.12.2012, 23:09:58
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.