2011年6月4日 星期六

Android學習_如何申請Google Map API Key(實機用)

Google已經發布新的Google Map Android API v2,相關使用方法請參考新文章:Android學習_如何開始使用Google Maps Android API v2
-------------------------------------------------------------


要在Android內使用Google Map API需要先申請API key,而申請API key必須要有MD5 fingerprint,如果是使用模擬器來測試,就必須要以debug的MD5去申請key,詳細步驟請見"Android筆記_如何申請Google Map API Key(模擬器用)",但是如果想放到實體手機上,就必須要先建立"個人的keystore",再利用keytool取得MD5,最後進行API key的申請,詳細步驟如下:

一、建立個人的keystore
A. 開啟DOS命令視窗,找到java的bin資料夾(C:\Program Files\Java\jre6\bin)

B. 輸入keytool指令(keytool -genkey -v -keystore yourkeyname.keystore -alias yourkeyname -keyalg RSA -validity 10000)[參考Android SDK 開發範例大全3]
keystore:名稱
alias:別名
keyalg:演算法
validity:有效天數
輸入後,會有一系列的問題,需要注意的是過程中會輸入兩種密碼,網路上書上都推薦怕記不住就用一樣。


C. 完成後,keytool就會產生keystore的檔案在java的bin資料夾


二、有了個人的keystore後,就必須要取得該keystore的MD5
A. 還是一樣先開啟DOS命令視窗,找到java的bin資料夾(C:\Program Files\Java\jre6\bin)
B. 使用"既有keystore取得MD5的語法(keytool -list -v -keystore "絕對路徑"),鍵入語法後就必須要輸入剛剛建立時所設定的密碼。

C. 記著MD5。

三、至申請頁面Sign Up for the Android Maps API(網址:http://code.google.com/intl/zh-TW/android/maps-api-signup.html)
A. 貼上剛剛的MD5,並且按下[Generate API Key]
B. 接下來就會看到一個感謝您的畫面,上面有申請到的Android Maps API 金鑰


四、接下來把API key放到MapView的android:apiKey屬性。

五、因為我們是使用個人keystore產生的MD5去申請apiKey,所以在安裝程式到實機時,也變的有點不一樣,如果直接用Run As選我們的實體手機,會發現還是沒辦法正常顯示地圖;原因是我們並沒有"設定"這隻程式是屬於該keystore的,所以必須先利用匯出功能將個人簽章(keystore)註冊給這個專案。
A. 專案右鍵選擇Android Tools→Export Signed Application Package

B. 依照步驟可以匯出帶有簽章的apk檔案(過程中必須輸入最初設定的keystore密碼)

六、取得到帶有keystore的Apk檔案以後,可以利用adb將程式安裝到實際的手機上面。
A. 利用adb指令(adb install Name.apk) (相關語法)

如此,就可以將Google Map相關的android程式安裝到實體手機上面進行測試。

這篇有幫助到你了話,請留"YA~~~看到圖了"

104 則留言:

匿名 提到...

請問一下,關於指令中的-keystore部分
我在網路上找到的資訊是說這個指定名字的keystore如果不存在會自動建立一個keystore檔案
但是我在輸入完所有問題之後都會出現FileNotFoundException
也就是說keystore檔並沒有建立成功,請問這要怎麼解決呢?

ola的家 提到...

你可以先嘗試將keystore參數加上完整路徑,比如說:c:\ola.keystore應該就可以正常產生。

匿名 提到...

試過了,依然是存取被拒
我也試過把路徑指到別的磁碟機了

匿名 提到...

問題解決了,我將keytool設為以管理員身分執行便可以正常建立檔案了
謝謝您的幫忙

ola的家 提到...

恭喜。沒有想到是權限問題。

匿名 提到...

謝謝!你的詳細解說.
YA~看到圖了= )

ola的家 提到...

恭喜你呀 =)

787897 提到...
作者已經移除這則留言。
787897 提到...

順便請問一下 要如何從資料庫取得經緯度然後呈現在地圖上阿 有什麼固定的語法嘛?

ola的家 提到...

我不太懂你所謂的"資料庫"取經緯度的意思是什麼,所以我猜測一下:

1. 意思是從伺服器:
使用http get/post來取,或寫一個WebService。

2. 意思是在手機上取得經緯度:
利用LocationManager去取得。

3. 意思是已經取得經緯度了,要秀上去:
利用overlay繪製。

匿名 提到...

我也是必須使用修改成以管理員身分執行之後 順利取得
可是命令提示字元卻是另開視窗 並且只閃爍一下就結束 看不清楚金鑰 請問要如何解決呢??

ola的家 提到...

應該是用管理員身分執行"命令提示字元",然後在裡面輸入指令。

你會只閃一下,應該是直接去執行keystore才會這樣。

匿名 提到...

不好意思 我想請問一下
我已經申請個人API了(不是模擬器上使用的)

可是我在手機上面測試還是只顯示網格而已
請問這是什麼原因 :(

麻煩您了 !!

ola的家 提到...

你先確認以下這些事情:
1. 是否是用建立的keystore產生MD5
2. 是否用上述的MD5去申請google map api key
3. 是否有將取得的google map api key寫在xml檔
4. 這個專案是否有用建立的keystore匯出成apk
5. 是否安裝這個apk

我覺得你應該某個地方有搞混,導致他不是讀到被授權的KEY。

匿名 提到...

感謝你!! 其實我犯了個錯誤

原來我們在申請個人API時有自己創一個Keystore在java jdk裡面
當我再匯出專案成apk檔時自己又再創一個keystore
正確的是要瀏覽開啟我們在java jdk裡面那個keystore
而不是自己創 這部分我不知道也做錯了

最後看到地圖了 !!!
感謝~

ola的家 提到...

恭喜你呀 ^.^

787897 提到...

請問一下 如果我到最後要發布到market上 那api key
要打什麼啊? 因為每台手機的API key都不同

ola的家 提到...

那個API key不是一個手機用一個。

概念上是你用你『個人的keystore』去申請API key,所以google會知道這個API key的程式就是你所製作的,目的是他要類似控管有多少人在使用他放出來的google map api;而不是像你想的一個手機要用一個API key。

所以這個問題是不存在的。

匿名 提到...

YA~~~看到圖了

ola的家 提到...

恭喜你呀 :D

匿名 提到...

請問執行cmd 語法都跟上面一樣
可是我會出現
Unrecognized option : -genkey
Could not create the Java virtual machine.
不知到大大是否知道是哪裡出了問題><

ola的家 提到...

"Could not create the Java virtual machine"
這個錯誤我沒有碰過耶,google以後看起來是記憶體配置的問題。

但是實際要怎麼解決我沒有測試過,你可能還要根據那些文章試試看。

匿名 提到...

請問我產生出來的認證指紋不是MD5而是SHA1該怎麼辦 我去申請API時網頁有點不一樣我輸入完SHA1的認證指紋後網頁都是?????? 請問這樣算申請成功嗎?

ola的家 提到...

要申請google map api的使用就要用MD5。

我不知道什麼樣的API要使用SHA1來認證,但是你都可以利用你產生的keystore去得到MD5來申請google map api,同時也可以利用該keystore去得到別的憑證去申請其他的API(如果你的APP需要同時使用兩個需要認證的API)

看你寄的附圖,從keystore的產生流程就已經不同了,而且你在得到憑證時是使用debug.keystore,所以應該還是要先確認你要做的事情。

如果單單使用google map api照本文的語法輸入即可。

黃詩雅 提到...

hello
我模擬器&實機,地圖都跑不出來啊.......網格狀
1.
在模擬器上測試時,有照著步驟先去看eclipse build keystore的路徑,
再用CMD 取MD5 去申請apikey......................
(另外自己有懷疑過是 keystore過期,
但已經把它砍掉在新建一次,還是同樣結果)

Log cat :Couldn't get connection factory client

2.實機測試
在第一次用eclipse匯出時選取新建一個keystore,
再去查詢這個keystore的MD5,以該MD5申請apikey
把xml檔的apikey改掉後再匯出一次,但這次選使用現有的keystore

把滙出的apk安裝在實機上還是網格狀的,地圖沒有出來


到底是哪裡被鬼打牆了(嗚~~)


系統平台:win 7 64bit & eclipse Indigo

ola的家 提到...

看起來整個流程應該是沒有錯,那可能就需要重頭確認起:

我覺得你有幾個地方可以測一下,

1. 使用java的keytool指令(C:\Program Files\Java\jre6\bin),產生keystore。
2. 確認是用產生出來的keystore取得MD5
3. 確認是用上述MD5取得google api key
4. 確認該api key有置換MapView的key
5. 確認匯出apk檔時,是使用申請的keystore來匯出。
6. 確認網路連線。

我沒有在匯出時使用過"選取新建一個keystore",不確定這種方式所得到的keystore是否可以正確使用,所以我認為你可以照著本篇第一個步驟取得keystore後,再做一次流程。

我的感覺是你應該有某一個步驟沒有對應到keystore與api key。

good luck

沈溺 提到...

ola 大大您好
我想請問是否能在goole地圖上
做一個地圖擷取的功能
比如我做好了可以路線規劃
是否能在我的程式上加入畫面擷取
存到記憶卡
謝謝

ola的家 提到...

利用 MapView.setDrawingCacheEnabled(true);
Bitmap mBitmap = Bitmap.createBitmap(MapView.getDrawingCache());

可以取得地圖的MapView的Bitmap,再轉成你需要的格式。

沈溺 提到...

感謝Q_Q

Wesely翁 提到...

「ola的家 提到...
你先確認以下這些事情:
1. 是否是用建立的keystore產生MD5
2. 是否用上述的MD5去申請google map api key
3. 是否有將取得的google map api key寫在xml檔
4. 這個專案是否有用建立的keystore匯出成apk
5. 是否安裝這個apk」
有用!YA~看到圖囉~感謝!!

ola的家 提到...

恭喜 XD

匿名 提到...

您好!

小弟我在取得憑證指紋時是出現SHA1

不知可否讓他直接出現MD5

感謝!!

ola的家 提到...

增加-v的參數,
將keytool -list -keystore C:\...,
改為keytool -list -v -keystore C:\...。

匿名 提到...

原來如此~
我瞭解了!
感謝您!!

阿劉 提到...

我在第三點
三、至申請頁面Sign Up for the Android Maps API網址上
貼到GOOGLE瀏覽器,網頁上面自己就跑出MD5認證的那串XX:XX:XX 而我用那串竟然可以申請到的Android Maps API 金鑰

而我用我自己照步驟打指令產生的MD5不能用但是他網頁上面的填進去可以申請到 但是這樣因該是錯誤的吧!?!?

而第四步驟之後我就不知該如何操作
卡在
四、接下來把API key放到MapView的android:apiKey屬性。
(其實後面都好模糊~"~)
不知道可不可以聯絡你.

ola的家 提到...

我看不太懂你的描述,所以你有正確申請到api key嗎?

第四點就是layout(你的可能叫做main.xml)裡面的MapView標籤會有android:apiKey屬性,把剛剛申請到的key填在那邊。

第五點就是平常我們會直接按run把專案安裝到手機裡面,但這邊要先匯出,再用adb安裝到手機內。

阿劉 提到...

可以搂 我裝vm在灌就可以了 還是謝謝瞜~

書局 提到...

請問一下
我在Export Android Application
最後
Destination APK file 的路徑選擇了桌面上去存放~
按下Finish之後出現了一個Export Wizard的警告:

failed to create key: cannot run program "C\jre6\bin\keytool.exe": CreateProcess error = 740, -n"D一串亂碼

我該怎麼辦呢

ola的家 提到...

這個錯誤我沒有遇過,但是我猜應該是權限的問題,"可能"你在執行時需要以"以系統管理員身分執行"這個來開啟cmd與eclipse。

William 提到...

你好,我也發生了看不到地圖的情況。我目前已經利用MD5取得了API金鑰,也將金鑰寫入apiKey,但還是無法正常看到地圖,求救呀~~~感謝

ola的家 提到...

你的問題太籠統了,你可能要先從上面留言的確認順序,逐步確認後才可能抓到原因。

匿名 提到...

請問為什麼我的驗證不是MD5

ola的家 提到...

是SHA1?

增加-v的參數,
將keytool -list -keystore C:\...,
改為keytool -list -v -keystore C:\...。

上面留言有提到。

匿名 提到...

YA~~~看到圖了

匿名 提到...

這個專案是否有用建立的keystore匯出成apk
一定要用這方法?? 有方法可以直接用 RUN AS 去跑嗎

ola的家 提到...

我沒有查到除了該方法的其他安裝方式。

匿名 提到...

YA~~~看到圖了 寫的很詳細 謝謝囉!!!

Aaron 提到...

YA~~~看到圖了!!成功上架了!!3Q

ola的家 提到...

恭喜 :D

Raycao 提到...

請問大大
為了產生key hash所打進cmd的命令語句
我已經做了
可是都會有"找不到msys-crypto-0.9.8.dll,所以無法啟動"
從openssl.exe發出的警告訊息
我不知道怎麼辦耶 有上網找卻找不到這個東西
才疏學淺的問是說一定要key hash嗎??

Raycao 提到...

對不起大大 我發錯地方
是從大大的"Android學習_使用facebook sdk_Part1準備參考"
然後有問題的 相當抱歉!!

Raycao 提到...

我找到缺失的檔案了
說起來有點丟臉
不好意思打擾大大

ola的家 提到...

有解決最重要 :D

匿名 提到...

YA~~~看到圖了, 謝謝

ola的家 提到...

恭喜你呀

匿名 提到...

YA~~~看到圖了

ola的家 提到...

恭喜你呀,看到圖的瞬間真的很讓人興奮。 :D

匿名 提到...

可以請問一下嗎??
小弟已經try過很多次,依然只出現網格
不知道是發生甚麼悲劇了
可以幫忙解答一下嗎??
謝謝

ola的家 提到...

只看到網格的原因可能有很多,最可能的還是取得金鑰的MD5跟最後匯出apk所使用的keystore為不同組。或者,網路有問題。只有這樣的描述很難判斷是什麼原因。

匿名 提到...

不好意思 第5個步驟最後面 要指定目標的APK File 是要指定哪個? 自己創的keystore?

ola的家 提到...

第五個步驟就是利用Export Signed Application Package功能,匯出帶有簽章(keystore)的apk檔案。

流程:
1. 點擊Export Signed Application Package
2. 選擇要匯出的專案
3. 選擇步驟一製作的keystore,並輸入密碼。
4. 輸入主密碼。
5. 完成,得到apk檔。

匿名 提到...

大大 為啥安裝到手機裡面 手機的應用程式裡找不到 可是在管理應用程式那邊 明明就看到已經放入手機了...
是會安裝在手機的哪個地方呢?

ola的家 提到...

這個問題我沒有發生過耶。

匿名 提到...

謝謝你 我剛剛看到圖片了^^
因為我們要報名比賽
剛剛正煩惱要怎麼解決
^^
YA~~~

ola的家 提到...

恭喜你們呀! :D

wbe專用!!! 提到...

請問我在 XML裡面貼上 網頁所給的
但是XML那邊卻是錯誤ㄟ~

ola的家 提到...

所謂的錯誤是?不太懂這個問題。

李育慈 提到...

YA!!!~看到圖了,太感謝你了,原來是沒有執行Export Signed Application Package這個步驟,難怪在手機上面模擬也沒有辦法顯示出完整地圖

謝謝作者囉 :D

ola的家 提到...

恭喜你囉~~~~ :D

王祥宇 提到...

YA~~~看到圖了
原來實機上要另外用adb安裝授權
謝謝大大分享:)

ola的家 提到...

:D

fung Li 提到...

我想請問一下
為什麼我照著上面打
為什麼會出現以下錯誤
"keytool 錯誤:java.io.FileNotFoundException:yku.keystore(存取被拒)
java.io.FileNotFoundException:yku.keystore(存取被拒)
at java.io.FileOutputScream.open(Native Method)
at java.io.FileOutputScream. (FileOutputScream.java:194)
at java.io.FileOutputScream. (FileOutputScream.java:84)
at sun Security.tools.KeyTool.doCommands(KeyTool.java:902)
at sun Security.tools.KeyTool.run(KeyTool.java:172)
at sun Security.tools.KeyTool.main(KeyTool.java:166)

謝謝

ola的家 提到...

右鍵以管理原身份執行應該就可以了。

Chan Sunny 提到...

APK放左手機看不到,但在模擬器可以看到,求解決方法

iam$hiao 提到...

謝謝,剛好幫我複習一下。

方翔 提到...

大大 請問一下
模擬器上有看到地圖
手機上卻看不到 是因為手機要用adb的方式安裝adk嗎

ola的家 提到...

這一個問題有很多可能,但最可能的是你沒有使用對應的keystore匯出成apk,再進行安裝。

陳哲凱 提到...

ola版大 我做完以上六個步驟後 最後在實機的結果是它說"抱歉! googlemap 停止運作"
而且我用eclipse 安裝到手機上時出現了以下警告:

Re-installation failed due to different application signatures.
You must perform a full uninstall of the application. WARNING: This will remove the application data!
Please execute 'adb uninstall com.example.googlemap' in a shell.
Launch canceled!

我也都有爬文 那五點基本上沒有做錯啊
基本上個人API都有設定 (我有整理2組金鑰 一組是手機的個人API 一組是模擬器的API
keystore都是使用自己建立的 不是本身的debug (轉成apk也都用自建的keystore
也有將取得的google map api key寫在xml檔 (MapView.....
adb安裝apk檔案使用DOS 都是成功的啊 (那篇adb安裝apk 我找到了tool的資料夾了!!謝謝
不知道這樣敘述 ola大可不可以替我解惑 @@ 拜託了

陳哲凱 提到...
作者已經移除這則留言。
ola的家 提到...

上面的問題是com.example.googlemap出現衝突,所以移除com.example.googlemap的程式後,再安裝一次即可。

無法執行是僅出現網格嗎? 如果是,即代表key沒有對應上,或是沒有網路。

陳哲凱 提到...

移除com.example.googlemap的程式是啥麼意思?
事在DOS裡 打 adb uninstall com.xxx.xgx 嘛?
可是我剛剛打都是失敗ㄟ (有執行但結果失敗

我的無法執行是連網格的都沒有 無法打開地圖APP
是不是eclipse裡的程式要再打? 我只有將申請下來的Mapview 貼上

ola的家 提到...

就是你手機內已經有一個com.example.googlemap的程式,而重新安裝時出現錯誤,所以先移除手機內的程式,再重新安裝。

無法打開App,那應該是錯在java code的部分,要有錯誤碼才能知道是甚麼原因。(猜測出錯的地方應該跟google map沒關係)

陳哲凱 提到...

喔喔 刪除好像再重跑就不會執行錯誤了
但我有個問題:
我利用adb安裝apk檔案時 跑完後 app就出現在我的手機
所以我再用eclipse執行時 就出現剛剛的錯誤
那我刪掉APP 直接用eclipse執行 那我的APK有裝到手機了嗎?


關於程式碼 我有查書 我有把main.xml寫好
但java檔不知怎麼改 0.0

陳哲凱 提到...

ola大 我程式碼已經OK了 現在跑模擬器 地圖都能顯示
但手機還是不行

問題還是如上: 再用adb 裝apk檔時 裝好後手機就會跑出map的APP
所以導致會有2個檔 使eclipse執行時錯誤
但刪掉 直接執行eclipse APP只會出現網格

到底要是哪個環節出錯了??

陳哲凱 提到...

又是我哈哈 不過這次都看到圖了

原來APK檔直接丟入手機 再用eclipse安裝 就OK了
好像不一定要用DOS安裝


最後還是感謝OLA大的幫助!!!!
我看到圖了~~!!!!!!!!!!!!!!!!!!!

ola的家 提到...

恭喜呀 :D

kenny 提到...

您好,我想問個問題,我好像有看到有Google Map API K第三版出來,說是不用 KEY了 ,請問第三版要怎麼寫才能用上述功能? 3q

ola的家 提到...

你說的第三版應該是指JS版本,與我使用的Google Maps Android API v2不同,當然你也可以藉由webview來接取js版本的google map,但是效果將會比較差一點,就看自己的需求。

kenny 提到...

是的,大大,是我搞錯了,
因為我正在學習 android 的程式,但 看了很多教學,這幾天改了好多次,也申請了 KEY, 但還是都只出現網格,沒有地圖出現,我把那專案寄給您,幫我看看好嗎?

謝謝!

ola的家 提到...

我猜測你的書應該是google map第一版的方式,目前第一版已經不支援了,你應該參考:http://wangshifuola.blogspot.tw/2013/01/androidgoogle-maps-android-api-v2.html這篇文章。

另外如果只出現網格,代表程式碼沒有錯誤,是你申請的key與程式無法對應,你必須檢視自己申請的流程與對應哪裡出了錯。

我建議你直接以上述那篇v2的文章重新自己開一個新專案,以最少的程式碼來測試。

kenny 提到...

還是不行,改了之後 連 Location 都無法取得

如果程式碼沒有錯誤,怎麼 main.xml 中也有要輸入 android:apiKey=""

你有看過,我給的兩個範例程式嗎?

ola的家 提到...

真是不好意思,我目前時間不允許去測試你的專案,我是就你的描述給意見。

因為你提到有出現網格,在我以往的經驗裡出現網格但是沒有地圖,表示keystore沒有對應到google map的key。

你所說android:apiKey的屬性,在v1版的google的確是要放到MapView的tag當中,但是目前已經不再支援v1版了。

所以目前正確的做法就像我上一個回應,你應該"重新"開一個新專案,依照
http://wangshifuola.blogspot.tw/2013/01/androidgoogle-maps-android-api-v2.html這篇的方式,以v2版本來做,之後不管是實機測試或是上架才不會有問題。

kenny 提到...

今天測試了一個晚上,還是不能顯示畫面

只是想再問,如果是KEY有問題,在DDMS 裡面看的到嗎?
如果可以看到,會是如何的顯示呢?

如果有時再回覆吧! 謝謝!

匿名 提到...

測試一個晚上!找到這邊,終於看到地圖了! ya~~~

kenny 提到...

樓上這位很有趣,匿名還打這樣的話語,有趣!

還有版大沒時間就不用回覆了,我已經用 V3版在不用 KEY 的情況下做出來了! 你這裡的資訊,是舊的,必須要更改了!

ola的家 提到...

恭喜。 :D

ola的家 提到...

恭喜你解決了,我也終於搞定一個難關。
但是你的留言可能會造成後面讀到的人誤解android出了Google Maps Android API v3,以下給搞不清楚v2、v3版本的人參考。

----------------------------------
如果以Android來說,可以使用的google map api有兩種,一種是for android的(目前發展到第二版),另一種是for javascript(目前發展到第三版)。

這篇文章是Google Maps Android API第一版的開發方式,而現在最新版本為Google Maps Android API v2(官方網站:https://developers.google.com/maps/documentation/android/),不管是第一版或是第二版都需要產出keystore來跟key相連接。(第二版的開發方式:http://wangshifuola.blogspot.tw/2013/01/androidgoogle-maps-android-api-v2.html)

而javascript在第二版的時候還是需要申請key,但到了第三版則開發成不需要key就可以直接使用,雖然一般都是在網頁上使用,但在android開發裡面也有另一種變通的方法,就是利用webview來包住javascript開發的網頁程式,達到呈現地圖的目的。

哪一種開發模式比較好,就要看自己的需求,開發方式、效能或是操作感覺都不太一樣,這可能要自己感受比較準確。

Google Maps JavaScript API 第三版官方網頁:https://developers.google.com/maps/documentation/javascript/?hl=zh-tw

Google Maps Android API v2官方網頁:https://developers.google.com/maps/documentation/android/

kenny 提到...

寫這類文章,建議把整個範例PO出來說 並不要遺漏任何地方,不然只是讓要學習 Android程式 的人誤解和摸不著方向,浪費時間,謝謝!

李祐瑋 提到...

ola 大大你好 我按照你的方法去申請APIkey,將其放入xml檔案裡
也是出現網格地圖。請問該怎麼處裡?
還有現在API申請的網站已經改成用SHA1申請了。
是否與大大您用MD5申請要差別??

ola的家 提到...

請參考:http://wangshifuola.blogspot.tw/2013/01/androidgoogle-maps-android-api-v2.html

匿名 提到...

我會出現keytool 錯誤:java.io.filenotfoundexception:myname.keystore(存取被拒)...
這是什麼問題??

ola的家 提到...

應該是右鍵以管理原身份執行就可以了。

張櫻馨 提到...

不好意思我先要問我都有按您的方法去做,但我想問v2現在是不是已經停用,改用v3方式網頁顯示,我用v2執行只有出現google字樣跟黃黃的背景,地圖還是沒有載入,這是為什麼?

匿名 提到...

YA~~~看到圖了!!!
大大真的是我的再生父母!!!

張貼留言