2017-05-24 24 views
-1

我试图创建自己的“BeaconManager”来更轻松地开发不同的操作。Android Beacon - 绑定/解除绑定问题(this)

所以我创建了一个新的类,我已经实现“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:对不起,如果我的英文不完美

回答

0

BeaconConsumer接口被设计为由活动或服务类实现。如果您想在问题中显示的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); 
} 

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