首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Beacon示例应用程序

Android Beacon示例应用程序
EN

Stack Overflow用户
提问于 2014-06-20 20:20:47
回答 2查看 4.6K关注 0票数 0

我试着在信标上建立一个应用程序。因此,我从here.获得了一个示例代码

我已经运行了该代码,一旦我进入信标范围,应用程序就会崩溃,logcat中的错误如下:

代码语言:javascript
复制
06-20 17:48:24.256: E/AndroidRuntime(18104): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

请帮帮我。

我检查了代码,错误就在这些行之间。

代码语言:javascript
复制
iBeaconManager.setRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
            if (iBeacons.size() > 0) {
                double distance = iBeacons.iterator().next().getAccuracy();
                DecimalFormat decimalFormat = new DecimalFormat("##.##");
                double distanceFormatted = Double.valueOf(decimalFormat.format(distance));
                TextView distanceTextView = (TextView) findViewById(R.id.am_tv_distance);
                distanceTextView.setText(String.valueOf(distanceFormatted) + " m");
            }
        }
    });
EN

回答 2

Stack Overflow用户

发布于 2014-06-20 20:23:21

您需要在UI线程中执行UI更改:

代码语言:javascript
复制
    iBeaconManager.setRangeNotifier(new RangeNotifier() {
    @Override
    public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
        if (iBeacons.size() > 0) {
            double distance = iBeacons.iterator().next().getAccuracy();
            DecimalFormat decimalFormat = new DecimalFormat("##.##");
            double distanceFormatted = Double.valueOf(decimalFormat.format(distance));
            runOnUiThread(new Runnable() {

                  @Override
                  public void run() {
                        TextView distanceTextView = (TextView) findViewById(R.id.am_tv_distance);
                        distanceTextView.setText(String.valueOf(distanceFormatted) + " m");
                  }
            });
         }
    }
});
票数 1
EN

Stack Overflow用户

发布于 2014-06-20 20:42:32

对于CalledFromWrongThreadException

编写一个函数并像这样调用:

代码语言:javascript
复制
private void toastToDisplay(final String line) {
    runOnUiThread(new Runnable() {
        public void run() {
            //Toast.makeText(YourActivity.this, "" + line,
                    // Toast.LENGTH_LONG).show();
            TextView yourTextView = (TextView) findViewById(R.id.your_tv);
            yourTextView .setText(line);
        }
    });
}  

如果需要,您可以使用所需的distanceTextView或其他视图编辑该函数。发生的情况是,Service在应用程序的后台线程上运行,因此当您直接调用将更新UI的操作时,它会与您在编写代码时所在的线程冲突。

因此,如果当前线程不是UI线程,则使用runOnUiThread将操作发送到UI线程的事件队列

“我得到的只是距离而不是范围”到底是什么意思?...for iBeacons.iterator().next().getAccuracy();,part..您可以使用for each循环收集信标详细信息,如下所示:

代码语言:javascript
复制
for (IBeacon iBeacon : iBeacons) {
String line = "Major: " + iBeacon.getMajor()
                                    + "Minor: " + iBeacon.getMinor()
                                    + "Accuracy in m(s): "
                                    + iBeacon.getAccuracy()
                                    + "BluetoothAddress: "
                                    + iBeacon.getBluetoothAddress()
                                    + "Proximity: " + iBeacon.getProximity()
                                    + "ProximityUuid: "
                                    + iBeacon.getProximityUuid() + "Rssi: "
                                    + iBeacon.getRssi() + "TxPower: "
                                    + iBeacon.getTxPower(); 
toastToDisplay(line);
    }  

如果你还没有看过,this Android iBeacon Library sample application是一个很好的参考资料。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24327156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档