Asad
Asad

Reputation: 63

Android Bluetooth app Crashing on second activity

Hi guys I'm really tired after lot of struggle I'm posting this question please help. app is crashing no idea why. any help will be appreciated. Kindly help I'm using android studio.

DEVICELISTACTIVITY

package com.smarthomeASAD.echohome;

import java.util.Set;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
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.TextView;
import android.widget.Toast;

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);

        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_paired)
                    .toString();
            mPairedDevicesArrayAdapter.add(noDevices);
        }

        MediaPlayer welcome = MediaPlayer.create(getApplicationContext(),
                R.raw.wlcom);

        welcome.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                // Code to start the next audio in the sequence
                final MediaPlayer selectroom = MediaPlayer.create(
                        getApplicationContext(), R.raw.selectroom);

                selectroom.start();
            }
        });
        welcome.start();

    }

    // 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);
            Toast.makeText(getBaseContext(), "main acitvity started...",
                    Toast.LENGTH_LONG).show();
        }
    };

    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);

            }
        }
    }
}

ACTIVITY_MAIN

package com.smarthomeASAD.echohome;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
import com.smarthomeASAD.echohome.R;

public class MainActivity extends Activity {
    public InputStream mmInStream = null;
    public OutputStream mmOutStream = null;
    public boolean connectionfailureb = false;
    Button btnOn, btnOff;
    TextView txtArduino, txtString, txtStringLength, sensorView0, sensorView1,
            sensorView2, sensorView3;
    static 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;

    @SuppressLint("HandlerLeak")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        // ==========================TOGGLE BUTTONS=============
        ToggleButton t1 = (ToggleButton) findViewById(R.id.tb1);
        ToggleButton t2 = (ToggleButton) findViewById(R.id.tb2);
        ToggleButton t3 = (ToggleButton) findViewById(R.id.tb3);
        ToggleButton t4 = (ToggleButton) findViewById(R.id.tb4);
        ToggleButton t5 = (ToggleButton) findViewById(R.id.tb5);
        // =========================TOGGLE BUTTONS==============

        // >>>>>>>>>>>>>>>>>>>MEDIA--------------------------
        final MediaPlayer sciencedanger = MediaPlayer.create(
                getApplicationContext(), R.raw.science_fiction_danger_alarm);
        final MediaPlayer motiondetected = MediaPlayer.create(
                getApplicationContext(), R.raw.motion_detected);
        // <<<<<<<<<<<<<<<<<<<MEDIA-<<<<<<<<<<<<<<<<<<<<<<<<
        // Link the buttons and textViews to respective views
        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
                    Log.i("handler", null);
                    String readMessage = (String) msg.obj;
                    recDataString.append(readMessage);
                    int endOfLineIndex = recDataString.indexOf("~");
                    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();
                        txtStringLength.setText("String Length = "
                                + String.valueOf(dataLength));

                        if (recDataString.charAt(0) == '#') {
                            String sensor0 = recDataString.substring(1, 5);
                            // =================================================MOD--------------------
                            Log.i("IN RecData", readMessage);
                            if (sensor0.equals("1.00")) {
                                sciencedanger.start();
                                motiondetected.start();
                            } else {
                            }

                            // =================================================MOD--------------------

                            sensorView0.setText(" Sensor 0 Voltage = "
                                    + sensor0);

                        }
                        recDataString.delete(0, recDataString.length());
                        dataInPrint = " ";
                    }
                }
            }
        };

        btAdapter = BluetoothAdapter.getDefaultAdapter(); // get Bluetooth
                                                            // adapter
        checkBTState();

        // Set up onClick listeners for buttons to send 1 or 0 to turn on/off
        // LED

        // ========================================================
        // ========================================================
        t1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if (isChecked) {
                    try {
                        mConnectedThread.write("1");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Toast.makeText(getBaseContext(), "ON", Toast.LENGTH_SHORT)
                            .show();
                } else {
                    // The toggle is disabled
                    try {
                        mConnectedThread.write("0");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Toast.makeText(getBaseContext(), "OFF", Toast.LENGTH_SHORT)
                            .show();
                }
            }
        });
        t2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if (isChecked) {
                    try {
                        mConnectedThread.write("2");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Toast.makeText(getBaseContext(), "ON", Toast.LENGTH_SHORT)
                            .show();
                } else {
                    // The toggle is disabled
                    try {
                        mConnectedThread.write("3");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Toast.makeText(getBaseContext(), "OFF", Toast.LENGTH_SHORT)
                            .show();
                }
            }
        });
        t3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if (isChecked) {
                    try {
                        mConnectedThread.write("4");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Toast.makeText(getBaseContext(), "ON", Toast.LENGTH_SHORT)
                            .show();
                } else {
                    // The toggle is disabled
                    try {
                        mConnectedThread.write("5");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Toast.makeText(getBaseContext(), "OFF", Toast.LENGTH_SHORT)
                            .show();
                }
            }
        });
        t4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if (isChecked) {
                    try {
                        mConnectedThread.write("6");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Toast.makeText(getBaseContext(), "ON", Toast.LENGTH_SHORT)
                            .show();
                } else {
                    // The toggle is disabled
                    try {
                        mConnectedThread.write("7");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Toast.makeText(getBaseContext(), "OFF", Toast.LENGTH_SHORT)
                            .show();
                }
            }
        });
        t5.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if (isChecked) {
                    try {
                        mConnectedThread.write("8");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Toast.makeText(getBaseContext(), "ON", Toast.LENGTH_SHORT)
                            .show();
                } else {
                    // The toggle is disabled
                    try {
                        mConnectedThread.write("9");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Toast.makeText(getBaseContext(), "OFF", 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 {
                mmInStream.close();
                mmOutStream.close();
                btSocket.close();
            } catch (IOException e2) {
                Toast.makeText(getBaseContext(),
                        "closing exception btSocket sonnection problem",
                        Toast.LENGTH_LONG).show();
                // 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
        try {
            mConnectedThread.write("x");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Toast.makeText(getBaseContext(), "Thread can't write",
                    Toast.LENGTH_LONG).show();
        }
    }

    @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 {

        // 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;
        }

        // =================================================MOD--------------------

        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) {
                    Toast.makeText(getBaseContext(), "listner eror",
                            Toast.LENGTH_LONG).show();
                    break;
                }
            }
        }

        // =================================================MOD--------------------
        // write method
        public void write(String input) throws InterruptedException {
            byte[] msgBuffer = input.getBytes(); // converts entered String into
                                                    // bytes
            try {
                mmOutStream.write(msgBuffer); // write bytes over BT connection
                                                // via outstream
                MediaPlayer connected = MediaPlayer.create(
                        getApplicationContext(), R.raw.connected);
                connected.start();
            } catch (IOException e) {

                // if you cannot write, close the application
                final MediaPlayer connectionfailure = MediaPlayer.create(
                        getApplicationContext(), R.raw.connectionfailure);
                connectionfailure
                        .setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            @Override
                            public void onCompletion(MediaPlayer mp) {
                                // Code to start the next audio in the sequence
                                Toast.makeText(getBaseContext(),
                                        "Connection Failure", Toast.LENGTH_LONG)
                                        .show();
                                finish();
                            }
                        });
                connectionfailure.start();

            }
            Thread.sleep(1000);

        }
    }
}

LOGCAT

 10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime: FATAL EXCEPTION: main
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {com.smarthomeASAD.echohome/com.smarthomeASAD.echohome.MainActivity}: java.lang.NullPointerException
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2918)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2947)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2382)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread.access$600(ActivityThread.java:167)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:99)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:153)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5341)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:511)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:929)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:  Caused by: java.lang.NullPointerException
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at com.smarthomeASAD.echohome.MainActivity.onResume(MainActivity.java:288)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1190)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.Activity.performResume(Activity.java:5203)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2905)
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2947) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2382) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread.access$600(ActivityThread.java:167) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:99) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:153) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5341) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:511) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:929) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
10-22 17:43:19.712 32054-32054/com.smarthomeASAD.echohome E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)

Upvotes: 0

Views: 434

Answers (1)

Ankur Aggarwal
Ankur Aggarwal

Reputation: 2220

In onResume(), whenever you play with intents, you must add a null check. When you do getIntent, it may actually return a null intent

Upvotes: 1

Related Questions