我们在APP中开发中经常会内嵌地图展示某一具体位置,比如用地图展示某一个具体位置。以上海徐家汇为例,如下图所示:
如果我们直接使用浏览器打开的话,参考http://developer.baidu.com/map/uri-introweb.htm
如果我们已知经纬度(lat, lng),那么很方便,我们可以使用下面的方式来展示
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri
.parse("http://api.map.baidu.com/ marker?location=31.200209,121.443481&output=html");
intent.setData(content_url);
startActivity(intent);
结果也能正确显示。但是更多时候我们无法知道确切经纬度,只有具体地名,那么我们又该如何处理呢? 百度WEB API都帮我们想到了这些问题,我们可以先使用http://api.map.baidu.com/geocoder?address=上海徐家汇&output=json方法来获取经纬度,进而使用上面的方式展示即可。注意我们使用的是json,如果使用Html展示,那么下面内容为:
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri
.parse("http://api.map.baidu.com/geocoder?address=上海徐家汇&output=html");
intent.setData(content_url);
startActivity(intent);
显示结果为:
如果需要得到上面实际地图结果,需要点击椭圆形中的地图图标才会进入地图模式,得到:
这样就很麻烦,需要用户点击一次才可以得到想要的内容。
故我们的方式为先用异步处理获得经纬度,然后填充到上面的API展示相关内容即可。具体实现代码如下:
class AddrAsync extends AsyncTask<String, Void, String> {
String addr;
@Override
protected String doInBackground(String... params) {
addr = params[0];
return doGetGeoAddr(addr);
}
@Override
protected void onPostExecute(String addrUrl) {
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(addrUrl);
intent.setData(content_url);
startActivity(intent);
}
}
public String doGetGeoAddr(String addr) {
try {
URL url = new URL(getAddressJson(addr));
HttpURLConnection con = (HttpURLConnection) url.openConnection();
String result = readStream(con.getInputStream());
if (result == null) {
return getAddressUrl(addr);
} else {
LocGeoResult loc = new Gson().fromJson(result,
LocGeoResult.class);
if (loc.status.equalsIgnoreCase("ok")) {
return getAddressDetailUrl(
loc.result.location.lat, loc.result.location.lng,
"我的位置", addr);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return getAddressUrl(addr);
}
private String readStream(InputStream in) {
BufferedReader reader = null;
StringBuilder mBuilder = new StringBuilder();
try {
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
mBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return mBuilder.toString().replace(" ", "");
}
public static String getAddressUrl(String addr) {
String strUrl = "http://api.map.baidu.com/geocoder?address=%1$s&output=html";
return String.format(strUrl, encodeStr(addr));
}
public static String getAddressJson(String addr) {
String strUrl = "http://api.map.baidu.com/geocoder?address=%1$s&output=json";
return String.format(strUrl, encodeStr(addr));
}
public static String getAddressDetailUrl(float lat, float lng, String title, String addr) {
StringstrUrl = "http://api.map.baidu.com/marker?location=%1$f,%2$f&title=%3$s&content=%4$s&output=html";
return String.format(strUrl, lat, lng, title, addr);
}
public static String encodeStr(String str) {
try {
return URLEncoder.encode(str, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
其中LocGeoResult如下:
public class LocGeoResult {
public String status;
public LocResult result;
public class LocResult {
public LocDetail location;
public int precise;
public int confidence;
public String level;
}
public class LocDetail {
public float lng;
public float lat;
}
}
最后调用new AddrAsync().execute(strAddr); 即可。结果如下:
如果不想调用浏览器,那么在页面中嵌入webview也是可以的.获取具体的URL实现方式和上面一致
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zhengdan66/article/details/47139845