Hi my problem is I'm not able to get data from arduino to android. The concept is to display the value of arduino on android. Do you have a code for recieving data on android from arduino?
This is my codes
package com.example.arduinosensors;
import java.util.Set;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class DeviceListActivity extends Activity {
// Debugging for LOGCAT
private static final String TAG = "DeviceListActivity";
private static final boolean D = true;
// declare button for launching website
and textview for connection status
Button tlbutton;
TextView textView1;
// EXTRA string to send on to mainactivity
public static String EXTRA_DEVICE_ADDRESS = "device_address";
// Member fields
private BluetoothAdapter mBtAdapter;
private ArrayAdapter<String> mPairedDevicesArrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.device_list);
}
@Override
public void onResume()
{
super.onResume();
//***************
checkBTState();
textView1 = (TextView) findViewById(R.id.connecting);
textView1.setTextSize(40);
textView1.setText(" ");
// Initialize array adapter for paired devices
mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);
// Find and set up the ListView for paired devices
ListView pairedListView = (ListView)
findViewById(R.id.paired_devices);
pairedListView.setAdapter(mPairedDevicesArrayAdapter);
pairedListView.setOnItemClickListener(mDeviceClickListener);
// Get the local Bluetooth adapter
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
// Get a set of currently paired devices and append to '
pairedDevices'
Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
// Add previosuly paired devices to the array
if (pairedDevices.size() > 0) {
findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE)
;//make title viewable
for (BluetoothDevice device : pairedDevices) {
mPairedDevicesArrayAdapter.add(device.getName() + "\n" +
device.getAddress());
}
} else {
String noDevices =
getResources().getText(R.string.none).toString();
mPairedDevicesArrayAdapter.add(noDevices);
}
}
// Set up on-click listener for the list (nicked this - unsure)
private OnItemClickListener mDeviceClickListener = new
OnItemClickListener() {
public void onItemClick(AdapterView<?> av, View v, int arg2, long
arg3) {
textView1.setText("Connecting...");
// Get the device MAC address, which is the last 17 chars
in the View
String info = ((TextView) v).getText().toString();
String address = info.substring(info.length() - 17);
// Make an intent to start next activity while taking
an extra which is the MAC address.
Intent i = new Intent(DeviceListActivity.this,
MainActivity.class);
i.putExtra(EXTRA_DEVICE_ADDRESS, address);
startActivity(i);
}
};
private void checkBTState() {
// Check device has Bluetooth and that it is turned on
mBtAdapter=BluetoothAdapter.getDefaultAdapter();
// CHECK THIS OUT THAT IT WORKS!!!
if(mBtAdapter==null) {
Toast.makeText(getBaseContext(),
"Device does not support Bluetooth", Toast.LENGTH_SHORT).show();
} else {
if (mBtAdapter.isEnabled()) {
Log.d(TAG, "...Bluetooth ON...");
} else {
//Prompt user to turn on Bluetooth
Intent enableBtIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, 1);
}
}
}
}
MAIN ACTIVITY
package com.example.arduinosensors;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
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.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
Button btnOn, btnOff;
TextView txtArduino, txtString, txtStringLength, sensorView0,
sensorView1, sensorView2, sensorView3;
Handler bluetoothIn;
final int handlerState = 0; //used to identify
handler message
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private StringBuilder recDataString = new StringBuilder();
private ConnectedThread mConnectedThread;
// SPP UUID service - this should work for most devices
private static final UUID BTMODULEUUID =
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
// String for MAC address
private static String address;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Link the buttons and textViews to respective views
btnOn = (Button) findViewById(R.id.buttonOn);
btnOff = (Button) findViewById(R.id.buttonOff);
txtString = (TextView) findViewById(R.id.txtString);
txtStringLength = (TextView) findViewById(R.id.testView1);
sensorView0 = (TextView) findViewById(R.id.sensorView0);
sensorView1 = (TextView) findViewById(R.id.sensorView1);
sensorView2 = (TextView) findViewById(R.id.sensorView2);
sensorView3 = (TextView) findViewById(R.id.sensorView3);
bluetoothIn = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == handlerState)
{ //if message is what we want
String readMessage = (String)
msg.obj;
// msg.arg1 = bytes from connect thread
recDataString.append(readMessage);
// keep appending to string until ~
int endOfLineIndex =
recDataString.indexOf("~");
// determine the end-of-line
if (endOfLineIndex > 0)
{ // make sure there data
before ~
String dataInPrint =
recDataString.substring(0, endOfLineIndex); // extract string
txtString.setText("Data Received = " + dataInPrint);
int dataLength = dataInPrint.length();
//get length of data received
txtStringLength.setText("String Length = " +
String.valueOf(dataLength));
if (recDataString.charAt(0) ==
'#')
//if it starts with # we know it is what we are looking for
{
String sensor0 = recDataString.substring(1, 5);
//get sensor value from string between indices 1-5
String sensor1 = recDataString.substring(6, 10);
//same again...
String sensor2 = recDataString.substring(11, 15);
String sensor3 = recDataString.substring(16, 20);
sensorView0.setText(" Sensor 0 Voltage = " + sensor0 + "V");
//update the textviews with sensor values
sensorView1.setText(" Sensor 1 Voltage = " + sensor1 + "V");
sensorView2.setText(" Sensor 2 Voltage = " + sensor2 + "V");
sensorView3.setText(" Sensor 3 Voltage = " + sensor3 + "V");
}
recDataString.delete(0, recDataString.length());
//clear all string data
// strIncom =" ";
dataInPrint = " ";
}
}
}
};
btAdapter = BluetoothAdapter.getDefaultAdapter();
// get Bluetooth adapter
checkBTState();
// Set up onClick listeners for buttons to send 1 or 0 to turn on/off LED
btnOff.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mConnectedThread.write("0"); // Send "0" via Bluetooth
Toast.makeText(getBaseContext(),
"Turn off LED", Toast.LENGTH_SHORT).show();
}
});
btnOn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mConnectedThread.write("1"); // Send "1" via Bluetooth
Toast.makeText(getBaseContext(),
"Turn on LED", Toast.LENGTH_SHORT).show();
}
});
}
private BluetoothSocket createBluetoothSocket(BluetoothDevice device)
throws IOException {
return device.createRfcommSocketToServiceRecord(BTMODULEUUID);
//creates secure outgoing connecetion with BT device using UUID
}
@Override
public void onResume() {
super.onResume();
//Get MAC address from DeviceListActivity via intent
Intent intent = getIntent();
//Get the MAC address from the DeviceListActivty via EXTRA
address = intent.getStringExtra(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
//create device and set the MAC address
BluetoothDevice device = btAdapter.getRemoteDevice(address);
try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
Toast.makeText(getBaseContext(), "Socket creation failed",
Toast.LENGTH_LONG).show();
}
// Establish the Bluetooth socket connection.
try
{
btSocket.connect();
} catch (IOException e) {
try
{
btSocket.close();
} catch (IOException e2)
{
//insert code to deal with this
}
}
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
//I send a character when resuming.beginning transmission to check
device is connected
//If it is not an exception will be thrown in the write method and
finish() will be called
mConnectedThread.write("x");
}
@Override
public void onPause()
{
super.onPause();
try
{
//Don't leave Bluetooth sockets open when leaving activity
btSocket.close();
} catch (IOException e2) {
//insert code to deal with this
}
}
//Checks that the Android device Bluetooth is available and prompts to
be turned on if off
private void checkBTState() {
if(btAdapter==null) {
Toast.makeText(getBaseContext(),
"Device does not support bluetooth", Toast.LENGTH_LONG).show();
} else {
if (btAdapter.isEnabled()) {
} else {
Intent enableBtIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, 1);
}
}
}
//create new class for connect thread
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
private final OutputStream mmOutStream;
//creation of the connect thread
public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;
try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[256];
int bytes;
// Keep looping to listen for received messages
while (true) {
try {
bytes = mmInStream.read(buffer);
//read bytes from input buffer
String readMessage = new String(buffer, 0, bytes);
// Send the obtained bytes to the UI Activity via handler
bluetoothIn.obtainMessage(handlerState, bytes, -1,
readMessage).sendToTarget();
} catch (IOException e) {
break;
}
}
}
//write method
public void write(String input) {
byte[] msgBuffer = input.getBytes();
//converts entered String into bytes
try {
mmOutStream.write(msgBuffer);
//write bytes over BT connection via outstream
} catch (IOException e) {
//if you cannot write, close the application
Toast.makeText(getBaseContext(),
"Connection Failure", Toast.LENGTH_LONG).show();
finish();
}
}
}
}
THIS IS THE ERROR ON LOGCAT
02-01 04:45:41.274: W/dalvikvm(1112): threadid=1: thread exiting with uncaught exception (group=0xb3aa8b90)
02-01 04:45:41.304: E/AndroidRuntime(1112): FATAL EXCEPTION: main
02-01 04:45:41.304: E/AndroidRuntime(1112): Process: com.example.arduinosensors, PID: 1112
02-01 04:45:41.304: E/AndroidRuntime(1112):
java.lang.RuntimeException:
Unable to resume activity {com.example.arduinosensors/com.example.arduinosensors.DeviceListActivity}: java.lang.NullPointerException
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2769)
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2798)
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2231)
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.app.ActivityThread.access$700(ActivityThread.java:135)
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.os.Handler.dispatchMessage(Handler.java:102)
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.os.Looper.loop(Looper.java:137)
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.app.ActivityThread.main(ActivityThread.java:4998)
02-01 04:45:41.304: E/AndroidRuntime(1112): at java.lang.reflect.Method.invokeNative(Native Method)
02-01 04:45:41.304: E/AndroidRuntime(1112): at java.lang.reflect.Method.invoke(Method.java:515)
02-01 04:45:41.304: E/AndroidRuntime(1112): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
02-01 04:45:41.304: E/AndroidRuntime(1112): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
02-01 04:45:41.304: E/AndroidRuntime(1112): at dalvik.system.NativeStart.main(Native Method)
02-01 04:45:41.304: E/AndroidRuntime(1112): Caused by: java.lang.NullPointerException
02-01 04:45:41.304: E/AndroidRuntime(1112): at com.example.arduinosensors.DeviceListActivity.onResume(DeviceListActivity.java:66)
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.app.Activity.performResume(Activity.java:5322)
02-01 04:45:41.304: E/AndroidRuntime(1112): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2759)
02-01 04:45:41.304: E/AndroidRuntime(1112): ... 12 more
Go to the github link specified in the web page you mentioned in your comment. Download the zip and use it to create a new android application project from existing code in Eclipse. It should work without crashing. I just tried it.
Update:
The reason for the null pointer is because the emulator doesn't support Bluetooth and you are trying to access the Bluetooth Adapter on the emulator. You can read more about the limitations of the emulator in the documentation .
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.