[英]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.