简体   繁体   English

Android:蓝牙应用在启动时崩溃

[英]Android: Bluetooth App crashes on startup

I'm new to Android app development. 我是Android应用程序开发的新手。 I'm trying to program an app that can discover bluetooth devices and shows them in a list. 我正在尝试编写一个可以发现蓝牙设备并将其显示在列表中的应用程序。 I'm using a BroadcastReceiver to add the discovered devices to the list, but since I added the BroadcastReceiver the app keeps crashing on startup. 我正在使用BroadcastReceiver将发现的设备添加到列表中,但是由于我添加了BroadcastReceiver因此应用程序在启动时一直崩溃。

I tested the app on a Oneplus 3 (Android 7.1.1) and a Huawei P8 Lite (Android 6). 我在Oneplus 3(Android 7.1.1)和Huawei P8 Lite(Android 6)上测试了该应用程序。

My code: MainActivity.java 我的代码:MainActivity.java

package com.example.jeroen.testbluetooth;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.Set;

public class MainActivity extends AppCompatActivity {

    private final static int REQUEST_ENABLE_BT = 1; // static variable for intent to start BT, must be locally declared
    private final ArrayAdapter<String> btArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
    private ListView listView = (ListView) findViewById(R.id.ListView); // findViewById(int id), id must match with id of view in layout file

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    // callback function must have view parameter
    public void BtnConnectToDevice(View view) {

        // check if BT is supported
        BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // get bluetooth adapter of this device
        if (mBluetoothAdapter == null) {
            // Device does not support Bluetooth
            // app shuts down
            // TODO show message for user
            finishAndRemoveTask();
        }

        // check if BT is enabled, if not turn on
        // startActivityForResult returns result of request (successful or cancelled)
        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); // create Intent to enable bluetooth
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); // TODO no result in the moment
        }

        // get all paired devices as set (set = unsorted array/list)
        Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();

        // add names and addresses of paired devices to array
        if (pairedDevices.size() > 0) {
            // There are paired devices. Get the name and address of each paired device.
            // for loop every element of pairedDevices is passed and temporary copied into "device"
            for (BluetoothDevice device : pairedDevices) {
                String deviceName = device.getName();
                String deviceHardwareAddress = device.getAddress(); // MAC address

                // add items to adapter
                btArrayAdapter.add(deviceName + "\n"
                        + deviceHardwareAddress);
            }
        }

        // if scanning already running, stop
        if (mBluetoothAdapter.isDiscovering()) {
            mBluetoothAdapter.cancelDiscovery();
        }

        // search for devices
        mBluetoothAdapter.startDiscovery();

        // Register the broadcast receiver
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);

        // TODO do something with the list

        // show array in listView
        // connect btArrayAdapter to ListView
        // ListView listView = (ListView) findViewById(R.id.ListView); // findViewById(int id), id must match with id of view in layout file
//        listView.setAdapter(btArrayAdapter);

    }


    @Override
    protected void onDestroy() {
        // Don't forget to unregister the ACTION_FOUND receiver.
        unregisterReceiver(mReceiver);

        // super.onDestroy();
    }



    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // A Bluetooth device was found
                // Getting device information from the intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                // add newly discovered devices to list
                String deviceName = device.getName();
                String deviceHardwareAddress = device.getAddress(); // MAC address

                // add items to adapter
                btArrayAdapter.add(deviceName + "\n"
                        + deviceHardwareAddress);
            }
        }
    };

}

activity_main.xml: activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.jeroen.testbluetooth.MainActivity">

        <Button
            android:id="@+id/BtnConnectToDevice"
            android:layout_width="144dp"
            android:layout_height="48dp"
            android:layout_marginLeft="120dp"
            android:layout_marginStart="120dp"
            android:layout_marginTop="16dp"
            android:elevation="0dp"
            android:onClick="BtnConnectToDevice"
            android:text="Connect"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ListView
            android:id="@+id/ListView"
            android:layout_width="368dp"
            android:layout_height="437dp"
            android:layout_marginBottom="10dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent" />

</android.support.constraint.ConstraintLayout>

AndroidManifest.xml: AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.jeroen.testbluetooth">

    // permissions
    <uses-permission android:name="android.permission.BLUETOOTH" /> // Allows applications to connect to paired bluetooth devices
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> // Allows applications to discover and pair bluetooth devices
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

When I delete the BroadcastReceiver the app starts just fine, but without it I cannot scan for devices. 当我删除BroadcastReceiver ,应用程序启动正常,但是如果没有它,我将无法扫描设备。

I would appreciate if someone could help me. 如果有人可以帮助我,我将不胜感激。 If you need additional information don't hesitate to ask. 如果您需要其他信息,请随时询问。

Best regard, 最良好的问候,

Jeroen 耶罗恩

Here is my working code to scan for devices 这是我的工作代码以扫描设备

 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  mBluetoothAdapter.startDiscovery();
  mReceiver = new BroadcastReceiver() {
   public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    //Finding devices
    if (BluetoothDevice.ACTION_FOUND.equals(action))
    {
     // Get the BluetoothDevice object from the Intent
     BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);


//Here you get scan device info
String DeviveName=device.getName();


    }
    else {

     if (mainActivity!=null)mainActivity.status.setText("Status:No device found");
    }
   }
  };

  IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
  registerReceiver(mReceiver, filter);

MainActivity.java MainActivity.java

public class MainActivity extends AppCompatActivity {
       private final static int REQUEST_ENABLE_BT = 1; // static variable for intent to start BT, must be locally declared
       private ArrayAdapter<String> btArrayAdapter ;
       private ListView listView ; // findViewById(int id), id must match with id of view in layout file

       @Override
       protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activimain);
            if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
            ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, 1);

            listView = (ListView) findViewById(R.id.ListView);
            btArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);

      }


// callback function must have view parameter
       public void BtnConnectToDevice(View view) {

    // check if BT is supported
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // get bluetooth adapter of this device
    if (mBluetoothAdapter == null) {
        // Device does not support Bluetooth
        // app shuts down
        // TODO show message for user
        finishAndRemoveTask();
    }

    // check if BT is enabled, if not turn on
    // startActivityForResult returns result of request (successful or cancelled)
    if (!mBluetoothAdapter.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); // create Intent to enable bluetooth
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); // TODO no result in the moment
    }

    // get all paired devices as set (set = unsorted array/list)
    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();

    // add names and addresses of paired devices to array
    if (pairedDevices.size() > 0) {
        // There are paired devices. Get the name and address of each paired device.
        // for loop every element of pairedDevices is passed and temporary copied into "device"
        for (BluetoothDevice device : pairedDevices) {
            String deviceName = device.getName();
            String deviceHardwareAddress = device.getAddress(); // MAC address

            // add items to adapter
            btArrayAdapter.add(deviceName + "\n"
                    + deviceHardwareAddress);
        }
    }

    // if scanning already running, stop
    if (mBluetoothAdapter.isDiscovering()) {
        mBluetoothAdapter.cancelDiscovery();
    }

    // search for devices
    mBluetoothAdapter.startDiscovery();

    // Register the broadcast receiver
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    registerReceiver(mReceiver, filter);

    // TODO do something with the list

    // show array in listView
    // connect btArrayAdapter to ListView
    //ListView listView = (ListView) findViewById(R.id.ListView); // findViewById(int id), id must match with id of view in layout file
    listView.setAdapter(btArrayAdapter);

}

@Override
protected void onResume() {
    registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));
    super.onResume();
}

@Override
protected void onDestroy() {
    // Don't forget to unregister the ACTION_FOUND receiver.
    unregisterReceiver(mReceiver);

     super.onDestroy();
}



public BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // A Bluetooth device was found
            // Getting device information from the intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

            // add newly discovered devices to list
            String deviceName = device.getName();
            String deviceHardwareAddress = device.getAddress(); // MAC address

            // add items to adapter
            btArrayAdapter.add(deviceName + "\n"
                    + deviceHardwareAddress);
        }
    }
};

}

manifest.xml manifest.xml

     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

      <permission android:name="android.permission.BLUETOOTH" android:label="BLUETOOTH" />
      <permission android:name="android.permission.BLUETOOTH_ADMIN" />
      <permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

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

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