Reputation: 390
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
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