Rijdzuan Sampoerna
Rijdzuan Sampoerna

Reputation: 390

App crash after click on button (logcat include)

So I followed this tutorial How to receive serial data using android bluetooth I did it exactly what is said. But somehow the app crashed after clicking any button there. My Question are,

1) why would this happen? I mean if the app works well in past ADT why it didn't in recent ADT? what cause of this? cause i found some one also have similar problem from the source of the code http://bellcode.wordpress.com/2012/01/02/android-and-arduino-bluetooth-communication/

2) how could I fix this? I believe that code already well-structured, initialize the button first then set onclicklistener

3) can somebody tell what it supposed to be mean at this log? I am new in Android Programming here i include the logcat of report crash,

11-13 09:26:44.711 E/AndroidRuntime(14902): FATAL EXCEPTION: main
11-13 09:26:44.711 E/AndroidRuntime(14902): java.lang.NullPointerException
11-13 09:26:44.711 E/AndroidRuntime(14902):     at com.example.androidarduinopackage.MainActivity.closeBT(MainActivity.java:207)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at com.example.androidarduinopackage.MainActivity$3.onClick(MainActivity.java:90)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at android.view.View.performClick(View.java:3517)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at android.view.View$PerformClick.run(View.java:14155)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at android.os.Handler.handleCallback(Handler.java:605)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at android.os.Looper.loop(Looper.java:154)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at android.app.ActivityThread.main(ActivityThread.java:4624)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at java.lang.reflect.Method.invokeNative(Native Method)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at java.lang.reflect.Method.invoke(Method.java:511)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
11-13 09:26:44.711 E/AndroidRuntime(14902):     at dalvik.system.NativeStart.main(Native Method)

The code :

package Android.Arduino.Bluetooth;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.TextView;
import android.widget.EditText;  
import android.widget.Button;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;

public class MainActivity extends Activity
{
TextView myLabel;
EditText myTextbox;
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;
OutputStream mmOutputStream;
InputStream mmInputStream;
Thread workerThread;
byte[] readBuffer;
int readBufferPosition;
int counter;
volatile boolean stopWorker;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button openButton = (Button)findViewById(R.id.open);
    Button sendButton = (Button)findViewById(R.id.send);
    Button closeButton = (Button)findViewById(R.id.close);
    myLabel = (TextView)findViewById(R.id.label);
    myTextbox = (EditText)findViewById(R.id.entry);

    //Open Button
    openButton.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            try 
            {
                findBT();
                openBT();
            }
            catch (IOException ex) { }
        }
    });

    //Send Button
    sendButton.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            try 
            {
                sendData();
            }
            catch (IOException ex) { }
        }
    });

    //Close button
    closeButton.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            try 
            {
                closeBT();
            }
            catch (IOException ex) { }
        }
    });
}

void findBT()
{
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if(mBluetoothAdapter == null)
    {
        myLabel.setText("No bluetooth adapter available");
    }

    if(!mBluetoothAdapter.isEnabled())
    {
        Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBluetooth, 0);
    }

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    if(pairedDevices.size() > 0)
    {
        for(BluetoothDevice device : pairedDevices)
        {
            if(device.getName().equals("MattsBlueTooth")) 
            {
                mmDevice = device;
                break;
            }
        }
    }
    myLabel.setText("Bluetooth Device Found");
}

void openBT() throws IOException
{
    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //Standard SerialPortService ID
    mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);        
    mmSocket.connect();
    mmOutputStream = mmSocket.getOutputStream();
    mmInputStream = mmSocket.getInputStream();

    beginListenForData();

    myLabel.setText("Bluetooth Opened");
}

void beginListenForData()
{
    final Handler handler = new Handler(); 
    final byte delimiter = 10; //This is the ASCII code for a newline character

    stopWorker = false;
    readBufferPosition = 0;
    readBuffer = new byte[1024];
    workerThread = new Thread(new Runnable()
    {
        public void run()
        {                
           while(!Thread.currentThread().isInterrupted() && !stopWorker)
           {
                try 
                {
                    int bytesAvailable = mmInputStream.available();                        
                    if(bytesAvailable > 0)
                    {
                        byte[] packetBytes = new byte[bytesAvailable];
                        mmInputStream.read(packetBytes);
                        for(int i=0;i<bytesAvailable;i++)
                        {
                            byte b = packetBytes[i];
                            if(b == delimiter)
                            {
     byte[] encodedBytes = new byte[readBufferPosition];
     System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
     final String data = new String(encodedBytes, "US-ASCII");
     readBufferPosition = 0;

                                handler.post(new Runnable()
                                {
                                    public void run()
                                    {
                                        myLabel.setText(data);
                                    }
                                });
                            }
                            else
                            {
                                readBuffer[readBufferPosition++] = b;
                            }
                        }
                    }
                } 
                catch (IOException ex) 
                {
                    stopWorker = true;
                }
           }
        }
    });

    workerThread.start();
}

void sendData() throws IOException
{
    String msg = myTextbox.getText().toString();
    msg += "\n";
    mmOutputStream.write(msg.getBytes());
    myLabel.setText("Data Sent");
}

void closeBT() throws IOException
{
    stopWorker = true;
    mmOutputStream.close();
    mmInputStream.close();
    mmSocket.close();
    myLabel.setText("Bluetooth Closed");
}
}

Upvotes: 1

Views: 576

Answers (1)

l2mt
l2mt

Reputation: 550

One or more of these of these objects inside closeBT method is null: mOutputStream, mmInputStream, mmSocket. You should verify that these objects are not null. If mmSocket is null you should review why this object isn't inicialized. Could be something related to the bluetooth adapter or the code your are using is not compatible with the version of the android.

Upvotes: 1

Related Questions