在URL上为Google Maps v2 Android设置标记图标

时间:2014-03-03 05:45:18

标签: android google-maps google-maps-markers google-places-api

我无法将Google Places API提供的图标添加到标记中。例如,我想从Google Places API的JSON中返回图标:

"icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png"

以下是我现在如何在不添加图标的情况下执行此操作:

for (Place place : mNearPlaces.results) {
     LatLng placeLatLng = new LatLng(place.geometry.location.lat,
         map.addMarker(new MarkerOptions()
             .position(placeLatLng)
             .title(place.name));
}

我查看了this post,答案建议使用一些AsyncTask来下载图像。有没有其他方法可以做到这一点(这种方式似乎很慢)?是否有标准方法来设置Google Places API提供的标记图像?

以下是Google Maps Android API v2 Documentation for Markers

由于

4 个答案:

答案 0 :(得分:3)

您可以使用图书馆帮助您查看网址中的图片。访问{strong> Android-Universal-Image-Loader

https://github.com/nostra13/Android-Universal-Image-Loader

您也可以访问以了解下载图片

http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview-and-webgalleryadapter/

之后

对于自定义标记图标,您可以使用图标显示为标记。从任何类型的支持来源加载图标。

fromAsset(String assetName) - 从资源文件夹

加载

fromBitmap(位图图片) - 加载位图图像

fromFile(String path) - 从文件

加载

fromResource(int resourceId) - 从可绘制资源加载

尝试如下

// latitude and longitude
double latitude = 17.385044;
double longitude = 78.486671;

// create marker
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps");

// Changing marker icon
// set yours icon here
marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker_icon)));

// adding marker
googleMap.addMarker(marker);

答案 1 :(得分:3)

您可以使用以下代码将网址图片加载到GoogleMap mapMarker。首先设置其他属性,如标题,片段,位置等....

  mapMarker= mGoogleMap.addMarker(new MarkerOptions()
                    .title(Integer.toString(total_steps))
                    .snippet("Steps")
                    .position(new LatLng(current_lat,current_longi)));
            mapMarker.setTag("current_position");
            mapMarker.showInfoWindow();
            loadMarkerIcon(mapMarker);

使用自定义方法加载图标属性的图像。您可以将Glide gradle链接添加到项目中。

private void loadMarkerIcon(final Marker marker) {
        String burlImg = "Url_imagePath;
        Glide.with(this).load(burlImg)
                .asBitmap().fitCenter().into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation) {

                if(bitmap!=null){
                  //  Bitmap circularBitmap = getRoundedCornerBitmap(bitmap, 150);
                    Bitmap mBitmap = getCircularBitmap(bitmap);
                    mBitmap = addBorderToCircularBitmap(mBitmap, 2, Color.WHITE,squareBitmapWidth);
                    BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(mBitmap);
                    marker.setIcon(icon);
                }

            }
        });

    }

答案 2 :(得分:1)

有很多库可以帮助您查看来自网址的图片,例如:URLImageViewhelper遗憾的是,您无法在没有AsyncTask的情况下从网址加载图片,但是所有图书馆都可以帮助您查看网址中的图片正在使用Asynctask所以只需要调用该函数。

库类的实现在github页面中可用。

答案 3 :(得分:0)

调用.icon()时会执行以下操作

 protected Marker createMarker(double latitude, double longitude, String title, String snippet, String imageUrl) {

    MarkerOptions markerOptions = new MarkerOptions();
    return googleMap.addMarker(markerOptions
            .position(new LatLng(latitude, longitude))
            .anchor(0.5f, 0.5f)
            .title(title)
            .snippet(snippet)
            .icon(BitmapDescriptorFactory.fromBitmap(getBitmapFromLink(imageUrl))));
}

此方法会将图片网址转换为位图

   public Bitmap getBitmapFromLink(String link) {
    try {
        URL url = new URL(link);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        try {
            connection.connect();
        } catch (Exception e) {
            Log.v("asfwqeds", e.getMessage());
        }
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        Log.v("asfwqeds", e.getMessage());
        e.printStackTrace();
        return null;
    }
}

现在,在connection.connect()中将发生异常,显示android.os.NetworkOnMainThreadException。要处理此异常,请在您创建或添加标记之前在您的代码中添加此代码

if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }