You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Unity安卓插件蓝牙通信开发:如何开启蓝牙?

Unity Android蓝牙插件:完整开启蓝牙实现方案

嘿,看你已经在写Unity的Android蓝牙插件了,不过你的代码好像没写完,我来帮你补全并梳理清楚整个开启蓝牙的流程,毕竟这是蓝牙通信的第一步嘛!

1. 补全并完善Java插件代码

首先,Android不允许直接静默开启蓝牙,必须让用户确认授权,而且插件需要借助Unity的Activity上下文来发起系统请求。完整的PluginClass代码如下:

package com.example.unityplugin;

import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import com.unity3d.player.UnityPlayer;

public class PluginClass {
    public static String testMessage(){
        return "I AM WORKING";
    }

    // 用于标记蓝牙开启请求的请求码
    private static final int REQUEST_ENABLE_BT = 1;

    public static void TurnOnBluetooth(){
        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter != null) {
            if (!bluetoothAdapter.isEnabled()) {
                // 构建开启蓝牙的系统Intent,引导用户授权
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                // 使用Unity当前的Activity启动请求
                UnityPlayer.currentActivity.startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            } else {
                // 蓝牙已开启,回调通知Unity
                UnityPlayer.UnitySendMessage("BluetoothManager", "OnBluetoothStateChanged", "ENABLED");
            }
        } else {
            // 设备不支持蓝牙,回调通知Unity
            UnityPlayer.UnitySendMessage("BluetoothManager", "OnBluetoothStateChanged", "UNSUPPORTED");
        }
    }
}

这里几个核心点:

  • UnityPlayer.currentActivity获取Unity的Activity上下文,这是Android插件和Unity交互的关键
  • 通过startActivityForResult发起用户授权请求,确保合规性
  • 借助UnitySendMessage将蓝牙状态反馈给Unity中的指定GameObject

2. 配置AndroidManifest权限

蓝牙功能需要在清单文件中声明权限,不同Android版本要求略有差异,把这些权限加到你的AndroidManifest.xml里:

<!-- 基础蓝牙操作权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

<!-- Android 12及以上新增的蓝牙连接权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

<!-- 若后续要扫描蓝牙设备,需添加位置权限(Android 10+) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- 声明应用依赖蓝牙硬件(设为false兼容无蓝牙设备) -->
<uses-feature android:name="android.hardware.bluetooth" android:required="false" />

3. Unity端调用与回调处理

在Unity中创建BluetoothManager.cs脚本,挂在名为BluetoothManager的GameObject上,用来调用插件并接收状态回调:

using UnityEngine;

public class BluetoothManager : MonoBehaviour
{
    void Start()
    {
        // 先测试插件是否正常加载
        AndroidJavaClass pluginClass = new AndroidJavaClass("com.example.unityplugin.PluginClass");
        string testMsg = pluginClass.CallStatic<string>("testMessage");
        Debug.Log("插件测试反馈:" + testMsg);
    }

    // 给UI按钮绑定的调用方法
    public void RequestTurnOnBluetooth()
    {
        AndroidJavaClass pluginClass = new AndroidJavaClass("com.example.unityplugin.PluginClass");
        pluginClass.CallStatic("TurnOnBluetooth");
    }

    // 接收Java插件的状态回调
    public void OnBluetoothStateChanged(string state)
    {
        switch(state)
        {
            case "ENABLED":
                Debug.Log("蓝牙已成功开启!");
                // 这里可以继续后续的蓝牙扫描、连接逻辑
                break;
            case "UNSUPPORTED":
                Debug.LogError("当前设备不支持蓝牙功能");
                break;
            // 还可以扩展处理用户拒绝开启的状态
        }
    }
}

4. 关键注意事项

  • Android版本适配:如果你的targetSdkVersion >=31,需要动态申请BLUETOOTH_CONNECT权限,不能仅靠清单声明
  • 回调扩展:若要处理用户拒绝开启蓝牙的情况,需在Java层重写UnityActivity的onActivityResult方法,把结果回调给Unity
  • 设备兼容性:始终先判断BluetoothAdapter是否为null,避免在无蓝牙设备上崩溃

内容的提问来源于stack exchange,提问作者user3102664

火山引擎 最新活动