830 likes | 1.26k Views
Android 智慧型手機程式設計. Android Google Maps. 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2 2013/5 V3 V4. Google Maps. Reference : https://developers.google.com/maps/documentation/android/start#creating_an_api_project. 取得 Google Map API. Step1: 先進入 JDK 目錄. Google Maps. 透過 keytool.exe 建立認證指紋 SHA1
E N D
Android智慧型手機程式設計 AndroidGoogle Maps 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2 2013/5 V3 V4
Google Maps Reference: https://developers.google.com/maps/documentation/android/start#creating_an_api_project • 取得Google Map API Step1:先進入JDK目錄
Google Maps • 透過keytool.exe建立認證指紋SHA1 • 需要debug_keystore路徑
新版IDE已經列出SHA1碼不過好像不太能用 下一步驟用
重做一次認證 • 輸入 • keytool -list -v -keystore "C:\Documents and Settings\Administrator\.android\debug.keystore“ • 預設密碼是android 來自Eclipse內的default keystore
Google Maps • 產生認證指紋 要的是SHA1編碼
Google Maps • 進入Google Map API Key申請頁面 • http://code.google.com/intl/zh-Tw/android/add-ons/google-apis/maps-api-signup.html(不再使用) 目前不用 輸入認證指紋碼
Google Maps Android API Version 1開發法已經停用 • http://cheng-min-i-taiwan.blogspot.tw/2013/04/google-maps-android-api-v2-android.html • 新版API需要配合Google Play Services
進入申請頁面 • https://developers.google.com/maps/documentation/javascript/tutorial#api_key 需要登入Google
Google Maps • 進入Google Map API Key申請頁面 Reference:這裡有做法 https://developers.google.com/maps/documentation/android/start#creating_an_api_project
首先將API key加入AndroidManifest.xml <meta-dataandroid:name="com.google.android.maps.v2.API_KEY"android:value="your_api_key"/>
加入使用權限到AndroidManifest.xml 改成自己的package name <permissionandroid:name="ctu.rcjao.helloandroid.permission.MAPS_RECEIVE“ android:protectionLevel="signature"/> <uses-permission android:name="ctu.rcjao.helloandroid.permission.MAPS_RECEIVE"/> 改成自己的package name
Use permission <uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permissionandroid:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/><!-- The following two permissions are not required to useGoogle Maps Android API v2, but are recommended. --><uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
uses-feature <uses-featureandroid:glEsVersion="0x00020000"android:required="true"/>
Xml檔案 加入下列code <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment"/>
JAVA程式 publicclass Map extends FragmentActivity { @Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map); } }
執行 結果不能跑,有錯誤!
打開SDK中的SDK Manager,找到Extras並安裝Android Support Library及 Google Play Services兩個項目
匯入Google Play Services函式庫File > Import > Android > Existing Android Code Into Workspace 路徑: android-sdk\extras\google\google_play_services\libproject\google-play-services_lib
執行 • 需要實體手機 • 過程中可能需要更新Google Play
Google Maps 實體手機
有了,但是還是不行! 換個版本4.0.3
使用SDK 4.0.3 AVD設定
設定模擬器顯示地圖 • 首先在模擬器中安裝Google Play Service • 修改System目錄之檔案權限,允許寫入權限 • adb shell mount -o remount,rw -t yaffs2 /dev/block/mtdblock0 /system • adb shell chmod 777 /system/app • adb push GoogleLoginService.apk /system/app/ • adb push GoogleServicesFramework.apk /system/app/ • adb push Phonesky.apk /system/app/
adb install Maps_6.12.0.apk • adb install com.google.android.gms-3.apk Google Play Service 要夠新 漫長的等待….
通常是失敗,因為不支援線上更新 下載新的APK重裝就可以了
在Google Maps上加標示 @SuppressLint("NewApi") publicclass Main extendsFragmentActivity { //要顯示的座標 staticfinal LatLng CTU = new LatLng(24.06660656734983, 120.54975986480713); private GoogleMap map; @SuppressLint("NewApi") @Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //取得地圖物件 map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); //建立紅色氣球標示 Marker mk = map.addMarker(new MarkerOptions().position(CTU).title("建國科技大學").snippet("資管系")); // 設定縮放大小是16,且將標示點放在正中央 map.moveCamera(CameraUpdateFactory.newLatLngZoom(CTU, 16)); } } • SDK至少要4.0 如果更早的SDK也要可以用 map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
修改UI的xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <fragment android:layout_weight="1" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_weight="0" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="地圖" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="衛星" /> </LinearLayout> </LinearLayout> 原地圖 設定layout_weight 加入這段來切換地圖種類
Oncreate中加入下列code Button btn_normalview=(Button)findViewById(R.id.button1); Button btn_satellitetview=(Button)findViewById(R.id.button2); btn_normalview.setOnClickListener(new Button.OnClickListener() { publicvoid onClick(View arg0) { map.setMapType(GoogleMap.MAP_TYPE_NORMAL); //顯示地圖模式 } }); btn_satellitetview.setOnClickListener(new Button.OnClickListener() { publicvoid onClick(View arg0) { map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); //顯示衛星模式 } });
地址轉座標功能將下列code加入UI (fragment前) <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="0" > <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" > <requestFocus /> </EditText> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="顯示" /> <TextView android:id="@+id/textview1" android:text="" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
地址轉座標功能 Button btn_address_to_geo=(Button)findViewById(R.id.button3); btn_address_to_geo.setOnClickListener(new Button.OnClickListener() { publicvoid onClick(View arg0) { try { EditText inputaddress=(EditText)findViewById(R.id.editText1); tv1=(TextView)findViewById(R.id.textview1); Geocoder geocoder = new Geocoder(Main.this, Locale.getDefault()); List<Address> geoResults = geocoder.getFromLocationName(inputaddress.getText().toString(), 5); while (geoResults.size()==0) { geoResults = geocoder.getFromLocationName(inputaddress.getText().toString(), 5); } if (geoResults.size()>0) { Address addr = geoResults.get(0); Double latitude = addr.getLatitude() * 1E6; Double longitude = addr.getLongitude() * 1E6; tv1.setText(latitude + "/" + longitude); } } catch (Exception e) { tv1.setText("轉換失敗"); } } });
result 模擬器 實機