在不使用Google地图的情况下在地图上显示位置

时间:2015-03-13 19:59:53

标签: android google-maps

我在面试之前接受了这个练习,以创建一个小应用程序。 在应用程序的某个时刻,我需要使用纬度和经度坐标在地图上显示一个位置。

但我认为我不应该使用Google Maps API,而是使用设备上的“内置”地图。

有这样的事吗? 是否有一个简单的MapView视图,我可以放在我的布局中,接受lat和lon coords并在正确的位置放置一个标记?

我一直在寻找一个教程,解释如何在Android上使用内置的地图API但找不到。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

现在Android设备上的“内置”地图是 Google地图。毕竟,Android =谷歌。我无法想象为什么有人会试图让你做这个没有某种API,但这是另一个故事。

  

不要害怕与面试官(或任何给你这个练习的人)核实你是否可以使用谷歌地图API - 这是一个重要的细节,可以让你的生活更轻松。< / p>

答案 1 :(得分:1)

通常,在这些代码挑战面试时,他们希望看到你能在相对较短的时间内提出的内容。

类似于@bwegs所提到的,你应该与面试官核实是否有任何限制。我做了很多采访,其中代码挑战是在24小时内创建一些东西,但应用程序的大小只是大到完成。在这种情况下,我会使用第三方库。

我不知道任何其他检索地图的方法,所以如果您可以使用Google Maps API,那么请先阅读此处的文档https://developers.google.com/maps/documentation/android/

此外,您可以利用Google Static Maps API https://developers.google.com/maps/documentation/staticmaps/,它会返回特定位置的静态图片。

以下是我为获取Google静态地图而创建的一般AsyncTask

class CreateStaticMapAsyncTask extends AsyncTask<String, Void, Bitmap> {

    private static final String STATIC_MAPS_API_BASE = "https://maps.googleapis.com/maps/api/staticmap";
    private static final String STATIC_MAPS_API_SIZE = "500x500";

    @Override
    protected void onPreExecute() {
        addTask(); // adds one to task count.
        super.onPreExecute();

    }

    @Override
    protected Bitmap doInBackground(String... params) {
        // TODO Auto-generated method stub
        locationString = params[0];
        Bitmap bmp = null;
        StringBuilder sb = new StringBuilder(STATIC_MAPS_API_BASE);
        try {
            sb.append("?center=").append(
                    URLEncoder.encode(locationString, "UTF-8"));
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        sb.append("&size=" + STATIC_MAPS_API_SIZE);
        sb.append("&key=" + API_KEY);
        String url = new String(sb.toString());
        Log.e("URL", sb.toString());

        HttpClient httpclient = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);

        InputStream in = null;
        try {
            in = httpclient.execute(request).getEntity().getContent();
            bmp = BitmapFactory.decodeStream(in);
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bmp;

    }

    protected void onPostExecute(Bitmap bmp) {
        super.onPostExecute(bmp);
        if (bmp != null) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            data = stream.toByteArray();
            removeTask();
            allTasksComplete();

        }
    }
}

可以通过此次调用new CreateStaticMapAsyncTask().execute(loc);

进行访问

并且您可以检索当前位置,例如,这样(不是唯一的方式)

LocationManager locManager = (LocationManager) getActivity()
                    .getSystemService(Context.LOCATION_SERVICE);
            boolean network_enabled = locManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            Location location;

            if (network_enabled) {
                location = locManager
                        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                if (location != null) {

                    _longitude = location.getLongitude();
                    _latitude = location.getLatitude();
                    etLocation.setText(_latitude + "," + _longitude);
                }
            }