【问题标题】:Android map - drawing custom markers on permission changes issue (Android 6.0)Android 地图 - 在权限更改问题上绘制自定义标记(Android 6.0)
【发布时间】:2015-12-11 10:18:55
【问题描述】:

我在我的应用程序中使用 Google Map v2,但遇到了非常奇怪的问题。

在地图上,我正在绘制自定义标记 - 不同颜色的圆形对象,数字表示某种信息。

问题是,对于 Android 6.0,在取消位置权限并返回应用程序后,我的地图标记是使用默认图标绘制的。在我重新启动应用程序之前,重新授予权限不会改变问题。

有趣的是,如果在启动应用程序时禁用了位置权限,则绘制我的自定义标记可以正常工作。只有当应用程序正在运行,然后我切换位置权限(关闭或打开)时,我的标记才会更改为默认值。

有人知道如何解决这个问题吗?我想在设置中切换位置权限(这与在地图上绘制标记无关)并且仍然绘制我的自定义标记而不是默认标记。

编辑: 只是为了澄清 - 当我回到应用程序时,我正在重绘标记。问题是它们不再使用我的自定义图标,而是使用默认的谷歌标记图标。代码:

public void addBay(final String mapMarkerId, final Position position, String status) {
    if(mapService.getMap() != null) {
        final BitmapDescriptor icon = getIconForStatus(status);

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Marker newMarker = addMarkerToGoogleMap(position, icon);
                markers.put(mapMarkerId, newMarker);
            }
        });
    }
}

private Marker addMarkerToGoogleMap(Position position, BitmapDescriptor icon) {
    return mapService.getMap().addMarker(new MarkerOptions()
            .position(new LatLng(position.latitude, position.longitude))
            .anchor(0.5f, 0.5f)
            .icon(icon));
}

public BitmapDescriptor getIconForStatus(String status) {

    switch (status) {
        case BayDto.STATUS_FREE:
            return bayStatusFreeIcon;
        case BayDto.STATUS_OCCUPIED:
            return bayStatusOccupiedIcon;
        case BayDto.STATUS_UNKNOWN:
            return bayStatusUnknownIcon;
        default:
            return null;
    }
}

public void initIcons() {
    bayStatusFreeIcon = BitmapDescriptorFactory.fromBitmap(drawableUtils.createSingleMarkerFromImage(R.drawable.area_above_9_places));
    bayStatusOccupiedIcon = BitmapDescriptorFactory.fromBitmap(drawableUtils.createSingleMarkerFromImage(R.drawable.status_occupied));
    bayStatusUnknownIcon = BitmapDescriptorFactory.fromBitmap(drawableUtils.createSingleMarkerFromImage(R.drawable.status_unknown));
}

【问题讨论】:

    标签: android dictionary marker


    【解决方案1】:

    如果要添加自定义标记,请将图像(标记图像)复制到可绘制文件夹中。

    在下面检查我的代码。

     mMap.addMarker(new MarkerOptions().position(latitude,longitude).icon(BitmapDescriptorFactory.fromResource(R.drawable.markerImage)));//markerImage is my marker image name in darwable folder.
    

    【讨论】:

    • 我知道如何绘制标记。这不是重点。我将我的自定义图标传递给 addMarker,但如果我在应用程序工作时切换权限,它会绘制默认值
    • 我已经添加了代码。我只是兑现图标,因此在绘制大量标记(这对应用程序性能有好处)然后将标记添加到地图时我不必创建它们。我真的不认为这是我的解决方案的问题。我正在开发地图应用程序很长一段时间,这种方法一直很好,直到我遇到在应用程序运行时更改权限的问题。
    【解决方案2】:

    当您返回应用程序时,在获得许可后。 在 onResume() 方法中创建标记对象或设置标记颜色。

    onResume()->返回app时调用,所以需要修改这个方法。

    我希望我会像你期望的那样工作。

    【讨论】:

    • 也许我不够精确。这正是我正在做的。我正在重绘标记,我在改变zoon时重绘它们,但是当我在应用程序工作时切换权限后,绘图结果并不像预期的那样 - 它不再使用我的自定义图标,而是使用默认的android标记图标。
    【解决方案3】:

    问题确实在于兑现这些图标。

    事情是在权限更改时,根据这个: http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

    那么如果在打开应用程序时撤销权限会发生什么?我已经尝试过了,发现应用程序的进程突然终止。应用程序中的所有内容都只是简单地停止了(因为它已经终止了......)。无论如何,这对我来说听起来很有意义,因为如果操作系统允许应用程序继续其进程,它可能会将弗雷迪召唤到我的噩梦中。我的意思是比现在更糟糕的噩梦......

    问题是我的应用程序没有崩溃或自行关闭。它仍然活跃,我可以回到它。但我认为它以某种方式重新加载了自己。因此,在我通过调用 initIcons() 兑现这些图标的活动中,我决定这样写:

    public void onCreate(IMapActivityView mapView, boolean isFirstRun) {
        this.view = mapView;
    
        if(androidBuildSdkReader.getDeviceSdkVersion() >= 23)
            markerProvider.initIcons();
        else
            initIconsIfIsFirstRun(isFirstRun);
    }
    

    而不是简单地:

    public void onCreate(IMapActivityView mapView, boolean isFirstRun) {
        this.view = mapView;
    
        initIconsIfIsFirstRun(isFirstRun);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多