Android Google Mapv2从URL获取图标

13

现在我的问题是,我无法从URL中获取并显示自定义图标到Google地图上。根据Google的示例,只有图标可以显示在Google地图上。但我想知道的是如何从URL中显示图标。

private Marker melbourne = mMap.addMarker(new MarkerOptions()
                            .position(MELBOURNE)
                            .title("Melbourne")
                            .snippet("Population: 4,137,400")
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));

这是我的编码。

            if(c != null){          
                if(c.moveToFirst()){
                    do {
                        googleMap.addMarker(new MarkerOptions()
                        .position(new LatLng(Double.parseDouble(c.getString(2)), Double.parseDouble(c.getString(3))))
                        .title(c.getString(0))
                        .icon(BitmapDescriptorFactory.fromBitmap(bmp))
                        .snippet(c.getString(1)));
                    } while(c.moveToNext());
                }               
            }

发起一个HTTP请求,下载位图并使用它。 - Raghunandan
你能否提供完整的例子? - PPShein
我在这里回答了这个问题 https://stackoverflow.com/questions/22139515/set-marker-icon-on-google-maps-v2-android-from-url/47471289#47471289。 - Indika Ruwan Senavirathne
这里是完整的解决方案以及代码片段 https://stackoverflow.com/a/61929527/8663316 - Faizan Haidar Khan
2个回答

15

您可以下载位图作为

Bitmap bmp = BitmapFactory.decodeStream(myurl.openConnection().getInputStream());

使用线程获取位图

然后

 .icon(BitmapDescriptorFactory.fromBitmap(bmp)));

根据您的评论,您遇到了NetworkOnMainThreadException异常。

因此,请使用线程。

Thread thread = new Thread(new Runnable(){
@Override
public void run(){
    URL url ;
    try {
        url = new URL("myurl");
        bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
    } catch (Exception e) {
        e.printStackTrace();
    }
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            source = mMap.addMarker(new MarkerOptions()
                    .position(sc)
                    .title("MyHome")
                    .snippet("Bangalore")
                    .icon(BitmapDescriptorFactory.fromResource(bmp)));
        }
    });
}
});
thread.start();

你不能从后台线程更新用户界面,使用runOnUiThread

使用AsyncTask

将你的AsyncTask作为你的活动的内部类。将Bitmap声明为一个类变量。

 class TheTask extends AsyncTask <Void,Void,Void>
 {
@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();

}
@Override
protected Void doInBackground(Void... params) {
    URL url ;
    try {
    url = new URL("myurl");
    bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
    } catch (Exception e) {
      e.printStackTrace();
         }
    return null;
}
@Override
protected void onPostExecute(Void result) {

super.onPostExecute(result);
    source = mMap.addMarker(new MarkerOptions()
    .position(sc)
    .title("MyHome")
    .snippet("Bangalore")                                                                                     
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.pin)));                                       
    }
}

@ppshein,你遇到了什么错误?你需要使用线程从URL获取位图。 - Raghunandan
URL myurl = new URL("http://www.test.com/about.jpg"); Bitmap bmp = BitmapFactory.decodeStream(myurl.openConnection().getInputStream()); - PPShein
@ppshein 为什么不是100%?c是一个游标对象吗?它具体是在做什么? - Raghunandan
@ppshein,请发布一个新的主题(一个新的问题),并附上所有相关的代码。目前发布的代码不足以解决问题。如果没有完整的代码,请提出一个新的问题,社区一定会帮助您。由于这是一个新话题,它将引导到讨论。因此,我建议您为当前的问题打开一个新的主题。 - Raghunandan
http://stackoverflow.com/questions/17500818/android-google-maps-custom-icon-from-url-stored-in-sqlite - PPShein
显示剩余8条评论

6
我使用了Ion库来加载图片。这是一个非常好的库。
从URL设置标记图标非常简单。
try {
        Bitmap bmImg = Ion.with(context)
                .load("http://example.com").asBitmap().get();

        mMap.addMarker(new MarkerOptions().position(latlng)
                .icon(BitmapDescriptorFactory.fromBitmap(bmImg)));

    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

希望这可以帮到你


如何更改图像大小?如果用户添加了巨大的图像URL,会发生什么?你有测试过吗? - mehmet
1
@mehmet 你可以创建一个从原始位图调整大小的新位图,代码如下:Bitmap resizedBitmap = Bitmap.createScaledBitmap(bmImg, bmImg.getWidth()/2, bmImg.getHeight()/2, false); - josher932
我已经使用Picasso库 https://github.com/square/picasso 解决了这个问题。 - mehmet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接