Android GoogleMap 谷歌地图从零开始

说明

由于国内使用v2最新的谷歌地图有很多限制,所有如果要在真机上测试运行要做一些准备 
准备1: 
vpn必不可少啦 推荐cloud vpn或者betternet都是不错的免费vpn 
准备2: 
由于最新的googlemap需要google 服务的支持,而国内因为访问不了谷歌,国内的所有操作系统几户都阉割掉了这部分,你有两个选择 : 
a 用小米测试机(不用root) 
b 选择一个能root的手机 
然后就是安卓谷歌三件套,建议直接360手机市场下载谷歌安装器一键全安装了,这个需要root权限,因为要把这些app加到系统app内. 
准备3 
申请一个appkey 
方法:

快速简便的方式:使用 Android Studio 为您创建的 google_maps_api.xml 文件中提供的链接(新建一个map project时候会自动生成) 
复制google_maps_api.xml文件中提供的链接,将其粘贴到您的浏览器内。该链接跳转至 Google Developers Console 并通过 URL 参数提供信息,从而减少所需的手动输入。

    按照说明在控制台上新建一个项目,或者选择某个现有项目。
    为您的控制台项目创建一个 Android API 密钥。
    复制生成的 API 密钥,返回 Android Studio,将该 API 密钥粘贴到 google_maps_api.xml 文件的 <string> 元素中。

这里写图片描述
速度略慢的方式:使用 Android Studio 为您创建的 google_maps_api.xml 文件中提供的凭据: 
复制 google_maps_api.xml 文件中提供的凭据。 
转至浏览器中的 Google Developers Console。 
使用复制的凭据将您的应用添加至某个现有 API 密钥,或者新建一个 API 密钥。 如需了解更多详情,请参阅完整流程。

获取 API 密钥的完整流程:如果以上两种方式对您的情况均不奏效,请执行完整流程。

https://developers.google.com/maps/documentation/android-api/start 
一切搞定之后就可以编程了把key写在上图的YOUR_KEY_HERE位置上,然后就可以编程了,如果你需要官方的demo: 
https://github.com/googlemaps/android-samples

贴一些有用的代码

1定位获得location(包含经纬度)

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    Location myLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

    if (myLocation == null) {
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_COARSE);
        String provider = lm.getBestProvider(criteria, true);
        myLocation = lm.getLastKnownLocation(provider);
    }

    return myLocation;

google前几年新出的位置api:http://stackoverflow.com/questions/30253123/blue-dot-and-circle-is-not-shown-on-mylocation-using-android-fused-location-api/30255219#30255219 
2由经纬度得的地名

 public static String getAddress(Context context, double latitude, double longitude) {
        Geocoder geocoder = new Geocoder(context, Locale.getDefault());
        try {
            List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
          //  Log.i("得到位置当前", "/" + addresses);
            //"经度:"+String.valueOf(address.get(0).getLongitude()*1E6)+"\n";
            //"纬度:"+String.valueOf(address.get(0).getLatitude()*1E6)+"\n";
            //"国家:"+address.get(0).getCountryName()+"\n";
            //"省:"+address.get(0).getAdminArea()+"\n";
            //"城市:"+address.get(0).getLocality()+"\n";
            // "名称:"+address.get(0).getAddressLine(1)+"\n";
            //"街道:"+address.get(0).getAddressLine(0);
            return addresses.get(0).getLocality();
        } catch (Exception e) {
            e.printStackTrace();
            return "未知";
        }
   }

3由地名获得经纬度 
3.1利用谷歌自带api

/**
     * 根据地名返回一个有经纬度location,如果查询不到经纬度  则默认经纬度是0
     * @param context
     * @param address
     * @return
     */
    public static Location getLocation(Context context, String address) {
        Geocoder geocoder = new Geocoder(context, Locale.getDefault());
        try {
            List<Address> addresses = geocoder.getFromLocationName(address,1);
            ALog.i("得到位置name", "/" + addresses);
            Location location = new Location(address);
            location.setLatitude(addresses.get(0).getLatitude());
            location.setLongitude(addresses.get(0).getLongitude());
            return location;
        } catch (Exception e) {
            ALog.i(TAG, "未获得有效数据");
            e.printStackTrace();
            return new Location(address);
        }
    }

3.2利用网络(需要FQ但是速度快,查找并不全面)

 public PositionInfo getPositionInfo(String position_name) throws IOException {
        InputStream is_position = new URL("http://maps.googleapis.com/maps/api/geocode/json?address=" + URLEncoder.encode(position_name, "UTF-8") + "&sensor=false").openStream();
        //连接是google提供的根据地名查询location的地址 例如:http://maps.googleapis.com/maps/api/geocode/json?address=%E4%B8%AD%E5%85%B3%E6%9D%91&sensor=false 返回的是json格式字符串

        String position = StreamTools.readStream(is_position);
        Gson gson = new Gson();
        return gson.fromJson(position, PositionInfo.class);
    }

 

posted @ 2017-09-21 20:02  星辰之力  阅读(1318)  评论(0编辑  收藏  举报