【转】Android 国内集成使用谷歌地图

由于众做周知的原因在国内使用谷歌地图不太方便,在开发中如果直接使用会出现些问题。但国内的如百度地图,高德地图等都无法提供详细的国外地图数据,所以研究一下喽,,,

使用 Google Maps Android API v2

使用谷歌提供的SDK,Android Studio开发。
  1. 首先保证SDK Manager中 Google Play service服务已经安装。 

2.新建一个工程GoogleMapDemo,然后File ->Project Structure->[app]->->Dependences,点击加号,添加play service依赖。 
 
3.要使用谷歌提低,需要到Google Developers Console申请一个Key。 
首先创建一个工程,然后在API标签选择启用Google Maps Android API v2,也可以顺带多选几个比如JS的备用。 

在 Credentials 标签 Public API access 处添加一个Android key
 
使用用于签名的keystore生成一个SHA-1指纹,可以先使用debug.kestore。我的在C:\Users\RANDY.android\下。 
keytool -list -v -keystore debug.keystore 
密码:android 
将生成的指纹填在指定输入框,create OK。同时会生成一个API KEY。

4.配置工程的Manifest文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="map.randy.com.googlemapdemo" >
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- The following two permissions are not required to use
         Google Maps Android API v2, but are recommended. -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="*API_KEY*"/>
    </application>
</manifest>

5.配置Activity,使用Fragment来显示地图。 

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.google.android.gms.maps.MapFragment"/>
</RelativeLayout>

MainActivity

package map.randy.com.googlemapdemo;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends FragmentActivity implements OnMapReadyCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng sydney = new LatLng(-33.867, 151.206);

        googleMap.setMyLocationEnabled(true);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13));

        googleMap.addMarker(new MarkerOptions()
                .title("Sydney")
                .snippet("The most populous city in Australia.")
                .position(sydney));
    }
}

运行: 

但是这是在FQ情况下,,如果没有FQ,只能是空白。。。

而谷歌在V2提供了一个遮罩层,开发者可以使用它来自定义地图。

    package map.randy.com.googlemapdemo;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.TileOverlayOptions;
import com.google.android.gms.maps.model.TileProvider;
import com.google.android.gms.maps.model.UrlTileProvider;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Random;

public class MainActivity extends FragmentActivity implements OnMapReadyCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        TileProvider tileProvider = new UrlTileProvider(512, 512) {

            @Override
            public URL getTileUrl(int x, int y, int zoom) {
                 /* Define the URL pattern for the tile images */
                Random random = new Random();
                String s = String.format("http://mt"+random.nextInt(3)+".google.cn/vt/[email protected]&hl=zh-CN&gl=cn&x=%d&y=%d&z=%d&s=Galil",
                        x, y,zoom);
                if (!checkTileExists(x, y, zoom)) {
                    return null;
                }

                try {
                    return new URL(s);
                } catch (MalformedURLException e) {
                    throw new AssertionError(e);
                }
            }
        };
        TileOverlayOptions tpo = new TileOverlayOptions();
        tpo.tileProvider(tileProvider);
        mapFragment.getMap().addTileOverlay(tpo);
        mapFragment.getMap().setMapType(GoogleMap.MAP_TYPE_NONE);
        mapFragment.getMapAsync(this);
    }

    private boolean checkTileExists(int x, int y, int zoom) {
        int minZoom = 12;
        int maxZoom = 16;

        if ((zoom < minZoom || zoom > maxZoom)) {
            return false;
        }

        return true;
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng sydney = new LatLng(-33.867, 151.206);

        googleMap.setMyLocationEnabled(true);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13));

        googleMap.addMarker(new MarkerOptions()
                .title("Sydney")
                .snippet("The most populous city in Australia.")
                .position(sydney));
    }
}

不过经测试发现不知为何这种方法实现的图片质量有点低。。囧。。。 

待续。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 05:02:20

【转】Android 国内集成使用谷歌地图的相关文章

Android 国内集成使用谷歌地图

extends:http://blog.csdn.net/qduningning/article/details/44778751 由于众做周知的原因在国内使用谷歌地图不太方便,在开发中如果直接使用会出现些问题.但国内的如百度地图,高德地图等都无法提供详细的国外地图数据,所以研究一下喽,,, 使用 Google Maps Android API v2 使用谷歌提供的SDK,Android Studio开发. 首先保证SDK Manager中 Google Play service服务已经安装. 

在 Android* 商务应用中实施地图和地理围栏特性

摘要 本案例研究讨论了怎样将地图和地理定位特性构建到 Android* 商务应用中.包含在 Google Maps* 上覆盖商店位置,以及在设备进入商店地理围栏邻近区域时借助地理围栏通知用户. 文件夹 摘要 概述 在 Google Maps 上显示商店位置 Google Maps Android API v2 在应用清单中指定应用设置 加入地图 Fragment 发送地理围栏通知 注冊和取消注冊地理围栏 实施位置服务回调 实施意向服务 总结 參考文献 作者介绍 概述 在本案例研究中,我们将会把地

Odoo Website 替换 谷歌地图为 百度地图

由于众所周知的原因,国内使用谷歌地图是件非常痛苦的事,更为接地气的做法是替换为百度地图. 模块地址参见群公告.

谷歌地图聚合点

我们有时候需要观察地图 不同地方数据的所在范围和分布密集情况,热力图和聚合点的使用无疑是最好的选择. 1.首先说说百度地图,只做国内的地图可以使用百度地图的海量点和热力图还是蛮好用的. a.海量点的最大好处是加载很多数据点的情况下不卡顿. b.如果是画mark在地图上,当点多的时候,会很卡. c.我之所以用谷歌地图的热力图,是因为我发现百度地图的热力图没有叠加功能,满足不了我的需求.比如说我想了解全国姓张,李,王的人的对比分布,我想要姓张的区域显示红色,姓李的显示蓝色,姓王的显示橙色.这个需求百

Android App集成支付宝

原地址:http://blog.csdn.net/wenbingoon/article/details/7933078 手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能.人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫描一下,或者搜索一下,然后下单,不找零,直接送到你家,这将是手机支付给我们带来的全新交易体验.谷歌刚推出了谷歌钱包,这必是我们后面要使用的主要手段,但是鉴于当前国情,我觉得有必要介绍

基于Jenkins+git+gradle的android持续集成,jenkinsgradle

转载:http://www.android100.org/html/201506/22/156680.html 基于Jenkins+git+gradle的android持续集成,jenkinsgradle 本文参考了: http://my.oschina.net/uboluo/blog/157483 http://java.dzone.com/articles/automating-continuous 以前都是通过IDE(eclipse or Android Studio)手动生成apk通过Q

谷歌地图地理解析和反解析geocode.geocoder详解(转)

谷歌地图地理解析和反解析geocode.geocoder详解 谷歌Geocoder服务 实例代码 地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国贵州省贵阳市南明区翠微巷7号 邮政编码: 550002)的过程. 受当地法律限制及各方面原因,国内很多地图并不包含地理解析和反解析功能(地理解析和反解析功能功能不够强悍),Google永远是最棒的. 要

谷歌地图地理解析和反解析geocode.geocoder详解

地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国贵州省贵阳市南明区翠微巷7号 邮政编码: 550002)的过程.受当地法律限制及各方面原因,国内很多地图并不包含地理解析和反解析功能(地理解析和反解析功能功能不够强悍),Google永远是最棒的.废话不多说要使用到Google map 地理解析和反解析功能,我们需要了解google.maps.Geo

【转】谷歌地图的级别与对应比例尺及分辨率探究

谷歌地图的级别与对应比例尺及分辨率探究 谷歌推出的免费在线卫星地图.电子地图也已经有些年头了,无论是出于个人爱好还是商业目的,大家都在分享谷歌提供的这份丰盛的免费午餐.至于如何获取谷歌的免费地图,这个不用多讲,百度一下就能找到各种谷歌地图下载器工具.以截屏方式获取的,或直接从谷歌服务器上下载的,收费的,免费的,应用尽有,这个不是今天我们要讨论的主题!谷歌的免费地图是容易下载的,但没有哪款地图下载器工具是有比例显示的,这个问题很严重!即便是简单的应用,如打印个挂图什么的也需要有比例尺作参照,如果要