简体   繁体   English

应用程序在蓝牙发现期间崩溃

[英]App crashes during Bluetooth discovery

What I'm trying to do我想做什么

I'm trying to create an app that searches all the Bluetooth devices nearby and connects to the ones user wishes to connect to.我正在尝试创建一个应用程序来搜索附近的所有蓝牙设备并连接到用户希望连接的设备。

I'm trying to create a Connect button in one activity that starts the discovery function in another activity我正在尝试在一个活动中创建一个连接按钮,以在另一个活动中启动发现功能

How I'm trying to do it我是如何努力做到的

So I have this MainActivity.java class / activity that has the Connect button.所以我有这个MainActivity.java类/具有连接按钮的活动。 Upon clicking this button, it should do three things:单击此按钮后,它应该做三件事:

  1. Check if the Bluetooth on my Smartphone is on & if it's not, turn it on.检查我的智能手机上的蓝牙是否已打开,如果未打开,请将其打开。
  2. Display a TOAST message to show whether BT has been successfully turned on or not显示 TOAST 消息以显示 BT 是否已成功开启
  3. Start this new activity, called SearchBTDevice.java that looks for nearby BT devices & list them in a ListView启动这个名为SearchBTDevice.java 的新活动,它会查找附近的 BT 设备并将它们列在ListView

The first two are perfectly working since they're on MainActivity.java & that's where my button has been created.前两个是完美的,因为它们在 MainActivity.java 上,这就是我创建按钮的地方。

Problem comes when it creates the new activity & tries to do the 3rd one.当它创建新活动并尝试执行第三个活动时,问题就出现了。 The app crashes.应用程序崩溃。

This is what my MainActivity.java looks like这就是我的MainActivity.java 的样子

package vertex2016.mvjce.edu.bluealert;

import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import static java.lang.Thread.sleep;

public class MainActivity extends AppCompatActivity {

    public BluetoothAdapter BA = BluetoothAdapter.getDefaultAdapter();
    private int REQ_CODE = 1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void connect(View v)
    {
        if(BA == null)
            Toast.makeText(MainActivity.this, "System Doesn't Support Bluetooth", Toast.LENGTH_SHORT).show();

        else if(!BA.isEnabled())
        {
            Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBT, REQ_CODE);
        }
        else {
            Toast.makeText(MainActivity.this, "ALREADY ON!!", Toast.LENGTH_SHORT).show();
            searchBTDevices();
        }
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode!=RESULT_CANCELED) {
            Toast.makeText(MainActivity.this, "TURNED ON!", Toast.LENGTH_SHORT).show();
            searchBTDevices();
        }
        else
            Toast.makeText(MainActivity.this,"FAILED TO ENABLE BLUETOOTH", Toast.LENGTH_LONG).show();
    }




    public void searchBTDevices()
    {
        Thread searchThread = new Thread() {
            @Override
            public void run() {
                Intent searchBT = new Intent(getApplicationContext(), SearchBTDevice.class);
                startActivity(searchBT);
            }
        };
        searchThread.start();
    }
}

This is what my SearchBTDevice.java looks like这就是我的SearchBTDevice.java 的样子

package vertex2016.mvjce.edu.bluealert;

import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGattDescriptor;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.bluetooth.BluetoothAdapter;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.Set;

public class SearchBTDevice extends AppCompatActivity {

    public BluetoothAdapter BlueAdapter = BluetoothAdapter.getDefaultAdapter();
    public ArrayAdapter PairedArrayAdapter, BTArrayAdapter;
    public IntentFilter filter = new IntentFilter();
    public ListView devicesFound;
    public Set<BluetoothDevice> pairedDevices;


    private final BroadcastReceiver BTReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if(BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice btd = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                BTArrayAdapter.add(btd.getName() + "\t\t" + btd.getAddress() + "\n");
                PairedArrayAdapter.add(btd.getName() + "\t\t" + btd.getAddress() + "\n");
            }
        }
    };





    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_btdevice);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        if(!BTArrayAdapter.isEmpty())
            BTArrayAdapter.clear();

        searchBTDevices();

    }


    public void searchBTDevices()
    {
        pairedDevices = BlueAdapter.getBondedDevices();

        if(pairedDevices.size()>0)
            for(BluetoothDevice device: pairedDevices)
                PairedArrayAdapter.add(device.getName() + "\t\t" + device.getAddress() + "\n");


        filter.addAction(BluetoothDevice.ACTION_FOUND);
        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

        final BroadcastReceiver BTReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if(BluetoothDevice.ACTION_FOUND.equals(action)) {
                    BluetoothDevice btd = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    BTArrayAdapter.add(btd.getName() + "\t\t" + btd.getAddress() + "\n");
                    PairedArrayAdapter.add(btd.getName() + "\t\t" + btd.getAddress() + "\n");
                }
            }
        };

        BlueAdapter.startDiscovery();

        devicesFound = (ListView)findViewById(R.id.searchpagelistView);
        devicesFound.setAdapter(BTArrayAdapter);

    }


}

This is what the logcat shows when my app crashes这是我的应用程序崩溃时logcat显示的内容

03-17 11:51:40.120 19178-19178/vertex2016.mvjce.edu.bluealert E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: vertex2016.mvjce.edu.bluealert, PID: 19178
                                                                                java.lang.RuntimeException: Unable to start activity ComponentInfo{vertex2016.mvjce.edu.bluealert/vertex2016.mvjce.edu.bluealert.SearchBTDevice}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.widget.ArrayAdapter.isEmpty()' on a null object reference
                                                                                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2358)
                                                                                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2420)
                                                                                    at android.app.ActivityThread.access$900(ActivityThread.java:154)
                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                    at android.os.Looper.loop(Looper.java:135)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5292)
                                                                                    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:904)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
                                                                                 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.widget.ArrayAdapter.isEmpty()' on a null object reference
                                                                                    at vertex2016.mvjce.edu.bluealert.SearchBTDevice.onCreate(SearchBTDevice.java:57)
                                                                                    at android.app.Activity.performCreate(Activity.java:5990)
                                                                                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                                                                                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311)
                                                                                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2420) 
                                                                                    at android.app.ActivityThread.access$900(ActivityThread.java:154) 
                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                    at android.os.Looper.loop(Looper.java:135) 
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5292) 
                                                                                    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:904) 
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 

So these are my questions:所以这些是我的问题:

  • Where am I going wrong & what should I do?我哪里出错了,我该怎么办?
  • Is there any way I can retrieve the BluetoothAdapter , which was created in my MainActivity.java , in my new activity called SearchBTDevice.java ?有什么方法可以在我的名为SearchBTDevice.java新活动中检索在MainActivity.java中创建的BluetoothAdapter吗?
  • Is there anyway I can set the onClick operation of a button defined in one activity from another activity?无论如何,我可以设置一个活动中定义的按钮的 onClick 操作吗?

Thank you for your time!感谢您的时间!

Define your BTArrayAdapter object in SearchBTDevice class.在 SearchBTDevice 类中定义您的 BTArrayAdapter 对象。 It is null while you call BTArrayAdapter.isEmpty() in onCreate().在 onCreate() 中调用 BTArrayAdapter.isEmpty() 时它为 null。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM