1

我是 android 和 java 编程的新手。我正在尝试编写一个程序来通过蓝牙读取数据。

我试图将我从线程中的蓝牙输入数据中破译的字符串苹果传递到我的 UI 以显示 CalibrationActivity。

我正在使用处理程序进行传递。

我一直在强制退出。谁能告诉我如何解决这个问题。

下面是我扩展线程的完整代码。

package com.android.backend.data.bluetooth;


    import java.io.IOException;
    import java.io.InputStream;

    import java.io.OutputStream;

    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;

    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;

    import android.util.Log;


    import com.android.AutoActivity;
    import com.android.CalibrationActivity;

    import com.android.ui.UIManager;

    public class Connection extends Thread {

        final Connection tt = this;
        private final String TAG = "Connection"; // Class name for logging
        public boolean connected = false;
        public BluetoothSocket bSocket = null;
        public InputStream mmInStream = null;
        public OutputStream mmOutStream = null;
        public ArrayList<String> message = new ArrayList<String>();
        public BluetoothDevice currentDevice = null;
        public UIManager mgr;
        public boolean connectFailure = false;
        public boolean stopAutoConnect = false;
        public String type = null;
        public AutoActivity ff;

        public void bsocketcancel() {
            try {
                bSocket.close();
            } catch (IOException e) { }
        }

        public Connection(UIManager mgr, BluetoothDevice device, String message,
                String type) {
            this.mgr = mgr;
            currentDevice = device;
            this.message.add(message);
            this.type = type;
        }

        public Connection(UIManager mgr, BluetoothDevice device, ArrayList<String> message,
                String type) {
            this.mgr = mgr;
            currentDevice = device;
            this.message = message;
            this.type = type;
        }

        @Override
        public void run() {
            if (type.compareToIgnoreCase("Manual") == 0) {

                Log.d("thread", "manual");
                if (!connected)
                    connect(currentDevice);

                if (bSocket != null){
                    for(String msg : message)
                        write(msg.getBytes());
                }

                mgr.hideConnectingProgressBox();

                if(connected){
                    mgr.connectedDialog();
                    System.out.println("Maunal connected");

                }

                Log.d("thread", "hideprogressBox");
                if (!connected)
                    mgr.showConnectionErrBox();

            } 

            if (type.compareToIgnoreCase("auto") == 0){
                Log.d("thread", "auto");
                stopConnection();
                int i = 0;
                while (true) {                      //Set to 5 second

                    if (!connected)
                        connect(currentDevice);

                    if (bSocket != null){
                        for(String msg : message)
                            write(msg.getBytes());
                    }

                    mgr.hideConnectingProgressBox();

                    Log.d("thread", "hideprogressBox");



                    if (!connected) {
                            mgr.connecting();
                        }

                    if (connected) {
                        mgr.connectedDialog();
                        bsocketcancel();
                        System.out.println("Auto connected");
                        //BluetoothManager.getInstance().disconnectAll(); // cut all connection after transmit
                        break;
                    }


                    if(stopAutoConnect){
                        mgr.cancelconnecting();  
                        break;
                    }
                }

            }

            if (type.compareToIgnoreCase("calibrate") == 0) {

                Log.d("thread", "calibrate");
                if (!connected)
                    connect(currentDevice);

                if (bSocket != null){
                    for(String msg : message)
                        write(msg.getBytes());
                }

                mgr.hideConnectingProgressBox();

                if(connected){
                    mgr.connectedDialog();
                    mgr.msgsent();      
                    System.out.println("Calibration connected");

                    int bufferSize = 1024;
                    byte[] buffer = new byte[bufferSize];
                    int bytes;
                    String apple = "";

                    // Keep listening to the InputStream while connected
                    while (true) {
                        try {
                            // Read from the InputStream
                            bytes = mmInStream.read(buffer);            

                            if ( bytes != -1){
                                while ((bytes==bufferSize)&&(buffer[bufferSize-1] != 0)){
                                    apple = apple + "_" + new String(buffer, 0, bytes);
                                    bytes = mmInStream.read(buffer);

                                }
                                apple = apple + new String(buffer, 0, bytes -1);
                                System.out.println("message " + apple); 


                                //pass data to UI CalibrationActivity
                                System.out.println("message out " + apple);
                                Message msga = mhandler.obtainMessage();
                                Bundle bundle = new Bundle();
                                bundle.putString("key", apple);
                                msga.setData(bundle);
                                mhandler.sendMessage(msga); 
                            }       

                        } catch (IOException e) {
                            Log.e(TAG, "disconnected", e);

                            break;
                        }
                    }

                }

                Log.d("thread", "hideprogressBox");
                if (!connected){
                    mgr.showConnectionErrBox();
                }
            } 

        }

        public void connect(BluetoothDevice device) {
            currentDevice = device;
            BluetoothSocket tmp = null;
            BluetoothManager.getInstance().getBluetoothAdapter().cancelDiscovery();
            // Get a BluetoothSocket for a connection with the
            // given BluetoothDevice
            try {
                // tmp = device
                // .createRfcommSocketToServiceRecord(BluetoothManager.SerialPortServiceClass_UUID);
                Method m = device.getClass().getMethod("createRfcommSocket",
                        new Class[] { int.class });
                tmp = (BluetoothSocket) m.invoke(device, 1);

                // } catch (IOException e) {
                // Log.e(TAG, "create() failed", e);
                // return;
            } catch (Exception e) {
                Log.e(TAG, "Socket connection failed", e);
                return;
            }

            bSocket = tmp;


            try {
                bSocket.connect();
            } catch (IOException e1) {
                Log.e(TAG, "Connection err", e1);
                connectFailure = true;
                return;
            }

            if (tmp != null) {
                // Get Input/output stream for Socket
                try {
                    mmInStream = bSocket.getInputStream();
                    mmOutStream = bSocket.getOutputStream();

                } catch (IOException e) {
                    Log.e(TAG, "temp sockets not created", e);
                    return;
                }
            }


            connected = true;
            connectFailure = false;
        }



        private Handler mhandler;


            public void read(){
                Log.i(TAG, "Read is running");

                int bufferSize = 1024;
                byte[] buffer = new byte[bufferSize];
                int bytes;
                String a = "";

                // Keep listening to the InputStream while connected
                while (true) {
                    try {
                        // Read from the InputStream
                        bytes = mmInStream.read(buffer);            

                        if ( bytes != -1){
                            while ((bytes==bufferSize)&&(buffer[bufferSize-1] != 0)){
                                a = a + new String(buffer, 0, bytes);
                                bytes = mmInStream.read(buffer);

                            }
                            a = a + new String(buffer, 0, bytes -1);
                            System.out.println("message " + a); 

                        }       

                    } catch (IOException e) {
                        Log.e(TAG, "disconnected", e);

                        break;
                    }

                }

            }




        public void write(byte[] buffer) {
            if (mmOutStream != null) {
                try {
                    mmOutStream.write(buffer);
                    Log.d(TAG, "Message Sent");
                } catch (IOException e) {
                    Log.e(TAG, "Exception during write", e);
                }
            } else {
                //mgr.showConnectionErrBox();
            }
        }

        public void stopConnection() {
            try {
                if(bSocket != null)
                    bSocket.close();
                Log.e(TAG, "Connection closed");
            } catch (IOException e) {
                Log.e(TAG, "close() of connect socket failed", e);
            }
        }

        public BluetoothDevice getCurrentDevice() {
            return currentDevice;
        }

        public void setCurrentDevice(BluetoothDevice currentDevice) {
            this.currentDevice = currentDevice;
        }

        public ArrayList<String> getMessage() {
            return message;
        }

        public void setMessage(ArrayList<String> message) {
            this.message = message;
        }


    }

下面是影响部分

if(connected){
                mgr.connectedDialog();
                mgr.msgsent();      
                System.out.println("Calibration connected");

                int bufferSize = 1024;
                byte[] buffer = new byte[bufferSize];
                int bytes;
                String apple = "";

                // Keep listening to the InputStream while connected
                while (true) {
                    try {
                        // Read from the InputStream
                        bytes = mmInStream.read(buffer);            

                        if ( bytes != -1){
                            while ((bytes==bufferSize)&&(buffer[bufferSize-1] != 0)){
                                apple = apple + "_" + new String(buffer, 0, bytes);
                                bytes = mmInStream.read(buffer);

                            }
                            apple = apple + new String(buffer, 0, bytes -1);
                            System.out.println("message " + apple); 


                            //pass data to UI CalibrationActivity
                            System.out.println("message out " + apple);
                            Message msga = mhandler.obtainMessage();
                            Bundle bundle = new Bundle();
                            bundle.putString("key", apple);
                            msga.setData(bundle);
                            mhandler.sendMessage(msga); 
                        }       

                    } catch (IOException e) {
                        Log.e(TAG, "disconnected", e);

                        break;
                    }
                }

            }

下面是我的校准活动的代码

package com.android;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import com.android.SimpleGestureFilter.SimpleGestureListener;
import com.android.backend.data.Playlist;
import com.android.backend.data.PlaylistManager;
import com.android.backend.data.SwitchBar;
import com.android.backend.data.bluetooth.BluetoothManager;
import com.android.backend.data.bluetooth.Connection;
import com.android.ui.UIManager;
import com.android.ui.playlist.PlaylistEntryList;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;

//public class CalibrationActivity extends Activity{
public class CalibrationActivity extends Activity  implements SimpleGestureListener{


    String gotBread;


        public void handleMessage(Message msg)
        {    switch(msg.what){

                case 2: 
                    Bundle got = getIntent().getExtras();
                    gotBread = got.getString("key");

                    TextView aa = (TextView) this.findViewById(R.id.stringinput);
                    aa.setText(gotBread);




                    break;
             }
        }





    private SimpleGestureFilter detector;

    @Override
    public boolean dispatchTouchEvent(MotionEvent me){
        this.detector.onTouchEvent(me);
        return super.dispatchTouchEvent(me);
    }

    @Override
    public void onSwipe(int direction) {
        // TODO Auto-generated method stub
        //final MainActivity tt = this;

        String str = "";

        switch (direction) {

        //case SimpleGestureFilter.SWIPE_RIGHT : str = "Swipe Right";
        case SimpleGestureFilter.SWIPE_RIGHT : this.finish();
        break;

        case SimpleGestureFilter.SWIPE_LEFT :  str = "Swipe Left";
        break;

        case SimpleGestureFilter.SWIPE_DOWN :  str = "Swipe Down";
        break;


        case SimpleGestureFilter.SWIPE_UP :    str = "Swipe Up";
        break;

        }
        //Toast.makeText(this, str, Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onDoubleTap() {
        // TODO Auto-generated method stub
        //Toast.makeText(this, "Double Tap", Toast.LENGTH_SHORT).show();
        //Do Nothing for now future development

    }



    private PlaylistManager playlistMgr;

    private PlaylistEntryList playlistView; // Data for listview, stores current
    // playlist in memory

    public String createdNameList; // Indicated the name of currently Name of
    // playlist that is being created

    public Dialog dialog_customizePL, dialog_createPL, dialog_customizePLms;    // Dialog boxes for
    // Playlist creation

    public UIManager uiMgr = new UIManager();

    public String CONNECTED_DEVICE_MAC;

    public String dialogboxtext;

    public Connection Conn;

    int i = 0;

    protected void onPause() {
        super.onPause();
        //BluetoothManager.getInstance().disconnectAll();
        unregisterReceiver(mRvcau);     //Sequence is important
        System.exit(0); // Kill off all thread to prevent connectiong lost popup
        // I use system because is a calibration so I want user not to leave the activity else cannot calibrate

    }


    protected void onResume() {  //restart bluetooth is accidently off it
        super.onResume();

        BluetoothManager.getInstance().init();
        BluetoothManager.getInstance().getBluetoothAdapter().enable();

        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED); // IntentFilter class is important to declare for below filter
        registerReceiver(mRvcau,filter); // mRvcau is the location of logic, filter is message identify by android

        filter = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED); // Future deveploment
        registerReceiver(mRvcau,filter); 

        filter = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED); // Future deveploment
        registerReceiver(mRvcau,filter);

        filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED); //    Future deveploment
        registerReceiver(mRvcau,filter);
    }

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



        detector = new SimpleGestureFilter(this,this);      ////////////////// For Gesture 

        playlistMgr = PlaylistManager.getInstance();

        initUI();
        uiMgr.initPlayListUI(this);

    }


    int connect = 0; // Check connection
    int disconnect = 0; // Check disconnection
    int requestdisconnect = 0;
    int connectstatuschanges = 0;

    public BroadcastReceiver mRvcau = new BroadcastReceiver(){ // The new is instantiate the class **always read from the back
        // The line from the back is creating an instantiate of this class          
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
                //AutoActivity.this.finish();
                connect = 1;    // prevent activity from exiting
                System.out.println("ACTION_ACL_CONNECTED " + connect);  

            }
            else
            {
                connect = 0;
                System.out.println("ACTION_ACL_CONNECTED " + connect);
            }


            if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {   //future development
                disconnect = 1;
                System.out.println("ACTION_ACL_DISCONNECTED " + disconnect);
            }
            else
            {
                disconnect = 0;
                System.out.println("ACTION_ACL_DISCONNECTED " + disconnect);
            }

            if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {   //future development
                requestdisconnect = 1;
                System.out.println("ACTION_ACL_DISCONNECT_REQUESTED " + requestdisconnect);
            }
            else
            {
                requestdisconnect = 0;
                System.out.println("ACTION_ACL_DISCONNECT_REQUESTED " + requestdisconnect);
            }

            if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { //future development
                connectstatuschanges = 1;
                System.out.println("ACTION_BOND_STATE_CHANGED " + connectstatuschanges);
            }
            else
            {
                connectstatuschanges = 0;
                System.out.println("ACTION_BOND_STATE_CHANGED " + connectstatuschanges);
            }

        }
    };

    /**
     * Init layout component. Define Listener for Buttons and Dataset for
     * ListViews
     */
    @SuppressLint("ParserError")
    public void initUI() {


        Button Orange = (Button) findViewById(R.id.CalibrationOrange);  // new method on test using image
        Orange.setOnClickListener(new OnClickListener() {

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

            }
        });

        Button Blue = (Button) findViewById(R.id.CalibrationBlue);  // new method on test using image icon to on the switch
        Blue.setOnClickListener(new OnClickListener() {

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

            }
        });

        Button Green = (Button) findViewById(R.id.CalibrationGreen);    // new method on test using image icon to on the switch
        Green.setOnClickListener(new OnClickListener() {

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

            }
        });


        loadDataToMem();
    }


    public void activiteSingleConnection(int i) {

        BluetoothManager btMgr = BluetoothManager.getInstance();
        BluetoothDevice device = btMgr.getBluetoothAdapter().getRemoteDevice(
                CONNECTED_DEVICE_MAC);
        ArrayList<String> msg = new ArrayList<String>();
        if(i == 20){
            msg.add("N");
        }

        if(i == 21){
            msg.add("J");
        }

        if(i == 22){
            msg.add("I");
        }

        CharSequence fruit = null;
        TextView aa = (TextView) this.findViewById(R.id.stringinput);
        aa.setText(fruit);

        btMgr.calibratesentMessage(uiMgr, device, msg);
    }

    public void loadDataToMem() {
        try {
            String str = "";
            //StringBuffer buf = new StringBuffer();
            FileInputStream input = this.openFileInput("bone.txt");
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    input));
            if (input != null) {
                while ((str = reader.readLine()) != null) {
                    String[] buff = str.split(",");
                    TextView topView = (TextView) this
                            .findViewById(R.id.remotedevicecalibrationtextview1);
                    TextView bottomView = (TextView) this
                            .findViewById(R.id.remotedevicecalibrationtextView2);
                    topView.setText("Name : " + buff[0]);
                    bottomView.setText("Mac : " + buff[2]);
                    this.CONNECTED_DEVICE_MAC = buff[2];
                    Log.d("loadDataToMem", str);
                }
            }
            input.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

以下是我的日志猫错误消息

09-13 10:50:33.640: W/dalvikvm(2086): threadid=9: thread exiting with uncaught exception (group=0x40015560)
09-13 10:50:33.667: E/AndroidRuntime(2086): FATAL EXCEPTION: Thread-10
09-13 10:50:33.667: E/AndroidRuntime(2086): java.lang.NullPointerException
09-13 10:50:33.667: E/AndroidRuntime(2086):     at com.android.backend.data.bluetooth.Connection.run(Connection.java:196)

希望有人可以建议我如何解决。谢谢你。

4

0 回答 0