用于信标的 Roximity SDK 崩溃
Posted
技术标签:
【中文标题】用于信标的 Roximity SDK 崩溃【英文标题】:Roximity SDK for beacons is crashing 【发布时间】:2016-07-12 01:14:56 【问题描述】:我的 Roximity SDK 不断崩溃,
这是我的 Gradle:
dependencies
compile fileTree(include: ['*.jar'], dir: 'libs')
compile project(':cropper')
compile project(':main')
compile project(':ROXIMITY_SDK_1_3_73')
compile 'com.mcxiaoke.volley:library:1.0.19'
compile 'com.google.code.gson:gson:2.2.4'
compile 'org.slf4j:slf4j-api:1.7.10'
compile 'com.google.android.gms:play-services-base:8.4.0'
compile 'com.google.android.gms:play-services-location:8.4.0'
compile 'com.google.android.gms:play-services-ads:8.4.0'
compile 'com.google.android.gms:play-services-identity:8.4.0'
compile 'com.google.android.gms:play-services-gcm:8.4.0'
compile 'org.apache.httpcomponents:httpmime:4.5.2'
compile 'com.loopj.android:android-async-http:1.4.9'
compile 'com.android.support:appcompat-v7:23.1.1'
我的清单:
我正在根据文档页面上提到的说明使用代码 http://docs.roximity.com/mobile/android/integration, 在 onCreate 中:
ROXIMITYEngine.startEngineWithOptions(this.getApplicationContext(), R.drawable.ic_launcher, null, this, null);
createBroadcastRecievers();
定义:
private void createBroadcastRecievers()
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ROXConsts.MESSAGE_FIRED);
intentFilter.addAction(ROXConsts.BEACON_RANGE_UPDATE);
intentFilter.addAction(ROXConsts.WEBHOOK_POSTED);
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter);
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
if(intent.getAction().equals(ROXConsts.MESSAGE_FIRED))
MessageParcel messageParcel = (MessageParcel)intent.getParcelableExtra(ROXConsts.EXTRA_MESSAGE_PARCEL);
handleMessageFired(messageParcel);
else if (intent.getAction().equals(ROXConsts.BEACON_RANGE_UPDATE))
String rangeJson = intent.getStringExtra(ROXConsts.EXTRA_RANGE_DATA);
handleBeaconRangeUpdate(rangeJson);
;
现在它的行为完全奇怪。有时它根本没有检测到信标并发送空包作为响应。 有时会在几分钟内检测到信标,并且在一两次更新后大多会崩溃。 这是崩溃报告: 致命例外:主要 进程:
java.lang.NullPointerException:尝试从字段“java.lang.String android.location.Location.mProvider”读取空值 对象引用 在 android.location.Location.set(Location.java:131) 在 android.location.Location.(Location.java:124) 在 com.roximity.sdk.location.RoxLocation.(RoxLocation.java:30) 在 com.roximity.sdk.actions.b.b(ActionManager.java:265) 在 com.roximity.sdk.actions.b.c(ActionManager.java:213) 在 com.roximity.sdk.beacons.c.c(RangingManager.java:169) 在 com.roximity.sdk.beacons.c.b(RangingManager.java:107) 在 com.roximity.sdk.beacons.c.a(RangingManager.java:84) 在 com.roximity.system.ble.d.j(BluetoothScanController.java:286) 在 com.roximity.system.ble.f.run(BluetoothScanController.java:257) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:145) 在 android.app.ActivityThread.main(ActivityThread.java:5835) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
我已经尝试了几乎所有可能的解决方案,这不是应用程序端的问题,也没有通过更改他们推荐的代码来解决。 任何解决方案都将受到高度赞赏。
【问题讨论】:
【参考方案1】:希望能有所帮助的几件事:
我看到的最令人担忧的是第二个参数com.roximity.roximitysdkstarterkit.R.raw.roxstore
,在您的 ROXIMITYEngine.startEngineWithOptions()
调用中。文档将该参数描述为“将为通知显示的可绘制 id,例如 R.drawable.ic_launcher。”将此参数替换为应用程序资源目录中可绘制对象的 id。
从您的 Gradel 依赖项看来,您可能正在使用不受支持的 SDK 版本,1.3.71。与 Google Play Services 8.4.0 一起运行的最早受支持的 SDK 版本是 1.3.73。确保您使用的是受支持的 .aar 并将其正确链接到您的项目。
Android Compatibility v7,用于支持旧版本的 Android,您的 Gradel 依赖项似乎也缺少依赖项。请务必将 compile 'appcompat-v7:23.1.1'
添加到您的依赖项列表中。
它还显示在您的依赖项中,您正在编译整个 Google Play 服务库,并且还包括各个模块的行,虽然这在技术上没有错误 - 您应该考虑只导入所需的 Google Play 服务模块你编码。对于 ROXIMITY v1.3.73 SDK,唯一需要的模块是;基础、gcm 和位置。
编辑
查看您的崩溃堆栈跟踪,当尝试从 Location 对象中检索 mProvider 字段时,显示的错误是空引用。似乎此崩溃是代码期望 Location 对象的结果,可能来自 FusedLocationApi,但接收到 null。也许对 FusedLocationApi 如何以及为何返回 null 对象进行一些研究将是您继续努力的好地方。
以下是一些帮助您入门的链接:
Why is FusedLocationApi.getLastLocation null
FusedLocationApi.getLastLocation always null
【讨论】:
感谢您的详细回复,我已经尝试了您提到的所有解决方案,但仍然没有运气并遇到同样的崩溃。根据支持团队的说法,除非他们更新他们的 sdk,否则这个崩溃没有解决方案,但即使在更新他们的 sdk 之后它仍然是一样的,而且他们的响应能力很差。以上是关于用于信标的 Roximity SDK 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
[LocationManager didEnterRegion] 可以获取 Beacon 的 Major & Minor 吗?