在Cordova插件中使用iBeacons,即在活动/服务之外

时间:2014-01-23 02:17:18

标签: ibeacon-android

我正在尝试编写一个与Android的Radius Networks iBeacon库交互的Cordova插件。现在,我知道这个库是为了与Activity / Service一起使用而设计的,但是在我的情况下它不会起作用,所以我试图尽可能地使用文档来调整它。目前,我只是试图让它倾倒掉它能看到的iBeacons数量。

这是我的插件代码,为简洁起见,我省略了包/导入:

public class IBeaconPlugin extends CordovaPlugin implements IBeaconConsumer {

    public static final String TAG = IBeaconPlugin.class.getName();

    public static final String ACTION_FIND = "findBeacons";

    private int count = -1;

    public Context context;

    private IBeaconManager iBeaconManager;

    /**
     * Constructor.
     */
    public IBeaconPlugin() {
    }

    /**
     * Sets the context of the Command. This can then be used to do things like
     * get file paths associated with the Activity.
     *
     * @param cordova The context of the main Activity.
     * @param webView The CordovaWebView Cordova is running in.
     */
    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        super.initialize(cordova, webView);

        context = cordova.getActivity().getApplicationContext();

        iBeaconManager = IBeaconManager.getInstanceForApplication(context);
        Log.d(TAG, iBeaconManager.toString());

        iBeaconManager.bind(this);
    }

    @Override
    public Context getApplicationContext() {
        return context;
    }

    @Override
    public boolean bindService(Intent arg0, ServiceConnection arg1, int arg2) {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public void unbindService(ServiceConnection arg0) {
        // TODO Auto-generated method stub

    }

    /**
     * Executes the request and returns PluginResult.
     *
     * @param action            The action to execute.
     * @param args              JSONArry of arguments for the plugin.
     * @param callbackContext   The callback id used when calling back into JavaScript.
     * @return                  True if the action was valid, false if not.
     */
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if (action.equals(ACTION_FIND)) {
            JSONObject r = new JSONObject();
            r.put("thebeacons", this.count);
            callbackContext.success(r);
        }
        else {
            return false;
        }
        return true;
    }

    @Override
    public void onIBeaconServiceConnect() {
        Log.d(TAG, "onIBeaconServiceConnect called");

        iBeaconManager.setRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
            IBeaconPlugin.this.count = iBeacons.size();
        }
        });

        try {
            iBeaconManager.startRangingBeaconsInRegion(new Region("allTheBeacons", null, null, null));
        } catch (RemoteException e) {   }
    }
}

正如您所看到的,我尝试输入一些日志记录,因此我对流程有所了解。从这里,我可以确定永远不会调用“onIBeaconServiceConnect”。查看日志,我有以下行,我认为是罪魁祸首:

  

D / IBeaconManager:此消费者未受约束。 binding:com.thenathanjones.cordova.ibeacon.IBeaconPlugin@52962c9c

不幸的是,这就是我得到的所有信息。

有没有人对API有任何经验可以帮助我确定原因?

干杯, 森

1 个答案:

答案 0 :(得分:7)

您的空bindServiceunbindService方法会导致您遇到问题。如果您的课程是活动,服务或应用程序,这些都将为您实施。如果要创建自定义类,则必须提供实现。

如果没有bindService方法的实现,iBeaconManager.bind(this);行最终无法完成任何操作,因为它必须调用其中一种方法。 (将日志行添加到这些空方法中,您将看到。)因此,IBeaconService永远不会启动,onIBeaconServiceConnect永远不会被调用。

足够无聊的解释 - 是解决问题的时候了!最简单的方法是链接这些方法。尝试类似:

@Override
public boolean bindService(Intent intent, ServiceConnection conn, int mode) {
    return context.bindService(intent, conn, mode);
}

@Override
public void unbindService(ServiceConnection conn) {
    context.unbindService(conn);
}