我目前正在尝试进一步了解在 Android studio 中使用蓝牙的知识,但由于某种原因,我似乎无法让我正在开发的应用程序确认或请求蓝牙权限。我忍不住想我错过了一些东西,但从我在其他论坛上看到的情况来看,蓝牙可以开箱即用。
我希望发生的是当应用程序打开时将找到的蓝牙设备添加到屏幕底部的列表框中
应用程序编译正常,给我一条消息,告诉我蓝牙已打开或关闭,但在访问蓝牙功能时却崩溃了。为了简洁起见,我省略了此代码示例中的权限。 我已将问题细化为
val pairedDevices = bluetoothAdapter!!.bondedDevices
但是无法理解我做错了什么,有人可以帮忙吗? 这是我的清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.adamvi">
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-feature android:name="android.hardware.bluetooth" android:required="true"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AdamVI"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
这是我的主要活动
import android.annotation.SuppressLint
import android.app.Activity
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothManager
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.ListView
import android.widget.Toast
import java.util.Arrays
class MainActivity : Activity() {
@SuppressLint("MissingPermission")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val bluetoothManager: BluetoothManager = getSystemService(BluetoothManager::class.java)
val bluetoothAdapter: BluetoothAdapter? = bluetoothManager.adapter
if (bluetoothAdapter != null) {
if (bluetoothAdapter != null && bluetoothAdapter.isEnabled) {
Toast.makeText(
applicationContext,
"Bluetooth is switched on",
Toast.LENGTH_LONG
).show()
val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
val listView = ArrayList<String>()
val pairedDevices = bluetoothAdapter!!.bondedDevices
pairedDevices.forEach { device ->
listView.add(device.name.toString())
}
}
} else {
Toast.makeText(
applicationContext,
"Bluetooth is switched off",
Toast.LENGTH_LONG
).show()
}
}
}
某些蓝牙权限称为“运行时权限”。您需要在运行时请求访问权限并在清单中声明用法。根据针对 Android 12 及更高版本的Android 开发人员指南:
BLUETOOTH_ADVERTISE、BLUETOOTH_CONNECT 和 BLUETOOTH_SCAN 权限是运行时权限。因此,您必须在应用程序中明确请求用户批准,然后才能查找蓝牙设备、使其他设备可发现设备或与已配对的蓝牙设备通信。以及针对 Android 11 及更低版本:
由于位置权限是运行时权限,因此您必须在运行时请求这些权限并在清单中声明它们。