Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android beaconManager.StarTrangBeaconRegion使用Robolectric失败,出现NullPointerException_Android_Robolectric_Ibeacon Android_Altbeacon_Android Ibeacon - Fatal编程技术网

Android beaconManager.StarTrangBeaconRegion使用Robolectric失败,出现NullPointerException

Android beaconManager.StarTrangBeaconRegion使用Robolectric失败,出现NullPointerException,android,robolectric,ibeacon-android,altbeacon,android-ibeacon,Android,Robolectric,Ibeacon Android,Altbeacon,Android Ibeacon,我正在使用Robolectric测试我的Android应用程序。该应用程序使用AndroidBeaconLibrary。 当我使用 Activity-Activity=roblectric.setupActivity(MainActivity.class) 作为一个简单的测试,我在onbeacerviceconnect()方法中得到一个错误: @Override public void onBeaconServiceConnect() { beaconManager.se

我正在使用Robolectric测试我的Android应用程序。该应用程序使用AndroidBeaconLibrary。 当我使用
Activity-Activity=roblectric.setupActivity(MainActivity.class)
作为一个简单的测试,我在
onbeacerviceconnect()
方法中得到一个错误:

@Override
    public void onBeaconServiceConnect() {
        beaconManager.setRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                if (beacons.size() > 0) {
                    final double distance = beacons.iterator().next().getDistance();
                    Log.i("X", "The beacon is about " + distance + " meters away.");
                    if (distance > 1.8 && !mAlertShown) {
                        mAlertShown = true;


     alertOpen();
                } else if (distance < 1) {
                    mAlertShown = false;
                    Toast.makeText(MainActivity.this, "alert is now reset", Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
    try {
        Identifier i = Identifier.parse("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
        Identifier i2 = Identifier.parse("xxxx");
        beaconManager.startRangingBeaconsInRegion(new Region("rangingUniqueId", i, i2, null));
    } catch (RemoteException e) {
    }
}
@覆盖
beacerviceconnect()上的公共无效{
setRangeNotifier(新的RangeNotifier(){
@凌驾
公共无效范围信标区域(收集信标,区域){
如果(beacons.size()>0){
final double distance=beacons.iterator().next().getDistance();
Log.i(“X”,“信标大约在“+距离+”米远。”);
如果(距离>1.8&&!如图所示){
MalertShowed=true;
alertOpen();
}否则如果(距离<1){
MalertShowed=false;
Toast.makeText(MainActivity.this,“警报现在重置”,Toast.LENGTH_SHORT.show();
}
}
}
});
试一试{
标识符i=标识符。解析(“xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”);
标识符i2=标识符解析(“xxxx”);
beaconManager.startrangbeaconregion(新区域(“ranginginuniqueid”,i,i2,null));
}捕获(远程异常){
}
}
调用
beaconManager.starTrangbeaconRegion(新区域(“rangingUniqueId”,i,i2,null))后该方法失败
at
this.serviceMessenger.send(msg)BeaconManager.class
中的code>。使用
NullPointerException


当我在手机上部署应用程序时,一切正常。

我无法发表评论,所以我将把它写在这里作为答案,但这听起来像这样。serviceMessenger.send(msg);msg的值为NULL,这就是为什么会出现异常

public void startRangingBeaconsInRegion(Region region) throws RemoteException {
    Message msg = Message.obtain(null, IBeaconService.MSG_START_RANGING, 0, 0);
    StartRMData obj = new StartRMData(new RegionData(region), rangingCallbackAction());
    msg.obj = obj;
    msg.replyTo = rangingCallback;
    if(msg != null){
    serviceMessenger.send(msg);
    }
}

是的。但是,我不知道为什么msg是空的。它在BeaconManager.class中,在真实设备上运行该应用程序时,一切正常。为什么我用Robolectric.setupActivity()来测试它时它会是空的?你可以编辑IBeaconManager.class,如果它是空的,就不做那部分工作。我会用代码编辑我的答案我不确定结果会是什么;)类来自AltBeacon Android Beacon库依赖项。因此,我无法修改.class文件。您可以从下载源代码,然后对其进行编辑。然后将其添加为i库,但我不确定这是否值得,因为它在真实设备上工作,您必须自己决定。您的测试是否手动调用BeaConserviceConnect
?还是该方法会自动调用?查看您的Robolectric测试方法会很有帮助。我的测试类中唯一的一行是Activity=Robolectric.setupActivity(MainActivity.class);。在此设置活动过程中调用onBeaconServiceConnect方法。
onBeaconServiceConnect
调用是在MainActivity.java内还是在
setupActivity
方法内?要知道Robolectric并没有提供Android SDK的有效实现,只是提供了存根。方法调用通常返回null,就像您描述的情况一样。因此,如果您在
setupActivity
中调用了
onbeacerviceconnect
,它可能不应该在那里。onbeacerviceconnect
方法在我的
MainActivity.class
中,它实现了
BeaconConsumer
接口。我只是按照一个简单的机器人分子示例来设置/构建一个活动。我还尝试将
setupActivity(MainActivity.class)
替换为
buildActivity(MainActivity.class).create().get()
,这导致了相同的异常。同时,我的其他测试(web服务、数据库等)都已启动并运行。我只是想了解NullPointerException是从哪里来的。也许是因为像你说的,Robolectric只处理存根。