Ankit Sharma
Ankit Sharma

Reputation: 158

Android Bluetooth App Crashes on click of a button

Android Bluetooth App Crashes on click of a button, I have googled the issue but dint get the relevant answer. Please help I am new to android. I am creating a Bluetooth app using the android studio, it crashes whenever I click on connect device button. below is the code in which I think the error is.

DeviceActivity.java

package com.contec.activity;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;

import com.contec.spmw.R;

import android.app.Activity;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class DeviceActivity extends Activity {
    /** Called when the activity is first created. */

    private ListView mListView;
    private ArrayList<SiriListItem> list;
    private Button seachButton, serviceButton;
    ChatListAdapter mAdapter;
    Context mContext;
    private String mstraddress = "";


    private BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();

    @Override
    public void onStart() {
        super.onStart();
        // If BT is not on, request that it be enabled.
        if (!mBtAdapter.isEnabled()) {
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, 3);
        }
    }   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.devices);
        mContext = this;

        init();
    }    

    private void init() {
        list = new ArrayList<SiriListItem>();
        mAdapter = new ChatListAdapter(this, list);
        mListView = (ListView) findViewById(R.id.list);
        mListView.setAdapter(mAdapter);
        mListView.setFastScrollEnabled(true);
        mListView.setOnItemClickListener(mDeviceClickListener);     

        // Register for broadcasts when discovery has finished
        IntentFilter foundFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        this.registerReceiver(mReceiver, foundFilter);

         // Register for broadcasts when a device is discovered
        IntentFilter discoveryFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        this.registerReceiver(mReceiver, discoveryFilter);

        // Get a set of currently paired devices
        Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();

        // If there are paired devices, add each one to the ArrayAdapter
        if (pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {
                list.add(new SiriListItem(device.getName() + "\n" + device.getAddress(), true));
                mAdapter.notifyDataSetChanged();
                mListView.setSelection(list.size() - 1);
            }
        } else {
            list.add(new SiriListItem("Some CHinese Text", true));
            mAdapter.notifyDataSetChanged();
            mListView.setSelection(list.size() - 1);
        }

        seachButton = (Button)findViewById(R.id.start_seach);
        seachButton.setOnClickListener(seachButtonClickListener);

    }    
     private OnClickListener seachButtonClickListener = new OnClickListener() {
         @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                if(mBtAdapter.isDiscovering()) 
                {
                    mBtAdapter.cancelDiscovery();
                    //seachButton.setText("重新搜索");
                    seachButton.setText("Re Find");
                }
                else
                {
                    list.clear();
                    mAdapter.notifyDataSetChanged();

                    Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
                    if (pairedDevices.size() > 0) {
                            for (BluetoothDevice device : pairedDevices) {
                                list.add(new SiriListItem(device.getName() + "\n" + device.getAddress(), true));
                                mAdapter.notifyDataSetChanged();
                                mListView.setSelection(list.size() - 1);
                            }
                    } else {
                            list.add(new SiriListItem("No devices have been paired", true));
                            mAdapter.notifyDataSetChanged();
                            mListView.setSelection(list.size() - 1);
                     }                  

                    mBtAdapter.startDiscovery();
                    //seachButton.setText("Some Chinese Text");
                    seachButton.setText("stop");
                }                
            }
        };


    // The on-click listener for all devices in the ListViews
    private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {
        public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {
            // Cancel discovery because it's costly and we're about to connect     

            SiriListItem item = list.get(arg2);
            String info = item.message;
            mstraddress = info.substring(info.length() - 17);                 
        //    Bluetooth.BlueToothAddress = address;

             AlertDialog.Builder StopDialog =new AlertDialog.Builder(mContext);
             //StopDialog.setTitle("Some CHinese Text");          
             StopDialog.setTitle("connect");
             StopDialog.setMessage(item.message);
             //StopDialog.setPositiveButton("Some CHinese Text", new DialogInterface.OnClickListener() {  
             StopDialog.setPositiveButton("connect", new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int which) {  
                 // TODO Auto-generated method stub   
                 mBtAdapter.cancelDiscovery();
                 //seachButton.setText("Some Chinese Text");     
                 seachButton.setText("Re find");

         //      Bluetooth.serviceOrCilent=ServerOrCilent.CILENT;
         //        Bluetooth.mTabHost.setCurrentTab(1);   

                if(!mstraddress.equals("null"))
                {
                    //device = mBtAdapter.getRemoteDevice(mstraddress); 

                    //clientConnectThread = new clientThread();
                    //clientConnectThread.start();

                    Intent intent2 = new Intent();
                    intent2.setClass(DeviceActivity.this, MainActivity.class);

                    Bundle bundle = new Bundle();
                    bundle.putString("straddress", mstraddress);
                    intent2.putExtra("bundle", bundle);

                    setResult(0, intent2);
                    DeviceActivity.this.finish();
                }
                else
                {
                    Toast.makeText(DeviceActivity.this, "address is null !", Toast.LENGTH_SHORT).show();
                }

             }  
             });
             //StopDialog.setNegativeButton("Some CHinese Text",new DialogInterface.OnClickListener() {                       
             StopDialog.setNegativeButton("cancel",new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int which) {  
         //          Bluetooth.BlueToothAddress = null;
                 }
             });
             StopDialog.show();                            
        }
    };  

    private Handler LinkDetectedHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            if (msg.what == 0)
            {
                Toast.makeText(mContext, (String)msg.obj, Toast.LENGTH_SHORT).show();
            }
            else if (msg.what == 1)
            {
                String str = "Some chinese Text:\r\n" + (String)msg.obj;
                Toast.makeText(mContext, str, Toast.LENGTH_SHORT).show();//测试
            }

        }

    };    

    // The BroadcastReceiver that listens for discovered devices and
    // changes the title when discovery is finished
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) 
            {
                // Get the BluetoothDevice object from the Intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // If it's already paired, skip it, because it's been listed already
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) 
                {
                    list.add(new SiriListItem(device.getName() + "\n" + device.getAddress(), false));
                    mAdapter.notifyDataSetChanged();
                    mListView.setSelection(list.size() - 1);
                }
            // When discovery is finished, change the Activity title
            } 
            else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) 
            {
                setProgressBarIndeterminateVisibility(false);
                if (mListView.getCount() == 0) 
                {
                    //list.add(new SiriListItem("Some CHinese Text", false));
                    list.add(new SiriListItem("not find bluetooth", false));
                    mAdapter.notifyDataSetChanged();
                    mListView.setSelection(list.size() - 1);
                }
                //seachButton.setText("Some CHinese Text");
                seachButton.setText("Re find");
            }
        }
    };  

    public class SiriListItem {
        String message;
        boolean isSiri;
        public SiriListItem(String msg, boolean siri) {
            message = msg;
            isSiri = siri;
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();

        // Make sure we're not doing discovery anymore
        if (mBtAdapter != null) {
            mBtAdapter.cancelDiscovery();
        }

        // Unregister broadcast listeners
        this.unregisterReceiver(mReceiver);
    }
}

Logcat

 --------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.contec.spmw, PID: 1937
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.contec.spmw/com.contec.activity.DeviceActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Set android.bluetooth.BluetoothAdapter.getBondedDevices()' on a null object reference
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
                      at android.app.ActivityThread.access$800(ActivityThread.java:144)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5221)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Set android.bluetooth.BluetoothAdapter.getBondedDevices()' on a null object reference
                      at com.contec.activity.DeviceActivity.init(DeviceActivity.java:227)
                      at com.contec.activity.DeviceActivity.onCreate(DeviceActivity.java:204)
                      at android.app.Activity.performCreate(Activity.java:5937)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
                      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5221) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
I/Process: Sending signal. PID: 1937 SIG: 9
Application terminated.

Upvotes: 0

Views: 2227

Answers (1)

Arkar Aung
Arkar Aung

Reputation: 3584

Try to check whether BluetoothAdapter is null before calling getBondedDevices because it will return null if Bluetooth is not support on your device. According to your comment in your question, Bluetooth is not supported on Android Emulator. Please check it in documentation.

BluetoothAdapter - the default local adapter, or null if Bluetooth is not supported on this hardware platform

Check it as below :

if (mBtAdapter != null && mBtAdapter.isEnabled()) {
    // do your task
    Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
} else {
    // Bluetooth is not supported on your hardware
}

Hope it will be helpful for you.

Upvotes: 1

Related Questions