Android Beacon - bind / unbind问题(这个)

时间:2017-05-24 09:29:19

标签: java android ibeacon ibeacon-android beacon

我正在尝试创建自己的“BeaconManager”来更轻松地开发不同的动作。

所以我创建了一个新类,我实现了“BeaconConsumer”及其功能:

public class MybeaconManager implements BeaconConsumer{

private BeaconManager beaconManager;
private final String TAG = "MybeaconManager";
private boolean mEnterArea = false;
private boolean mAlreadyArea = false;

 public MybeaconManager(Context ctx){
     beaconManager = BeaconManager.getInstanceForApplication(ctx);
     beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
     beaconManager.bind(this);

 }

 public void bindBeacon(BeaconConsumer consumer){

    beaconManager.bind(consumer);

}

 public void unBindBeacon(BeaconConsumer consumer){

     beaconManager.unbind(consumer);

 }

public boolean isEnterInArea() {
    return mEnterArea;
}


public boolean isAlreadyInArea() {
    return mAlreadyArea;
}


public void sendNotification(String Notif) {

}


@Override
public void onBeaconServiceConnect() {


    beaconManager.addMonitorNotifier(new MonitorNotifier() {
        @Override
        public void didEnterRegion(Region region) {
            mEnterArea = true;
        }

        @Override
        public void didExitRegion(Region region) {
            mEnterArea = false;
        }

        @Override
        public void didDetermineStateForRegion(int i, Region region) {

        }
    });


}

接下来,我有了我的MainActivity:

public class MainActivity extends Activity {

MybeaconManager mybeaconManager;
BeaconManager beaconManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mybeaconManager = new MybeaconManager(this);

    if (mybeaconManager.isEnterInArea()){
        Log.i("BeaconTest", "I'm detecting a Beacon");
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mybeaconManager.unBindBeacon((BeaconConsumer) this);
}

@Override
protected void onStart() {
    super.onStart();
}

@Override
protected void onStop() {
    super.onStop();
}


}

正如您所看到的,我正在尝试更加轻松地使用函数didEnterRegion / didExitRegion,我只需要在MainActivity代码中在线使用。

问题是,bind / unbind(this)编译得不好而且我认为这是因为我没有在MainActivity上实现“BeaconConsumer”,因为他无法让消费者获得正确的权利。

它告诉我:“引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法'java.lang.String android.content.Context.getPackageName()'并返回绑定事情。

那么你对我如何以一种保持我的beaconManager的方式处理这个问题有任何想法吗?

提前谢谢你。 PS:对不起,如果我的英语不完美

1 个答案:

答案 0 :(得分:2)

BeaconConsumer接口旨在由Activity或Service类实现。如果要在问题中显示的POJO中实现此接口,则需要链接下面显示的方法定义。

@Override
public Context getApplicationContext() {
    return getActivity().getApplicationContext();
}

@Override
public void unbindService(ServiceConnection serviceConnection) {
    getActivity().unbindService(serviceConnection);
}

@Override
public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) {
    return getActivity().bindService(intent, serviceConnection, i);
}

我怀疑你的代码已经有了这些方法的空实现,否则你的代码就无法编译。确保您已提供如上所示的完整实现。