You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Ionic+Capacitor的Android Beacon解析重写方式是否正确?

解决Ionic+Capacitor切换iBeacon解析时的应用崩溃问题

问题根源分析

  1. 错误的Activity实例化方式:你手动创建了Parsing Activity的实例并调用onCreate,但Android系统才是Activity生命周期的管理者,手动实例化会导致上下文未正确绑定到应用实例,触发Your activity is not yet attached to the Application instance崩溃。
  2. BeaconConsumer接口未完整实现:直接在MainActivity中实现BeaconConsumer时,未覆盖该接口的所有抽象方法,导致编译报错。

解决方案:整合逻辑到MainActivity并规范实现

删除多余的Parsing类,直接在MainActivity中完成iBeacon解析配置,同时完整实现BeaconConsumer接口的所有方法:

修正后的MainActivity.java代码

import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import com.getcapacitor.BridgeActivity;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.BeaconParser;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.Region;
import org.altbeacon.beacon.Identifier;

public class MainActivity extends BridgeActivity implements BeaconConsumer {
    protected static final String TAG = "BeaconDetection";
    private BeaconManager beaconManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 无需调用setContentView,Capacitor的BridgeActivity已处理Web视图布局

        // 初始化BeaconManager并配置iBeacon解析规则
        beaconManager = BeaconManager.getInstanceForApplication(this);
        beaconManager.getBeaconParsers().add(new BeaconParser()
                .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
        beaconManager.bind(this);
    }

    @Override
    public void onBeaconServiceConnect() {
        // 替换为你的iBeacon实际参数
        Identifier targetUuid = Identifier.parse("你的UUID");
        Identifier targetMajor = Identifier.fromInt(你的Major数值);
        Identifier targetMinor = Identifier.fromInt(你的Minor数值);
        Region monitorRegion = new Region("beaconTest", targetUuid, targetMajor, targetMinor);

        try {
            beaconManager.startMonitoringBeaconsInRegion(monitorRegion);
            Log.d(TAG, "已启动iBeacon区域监控");
        } catch (RemoteException e) {
            Log.e(TAG, "启动监控失败", e);
        }
    }

    // 必须实现BeaconConsumer的所有抽象方法,避免编译错误
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (beaconManager != null) {
            beaconManager.unbind(this);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (beaconManager != null) {
            try {
                beaconManager.stopMonitoringBeaconsInRegion(new Region("beaconTest", null, null, null));
            } catch (RemoteException e) {
                Log.e(TAG, "停止监控失败", e);
            }
        }
    }
}

关键注意事项

  • 禁止手动实例化Activity:所有Activity的创建和生命周期回调都由Android系统处理,手动调用new Parsing()会破坏上下文绑定逻辑。
  • 不要重复设置布局:Capacitor的BridgeActivity已负责加载Ionic的Web视图,调用setContentView会覆盖原有布局,导致应用显示异常。
  • 权限校验:确保AndroidManifest.xml中已添加蓝牙和位置权限(适配Android不同版本):
    <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:17:49