Bluetooth -App startet nicht-

  • 4 Antworten
  • Letztes Antwortdatum
G

gammelT300

Neues Mitglied
0
Hoffentlich im richtigen Forum, wenn nicht bitte verschieben.

Hallo, ich möchte eine App entwickeln, die eine bluetooth-verbindung aufbaut und Messdaten empfängt. Diese sollen einfach angezeigt werden. Durch einen Klick auf ein Button soll man dann die Werte aktualisieren können, siehe Code. Und alles soll, wenn möglich in einer Aktivität umgesetzt werden.

Leider stürzt die app immer, wenn ich sie auf meinem smartphone starte ab. Kann mir jemand weiter helfen?!!

Danke

Code:
package com.example.ziel;


import java.io.IOException;
import java.lang.reflect.Array;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;//test

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
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.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.TextView;

public class Main_Activity extends Activity implements OnItemClickListener {

    private Handler handler;
    String value;
    Array parts;

    ArrayAdapter<String> listAdapter;
    ListView listView;
    BluetoothAdapter btAdapter;
    Set<BluetoothDevice> devicesArray;
    ArrayList<String> pairedDevices;
    ArrayList<BluetoothDevice> devices;
    public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    protected static final int SUCCESS_CONNECT = 0;
    protected static final int MESSAGE_READ = 1;
    IntentFilter filter;
    BroadcastReceiver receiver;
    String tag = "debugging";
    String ring= "525,32.565,32.232,52.523,25.112,23.123,23.123,35.127,98.212,23.";
    TextView textview1;
    TextView textview2;
    TextView textview3;
    TextView textview4;
    TextView textview5;
    TextView textview6;
    Button button1;


    public  void aufteilen() {

        String[] parts = ring.split("\\.");

        textview2.setText("Temp2 "+parts[0]);
        textview3.setText("Temp3 "+parts[1]);
        textview4.setText("Temp4 "+parts[2]);
        textview5.setText("Temp5 "+parts[3]);
        textview6.setText("Temp6 "+parts[4]);




    }



    Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            Log.i(tag, "in handler");
            super.handleMessage(msg);
            switch(msg.what){
                case SUCCESS_CONNECT:
                    // aktionen
                    ConnectedThread connectedThread = new ConnectedThread((BluetoothSocket)msg.obj);
                    Toast.makeText(getApplicationContext(), "CONNECT", 0).show();
                    String s = "successfully connected";
                    connectedThread.write(s.getBytes());
                    Log.i(tag, "connected");
                    break;
                case MESSAGE_READ: // HIER
                    byte[] readBuf = (byte[])msg.obj;
                    String string = new String(readBuf);
                    Toast.makeText(getApplicationContext(), string, 0).show();
                    break;
            }
        }
    };
    @Override
    public void onCreate(Bundle savedInstanceState) {

        textview2 = (TextView) findViewById(R.id.textView2);
        textview3 = (TextView) findViewById(R.id.textView3);
        textview4 = (TextView) findViewById(R.id.textView4);
        textview5 = (TextView) findViewById(R.id.textView5);
        textview6 = (TextView) findViewById(R.id.textView6);
        final Button button1 = (Button) findViewById(R.id.button);
        button1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                ring = "995,32.757,56.454,87.646,56.556,45.457,74.754,57.435,34.463,46";
                aufteilen();
            }});

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
        if(btAdapter==null){
            Toast.makeText(getApplicationContext(), "No bluetooth detected", 0).show();
            finish();
        }
        else{
            if(!btAdapter.isEnabled()){
                turnOnBT();
            }

            getPairedDevices();
            startDiscovery();
        }


    }
    private void startDiscovery() {
        // TODO Auto-generated method stub
        btAdapter.cancelDiscovery();
        btAdapter.startDiscovery();

    }
    private void turnOnBT() {
        // TODO Auto-generated method stub
        Intent intent =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(intent, 1);
    }
    private void getPairedDevices() {
        // TODO Auto-generated method stub
        devicesArray = btAdapter.getBondedDevices();
        if(devicesArray.size()>0){
            for(BluetoothDevice device:devicesArray){
                pairedDevices.add(device.getName());

            }
        }
    }
    private void init() {
        // TODO Auto-generated method stub
        listView=(ListView)findViewById(R.id.bConnectedNew);
        listView.setOnItemClickListener(this);
        listAdapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,0);
        listView.setAdapter(listAdapter);
        btAdapter = BluetoothAdapter.getDefaultAdapter();
        pairedDevices = new ArrayList<String>();
        filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        devices = new ArrayList<BluetoothDevice>();
        receiver = new BroadcastReceiver(){
            @Override
            public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
                String action = intent.getAction();

                if(BluetoothDevice.ACTION_FOUND.equals(action)){
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    devices.add(device);
                    String s = "";
                    for(int a = 0; a < pairedDevices.size(); a++){
                        if(device.getName().equals(pairedDevices.get(a))){
                            //hinzufügen
                            s = "(Paired)";
                            break;
                        }
                    }

                    listAdapter.add(device.getName()+" "+s+" "+"\n"+device.getAddress());
                }

                else if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){
                    // macht irgendwas
                }
                else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
                    // macht irgendwas



                }
                else if(BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){
                    if(btAdapter.getState() == btAdapter.STATE_OFF){
                        turnOnBT();
                    }
                }

            }
        };

        registerReceiver(receiver, filter);
        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
        registerReceiver(receiver, filter);
        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(receiver, filter);
        filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        registerReceiver(receiver, filter);
    }


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

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_CANCELED){
            Toast.makeText(getApplicationContext(), "Bluetooth must be enabled to continue", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                            long arg3) {
        // TODO Auto-generated method stub

        if(btAdapter.isDiscovering()){
            btAdapter.cancelDiscovery();
        }
        if(listAdapter.getItem(arg2).contains("Paired")){

            BluetoothDevice selectedDevice = devices.get(arg2);
            ConnectThread connect = new ConnectThread(selectedDevice);
            connect.start();
            Log.i(tag, "in click listener");
        }
        else{
            Toast.makeText(getApplicationContext(), "device is not paired", 0).show();
        }
    }

    private class ConnectThread extends Thread {

        private final BluetoothSocket mmSocket;
        private final BluetoothDevice mmDevice;

        public ConnectThread(BluetoothDevice device) {
            // temporäres objekt wird genutzt, welches später zu mmSocket zugewiesen wird,
            // weil mmSocket ist starr
            BluetoothSocket tmp = null;
            mmDevice = device;
            Log.i(tag, "construct");
            // Holt BluetoothSocket um mit gegebenen BluetoothDevice zu verbinden
            try {
                // MY_UUID ist der app's UUID string,wird auch vom servercode genutzt
                tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                Log.i(tag, "get socket failed");

            }
            mmSocket = tmp;
        }

        public void run() {
            // unterbricht suche, weil es sonst zu sehr verlangsamen würde
            btAdapter.cancelDiscovery();
            Log.i(tag, "connect - run");
            try {
                // Über socket werden die Geräte verbunden, bis eine exception greift

                mmSocket.connect();
                Log.i(tag, "connect - succeeded");
            } catch (IOException connectException) {    Log.i(tag, "connect failed");
                // wenn man nicht verbinden kann, anwendungen schließen
                try {
                    mmSocket.close();
                } catch (IOException closeException) { }
                return;
            }

            // Sachen zum managen der Verbindung (in  separaten thread)

        }







        /** Will cancel an in-progress connection, and close the socket */
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) { }
        }
    }

    public class ConnectedThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

        public ConnectedThread(BluetoothSocket socket) {
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            // Get the input and output streams, using temp objects because
            // member streams are final
            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) {
            }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }

        public void run() {
            byte[] buffer;  // buffer store for the stream
            int bytes; // bytes returned from read()

            // Keep listening to the InputStream until an exception occurs
            while (true) {
                try {
                    // Read from the InputStream
                    buffer = new byte[1024];
                    bytes = mmInStream.read(buffer);
                    // sendet zu UI-Activity
                    mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();

                } catch (IOException e) {
                    break;
                }
            }
        }

        /* Call this from the main activity to send data to the remote device */
        public void write(byte[] bytes) {
            try {
                mmOutStream.write(bytes);
            } catch (IOException e) {
            }
        }

        /* Call this from the main activity to shutdown the connection */
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) {
            }
        }
    }    }


    /*public static String convertStreamToString( InputStream is, String ecoding ) throws IOException
{
    StringBuilder sb = new StringBuilder( Math.max( 16, is.available() ) );
    char[] tmp = new char[ 4096 ];

    try {
       InputStreamReader reader = new InputStreamReader( is, ecoding );
       for( int cnt; ( cnt = reader.read( tmp ) ) > 0; )
            sb.append( tmp, 0, cnt );
    } finally {
        is.close();
    }
    return sb.toString();
}*/
 
Klingt nciht nach Spiele entwicklung aber ok.

Hast du die Permission egsetzt?
 
Achso und ...

1. super.onCreate ist das erste das du tun solltest!!! nciht mittendrin
2. Die Bluetooth suche und alles drum herum sollte nicht auf dem Mainthread laufen.
3. setContentview sollte zuerst gesetzt werden gleich nach oncreate und dann erst deine findviewbyID aufrufe denke ich mal
4. Die Logik ist auch irgendwie verschlungen bei dir: finish(),cancelDiscovery und dann startDiscovery und so weiter alles passt irgednwie nciht so ganz in der Reihenfolge und form wie du das aufrufst...auch ganz ohne fehler abzufangen oder anderweitige Überprüfungen
5. zu viel Code geopstet das Nötigste hätte gelangt eig. aber dadurch sind wiederum ein paar Schwaxchstellen aufgezeigt worden


Viel erfolg und hoffe es klappt nach den Änderungen


LG Jaiel
 
  • Danke
Reaktionen: gammelT300
Danke für deine Antwort. Ich ändere mal die Sachen und schau dann ob es funktioniert. Ja die permission ist gesetzt.
 
ich habe jetzt nur die Reihenfolge der funktionen geändert. Dies hat zur Folge dass die App startet und fragt, ob BT angeschaltet werden soll, was auch geschieht. Allerdings wird nicht nach anderen BT-Geräten gesuht und folglich ist kein Verbindungsaufbau möglich.
Liegt das eventl immer noch an der Reihenfolge und ist der Code an sich falsch????

LogCat:

09-08 11:04:31.020 5971-5971/com.example.ziel W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40e14438)
09-08 11:05:40.680 7627-7627/com.example.ziel I/Adreno200-EGL﹕ <qeglDrvAPI_eglInitialize:299>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.01.21.010_msm8625_JB_REL_2.0.3_Merge_release_AU (Merge)
Build Date: 10/26/12 Fri
Local Branch:
Remote Branch: quic/jb_rel_2.0.3
Local Patches: NONE
Reconstruct Branch: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.01.21.010 + NOTHING
 

Ähnliche Themen

G
Antworten
0
Aufrufe
132
Gerdchen07
G
G
Antworten
1
Aufrufe
384
Gerdchen07
G
G
Antworten
13
Aufrufe
596
Gerdchen07
G
L
Antworten
2
Aufrufe
553
Lexub
L
migi01
Antworten
26
Aufrufe
1.985
migi01
migi01
Zurück
Oben Unten