Posts Tagged With: Android

[Android] 編譯給手機與上傳 Google Play – Xamarin for VS2017


話說,兩年前雖然完成開發 Google Play 的 App ,但因為去年在弄 Apple Store 的 App ,使用 Xamarin for Mac ,所以我已經完全忘了如何上傳 Google Play ,為了自己不知道多久後可能還會再上傳,還是自己留個紀錄。

編譯跟封存的步驟參考前一篇:

[Android] 無法正確封存 App – Xamarin for VS2017

這篇直接繼續封存開始。封存時的畫面如下:

編譯後封存中
編譯後封存中

正常完成封存後,畫面右下角可以選散發。在很舊版的 Android 模擬器,這時可以不選散發,直接將封存完成的 apk 拿到模擬器上測試,但目前的版本是不行的,所以一定要選 [散發]。

封存後選散發
封存後選散發

點選 [散發] 後,若是要直接給手機或模擬器用,選 [臨機操作] ,要是要作為正式版上傳 Google Play ,選 [Google Play] 。事實上選 [臨機操作] 的仍可人工上傳到 Google Play ,此外,點選 [Google Play] 的話,只能發布正式版、測試版,不能進行封測,我記得兩年前我在用的時候,應該沒有 [Google Play] 這選項,應該是後來微軟加入,方便開發者上傳用,但以版本管理而言,我個人偏好 [臨機操作] ,這可確保封存的 apk 檔案時間是自己可以掌握的,手上的備份版本與 Google Play 一致,當然影響不大,只是個人偏好而已。

散發通道
散發通道

A. 臨機操作

選取 [臨機操作] 後,要選一個來簽署身分識別,比如說你是用個人名義開發軟體還是用公司名義,或是集團公司可能有很多分公司,原則上這個檔案應該另外保存,如果有另外保存,例如公司共用的身分識別檔案 .keystore,第一次選 [匯入] ,如果從來沒建立過,第一次選 [+] 建立一個新的。建立時可以選擇有效期限,我是建議選長點時間,因為要更新軟體要用同一個身分識別上傳,建立身分識別後,要上傳 Google 取得對應的憑證,這個在網路上找一下,我兩年前做的,我也忘了步驟了,反正這篇重點不在這。

簽署身分識別
簽署身分識別

選擇 [另存新檔] 後,會讓你輸入密碼,必須記得第一次建立時輸入的密碼,否則無法正確簽署身分識別。這裡另存新檔的好處是你能掌握簽署身分識別後的檔案,不像直接上傳 Google Play 的,完全不知道暫存在哪。

輸入身分識別密碼
輸入身分識別密碼

回到 Visual Studio 2017 ,可以看到正在產生簽署身分識別後的 apk 檔案。

散發身分識別寫入中
散發身分識別寫入中

完成後,就可以傳輸到手機安裝,像一般沒有開 Google Play 帳號的 App ,就是把完成後的檔案放在網站上供人下載安裝。由於 Google Play 會對 App 進行檢查,一般來說,還是放上 Google Play 比較令人信賴,至於電視盒那種涉及侵權的軟體,就只能放上網頁供人下載了。

B. 上傳 Google Play

上傳 Google Play 可以把上面完成簽署身分識別的 apk 手動上傳到 Google Play ,也可以讓 Visual Studio 自動上傳,在上面散發通道選擇 [Google Play] 按鈕。

一樣,上傳 Google Play 也要簽署身分識別,不過可以從圖上分辨出是要為了臨機操作還是給 Google Play 使用。

散發到GooglePlay
散發到GooglePlay

密碼輸入的部分就跳過了,這邊由於不選擇存檔位置,所以簽署身分識別後的檔案 VS2017 不會自動幫你保存,如果又碰上 VS2017 的佛性發揮,一切隨緣時,上傳 Google Play 的 App 可能會變得不能安裝執行。

第一次上傳 Google Play 時,要輸入代理帳號:

註冊Google帳號
註冊Google帳號

由於我以前都是人工手動上傳,所以要建立一個新的。選擇步驟 1 的超連結,可在 Google 開發網站註冊一個 OAuth 認證帳號。

建立 Google API OAuth 帳密
建立 Google API OAuth 帳密

在資安的觀念上,不要在非官方的登入口輸入你原始的帳號密碼,即使是 VS2017 ,也不能輸入原始帳密,所以建立一個專用的帳密來登入,這樣也有好處,要是原始帳密進行密碼定期變更,VS2017 的自動登入不用變更,當發現帳密疑似外洩時,把這組帳密從 Google 刪除即可。

可以直接從網頁上複製帳密貼到 VS2017 的對話框,考慮到可能得重灌電腦或是 Visual Studio ,最好還是下載 JSON 保存,未來找帳密比較方便,當然也可以到網頁上查詢。

輸入 Google API OAuth 帳密
輸入 Google API OAuth 帳密

如果已經在 VS2017 註冊過 Google Play 帳戶,上面建立帳號的步驟就可以跳過,當然,如果說開發的軟體有分個人跟公司的話,就點選 [+] 再輸入個人帳號資料即可,有分的話,名稱一定要分出來才好辨識,沒有的話就直接點帳號與 [繼續] 進行下一步。

選取 Google API 帳號
選取 Google API 帳號

由於我要發布正式版,所以選擇生產環境。

GooglePlay 上傳選擇
GooglePlay 上傳選擇

我的目標 API 設為 Android 4.4 (19),在臨機操作不受影響,仍然可以安裝,但是 Google Play 則不接受,被踢掉,錯誤訊息為:

上傳 ‘com.[公司].[軟體]’ 時發生錯誤: Your app currently targets API level 19 and must target at least API level 26. [403]

VS2017 API 版本過低
VS2017 API 版本過低

我懷疑是不是 VS2017 限制,改用手動上傳,確認為是 Google Play 限制,必須改版。Google Play 錯誤訊息則為中文:

上傳失敗
你的應用程式目前的目標 API 等級是 19,但最低目標 API 等級必須為 26,才能確保應用程式採用最新的 API,讓安全性與執行效能達到最佳狀態。請將最低目標 API 等級調整為 26。

Google Play API 版本過低
Google Play API 版本過低

只好將最低目標調整為 Android 8.0(26) ,先做臨機操作,經過測試,Android 4.4 / 7.0 / 8.0 都還能安裝,就重新編譯上傳。

VS2017 上傳 Google Play 中
VS2017 上傳 Google Play 中

上傳完成後,登入 Google Play Console 檢查上傳狀態,可以看到上傳完成就自動發佈,從 Console 到商店更新大概還要 15 分鐘左右,要看商店是否已更新要稍微耐心等候。畫面上一個尚未發佈的版本,是我先前測試 API 19 的版本,再擷圖時尚未刪除,後來已經刪除了。

網頁檢查上傳結果
網頁檢查上傳結果

在 Google Play 商店會顯示目前版本的修改內容,所以最好人工進行編輯,避免使用者對於改版原因產生困惑。

編輯版本修改資訊
編輯版本修改資訊

好了,自己把步驟都記錄下來,希望下次要用的時候,操作方式不變… 不然又要到處上網找如何做了。

廣告
Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[Android] 全螢幕畫面 – Xamarin for VS2017


兩年前開發 Android App 時,習慣使用 Windows 視窗開發的慣例,加上了標題列,考慮視窗盡量大的前提下,有略為縮小標題列,但是我沒想到我有一些 SVG 的展示畫面,是以 FullHD (1920×1080) 來設計,有了標題列與 Android 內建的系統狀態列後,我的展示畫面就會自動縮小,如下,左右有黑邊,上面為我的標題列。

系統狀態列與標題列

在寫 iOS 版本的 App 時,就直接使用全螢幕,就不再加上標題列。配合這次改版,把標題列取消,並且也覆蓋系統狀態列,也就是時間那列沒有了。

在專案屬性中,[Android 資訊清單] > [應用程式佈景主題] 輸入:

@android:style/Theme.NoTitleBar.Fullscreen

全螢幕屬性

另外原先標題列的內容會出現在主畫面做為 App 的名稱,也趁此機會跟 iOS 版本的 App 名稱統一。

變更標題列與軟體顯示名稱

測試了一下,不管直拿、橫拿都能正常全螢幕了。

其實有標題列跟系統狀態列在直拿時還好,影響不大,但是橫拿時,就會佔很大比例的高度,還是移除的好。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[Android] 無法正確封存 App – Xamarin for VS2017


老闆要求修改軟體圖示 (icon) ,去年年底到今年一直無法正確封存 App ,主要是因為一開始一直用 Android Emulator 測不過。

[Android] Android SDK Tools 25.2.5 無法移除 – Xamarin for VS2017

原先在 2017 開發 Android App 時,還用 Visual Studio Emulator For Android 開發,由於主要是使用 HTML5 網頁,只需要一個 WebView 框架,所以完成後,App 就擺一邊了。

去年年底要更新 App 時,才發現 Visual Studio 2017 自動更新後, Visual Studio Emulator For Android 已經不能用了,新的開發要直接使用
Android Emulator ,今天受不了了,找出很舊的實體機 Android 4.4 測後,錯誤訊息不同了:

剖析套件時發生問題

有了錯誤訊息是個好的開始,上網查了,有篇文章說到,有時 VS2017 會不正常,從方案總管那邊,滑鼠右鍵,封存後試試。

封存編譯好的專案

居然這樣後,再下載就能在實體手機跑了,先前到底是死在哪阿?

網頁上說正常後,選單也可以正常跑了,我先前都是從選單跑,先跑重建方案,再跑封存。

選單封存功能

卡了三個月,到底在卡啥?VS2017 修復不知道多少次,我還搞到把 VS2017 全部乾淨移除後重灌,結果居然是莫名其妙的怪狀況。

不過即使實體手機能跑,Android Emulator 還是不能跑,要你何用啊…

Android 4.4 最慘,連執行安裝都不行
Android 7.1 顯示不相容
Android 8.0 顯示未安裝

我真是搞不懂這模擬器是要幹嘛用的,實機能裝,虛擬機都不能裝。

[2019/03/15 新增]

同事發現我把在螢幕上的軟體名稱打錯了,所以我今天重新打開 VS2017,編譯、封存,拿實體機來測試,居然又不能正常封存:

無 Icon

檢查專案屬性,居然 Icon 的設定跑掉了,我就今天打開 VS2017 改個名字而已啊~

改完 Icon 設定,還是不正常:

未安裝應用程式

回想昨天是先在 Android 4.4 上測試成功,先把專案目標 API 設定為 v19 ,再改回 v26,開啟 Android SDK Manager,重新以系統管理員開啟 VS2017 ,到方案總管,重新建置方案後,再重新建置專案、封存專案,又正確可以安裝到行動裝置了。趕快上傳 Google Play 。

Xamarin for VS2017 該不會是佛性編譯器吧?一切看緣分阿~

Categories: 封裝部署, 工作點滴, 技術分享 | 標籤: | 1 則迴響

[Android] Android SDK Tools 25.2.5 無法移除 – Xamarin for VS2017


我 2017 開發的 Android 要小改重新上線,這中間經過 VS2017 多次升級,甚至因為 Win10 1803 導致我重新安裝 VS2017 。

App 可以正常編譯成 .apk ,並經過封存、散發的步驟製成有簽署的 .apk ,但是不論如何,拿到虛擬機或實機跑 App 安裝完成後,都會顯示:

App not installed

一直解決不了,上網搜尋有提到 Android SDK 要整個更新到新版。

但 Android SDK Tools 這部分就是更新不上去,最後是跑完整 uninstall 後,到 Android 官方網站下載新版的 Android SDK Tools

下載完後,解壓縮至:

C:\Program Files (x86)\Android\android-sdk\tools

再從 VS2017 內呼叫 Android SDK 管理員,即可發現 Android SDK Tools 已經升級到最新版,我下載時的版本是 26.1.1 。

不過手動安裝會清除已安裝清單內容,所以所有 SDK 跟 Image 等都需要重新下載安裝,目前我的電腦正在跑,希望這部分搞定後,我的 Android 程式就可以跑了~

結果還是一樣阿~~~

App not installed
Categories: 工作點滴, 技術分享 | 標籤: | 1 則迴響

[H5] 偵測不同裝置的解析度


在 DHTML4 的年代,我常常用 VML 來處理未知螢幕解析度的縮放,到了 HTML5 的年代,當然就是改用 SVG 。

使用 SVG 處理縮放通常希望開啟網頁時,能自動縮放到最佳解析度,Windows 下還好除錯,行動裝置就很麻煩了。

Windows 裝置 IE/Edge 支援縮放,Chrome 則不支援。

原先寫的程式碼多半參考網路上的,各有出處,說法也不同,所以就發生 Android 正常時,iOS 就不正常,iOS 正常時,Android 就不正常。

所以乾脆用個除錯網頁分別讓不同瀏覽器去跑,下表是三個裝置 javascript 抓到的值,其中 IE11 的螢幕解析度 1920×1080 ,螢幕字型 125% (120 DPI) 。

IE11 Android 8.0 iOS 11.4
window.innerWidth 1536 1440 980
window.innerHeight 807 2240 1472
window.outerWidth 1550 360 0
window.outerHeight 878 560 0
window.screenX -7 0 0
window.screenY -7 0 0
window.scrollX undefined 0 0
window.scrollY undefined 0 0
window.pageXOffset 0 0 0
window.pageYOffset 0 0 0
window.devicePixelRatio 1.25 3 3
window.screen.width 1536 360 414
window.screen.height 864 640 736
window.screen.availWidth 1536 360 414
window.screen.availHeight 864 640 736
window.screen.deviceXDPI 120 undefined undefined
window.screen.deviceYDPI 120 undefined undefined
window.screen.logicalXDPI 96 undefined undefined
window.screen.logicalYDPI 96 undefined undefined
window.screen.systemXDPI 120 undefined undefined
window.screen.systemYDPI 120 undefined undefined
window.screen.pixelDepth 24 24 32
window.screen.msOrientation landscape-primary undefined undefined
document.body.clientWidth 1503 964 964
document.body.clientHeight 2555 5674 3201
document.body.scrollWidth 1848 4900 987
document.body.scrollHeight 2555 5695 3243

果然實作才是硬道理,可以得到:

實際解析度寬:window.screen.width * window.devicePixelRatio

實際解析度高:window.screen.height * window.devicePixelRatio

針對 Android 8.0 的分割視窗會發現 window.screen.height 變小,仍可使用 (分割時為 247)

至於最適化 (Auto fitting) 螢幕大小部分,我原先是先在 HTML5 的 HEAD 預埋:

<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, minimum-scale=0.1″ id="metaViewport" />

再透過 javascript 依 svg 圖面大小變更 metaViewport.setAttribute(“content", sViewportContent);

從網頁搜尋到的結果,一般是將 width=設定寬度, height=設定高度

自己整理表格後發現,用 sViewportContent = “initial-scale=" + scaleWidth; 即可。

使用 svg.width / window.screen.width 或 svg.height / window.screen.height 就看設計者要以寬度或高度為目標來調整。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[Android] WebView 啟動時自動調整大小 – Xamarin for VS2017


我的目標網頁有設定在 html5 的 head 有設定下行:

<meta id="metaViewPort" name="viewport" content="width=480px" />

WebView 預設開啟時,並無法正確的映射到這個尺寸,雖然可以在螢幕上點兩下自動縮放到設定大小,但總是要多一手。

因此透過程式碼設定初始化大小,主要就是這句:

MobileBrowser.SetInitialScale(GetDeviceInitScale());

程式碼片段寫在 MainActivity.cs


private int GetDeviceInitScale()
{

// 預設寬度 480d, 100%: 100d
double val = (double) Resources.DisplayMetrics.WidthPixels / 480d * 100d;
return (int)val;

}

protected override void OnCreate (Bundle bundle)
{

base.OnCreate (bundle);

SetContentView(Resource.Layout.Main);

MobileBrowser = FindViewById<WebView>(Resource.Id.MobileBrowser);

//啟用Javascript Enable
MobileBrowser.Settings.JavaScriptEnabled = true;

//支援縮放 ViewPort
MobileBrowser.Settings.LoadWithOverviewMode = true;
MobileBrowser.Settings.UseWideViewPort = true;

// 計算螢幕比例
MobileBrowser.SetInitialScale(GetDeviceInitScale());

MobileBrowser.SetWebViewClient(new CustomWebViewClient());

//載入網址
MobileBrowser.LoadUrl(“http://www.company.com/");

}


這樣開啟 WebView 就會自動縮放到網頁大小了。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[Hyper-V] 在 Visual Studio Emulator For Android 我的虛擬網路設定


我在 Win81 時的 Hyper-V 中,透過 Loopback 網卡來分享 WiFi 給虛擬機用:

[Hyper-V] 我 NB 用的虛擬網卡
https://tlcheng.wordpress.com/2016/02/22/hyper-v-%e6%88%91-nb-%e7%94%a8%e7%9a%84%e8%99%9b%e6%93%ac%e7%b6%b2%e5%8d%a1/

當時的 NB 是效能不是很好,所以一直沒考慮使用 Hyper-V 跑 Android 模擬機,一直用 VirtualBox 來跑 Android 模擬機。

Visual Studio 2015 (VS) 以後,微軟推出了整合 VS IDE 開發環境與模擬機的架構,提高 Android 行動軟體開發速度,沒有安裝 VS 的電腦也可以安裝來跑 Android 模擬機:

Visual Studio Emulator For Android (以下簡稱模擬器)
https://www.visualstudio.com/zh-hant/vs/msft-android-emulator/

當然有安裝 VS 2017 的有內建,VS 2017 內建的版本比上述網站下載的還新。

我開始在 Hyper-V 測試模擬器,一開始就卡在開機中的畫面,不知道啥原因:

卡在開機中的畫面

卡在開機中的畫面

 

Terry Lin 建議我依照下面這篇除錯:

Visual Studio Emulator for Android 疑難排解
https://msdn.microsoft.com/zh-tw/library/mt228282.aspx#NoStart

無法解決問題,之後 Ian Chen 建議我把所有 Virtual Switch 全部砍掉一預設值重建,砍掉前我有看了一下設定後,砍掉重建,重建後我的模擬機就能完成開機,但卻出現不能上網。

Windows Phone Emulator Internal Switch

Windows Phone Emulator Internal Switch

註:後來是因為我的 Windows Phone Emulator Internal Switch 內不知道為啥預設是 169.* 開頭的 IP ,這裡必須是動態取得 IP

一開始無法上網,我依據先前跑 Windows VM 的慣例,把 Microsoft Loopback 網卡設定給 Android 模擬器,但是還是無法上網,Aska Su 建議我用 Hyper-V 建一個 Hyper-V Loopback 內部虛擬網路:

Hyper-V Loopback

Hyper-V Loopback

再把 WiFi 分享給 Hyper-V Loopback 虛擬網卡:

共用 WiFi 給 Hyper-V Loopback

共用 WiFi 給 Hyper-V Loopback

 

我用 Windows VM 測試,也可正常成功。

Hyper-V Loopback 速率 10 Gbps

Hyper-V Loopback 速度

Hyper-V Loopback 速度

比 Microsoft Loopback 網卡 1.2 Gbps 快。

Microsoft Loopback 速度

Microsoft Loopback 速度

 

但是 Android 模擬器仍無法上網。測試各種方案,Android 模擬機都會自動把 Windows Phone Emulator Internal Switch 虛擬網卡自動加入,若是參數不正確,還會自動把前次設定錯誤的網卡刪除。

苦無對策,拜了 google 大神,一般解決方案都是將無線網卡加入第二張 Android 模擬機網卡,這表示我得放棄不將 WiFi 加入虛擬交換器,必須將 WiFi 加入到 Hyper-V 內。

虛擬交換器管理員

虛擬交換器管理員

WiFi 一加入虛擬交換器就會組成網路橋接器,這讓網路管理複雜很多:

網路橋接器

網路橋接器

加入到 Android 模擬機第二張網卡:

WiFi 加到第二張網卡

WiFi 加到第二張網卡

就可正常上網了:

從無線基地台取得實體 IP

從無線基地台取得實體 IP

註:若網路設定錯誤,Android 模擬機仍會自動將無線網卡刪除

成功上網後,摸清楚特性,就測試改用 Hyper-V Loopback 網卡,由於 Hyper-V Loopback 網卡為內部網卡,只要一設定 IP ,例如共用網路變成 192.168.137.1 ,就會造成模擬機無法開機,只有外部網卡能設 IP。因此又回頭使用 Microsoft Loopback 網卡加入虛擬交換器:

Microsoft Loopback 加入第二張網卡

Microsoft Loopback 加入第二張網卡

再將 WiFi 分享給 Microsoft Loopback 虛擬網卡

WiFi 分享給 Microsoft Loopback

WiFi 分享給 Microsoft Loopback

一樣自動被設定為 192.168.137.1

虛擬網段 IP

虛擬網段 IP

讓網路設定變得比較乾淨:

實體網卡好管理

實體網卡好管理

終於,可以把先前的 Microsoft Loopback 網卡分享給 Android 模擬機。

透過 Microsoft Loopback 取得虛擬 IP

透過 Microsoft Loopback 取得虛擬 IP

平常沒有使用 Hyper-V 的時候,我就會停用不相關的網卡,另外重新把 Windows VM 網卡設給 Microsoft Loopback ,反正 1.2 Gbps 也夠我用了,平常就懶得動,直接用同一張須擬網卡就可以,這樣在外沒有無線基地台的情況下,模擬器也可以透過 192.168.137.* 網段與 NB 溝通,恢復到我的習慣工作環境了。

Categories: 工作點滴, 技術分享 | 標籤: | 7 則迴響

[Android] AirDroid 在 Android 6.0 看不到 外部SD卡 – Zenfone 3 ZE520KL


AirDroid 是一套 Android 上很有名的軟體,主要功能是把手機當成一個 Web ,透過 IE11/Chrome 連入後,上下傳檔案或是操作手機,我常常拿來編輯聯絡人、發簡訊 (我喜歡用鍵盤打)、抓照片及錄影。

在 Android 4.4 以後,開始對 Apps 限縮存取 外部 MicroSD 卡的權限,當然山不轉路轉,軟體自有解套,所以 Zenfone 3 一到手我仍然裝上這隻程式,並正確的存取外部SD卡。

Zenfone 3 剛到手的時候,手邊沒有準備 MicroSD 卡,把三年前買給電視盒的 32 GB Class 6 卡先插進去,後來看到一些文章提到,ZenFone 3 支援 4K 錄影,但需要高速卡,就另外買了一張讀取速度到 85 MB UHS-I 64 GB 記憶卡。

本來 32 GB 記憶卡用 AirDroid 滿正常的,但 64 GB 記憶卡在網頁上看到的 外部SD卡 是空白的,沒目錄、檔案,想說原先好像有設定到 MicroSD 卡的磁碟代碼,所以應該是 AirDroid 的設定問題,測了半天,終於搞定。請依以下步驟:

1. 從手機的設定叫出應用程式來。

選取 [應用程式]

選取 [應用程式]

 

選取 [AirDroid]

選取 [AirDroid]

2. 刪除 AirDroid 所有使用的記憶體,這會把 AirDroid 設定都刪除,沒錯,就是要刪除重設。

選取 [儲存空間]

選取 [儲存空間]

 

選取 [清除資料]

選取 [清除資料]

3. 開啟 AirDroid 就如同第一次使用,開到可以讓網頁連入。

第一次啟動 AirDroid

第一次啟動 AirDroid

4. 用網頁連入,這邊使用 Chrome ,點選到 外部SD卡 ,這時候會跳出一個對話框,提醒你要設定。

外部 SD 卡需要授權

外部 SD 卡需要授權

5. 點選 [檔案] [外部SD卡] [完成],注意上方選擇的是 MicroSD ,點選右下角的 [選取] 。

選取 [檔案]

選取 [檔案]

選取 [外部SD卡]

選取 [外部SD卡]

 

選取 [完成]

選取 [完成]

 

選取 [Micro SD]

選取 [Micro SD]

 

選取 [選取] 後的畫面

選取 [選取] 後的畫面

6. 可以發現 Chrome 可以正常存取 外部SD卡了。

正常存取 [外部SD卡]

正常存取 [外部SD卡]

其他:
若不想看到網頁跳出提醒畫面,可直接步驟 3 完作步驟 5 ,再用網頁瀏覽器連接,就可以直接到步驟 6 。
若步驟 6 看到的是空白沒任何檔案,請確定步驟 5 最後選取前是否沒任何檔案,若兩邊一致就沒問題,若有問題的話,回到步驟 1 重作。
另外如果只是隱藏的檔案或是 . 開頭的檔案或目錄名出不來,我還找不到解決方法,好像就是出不來。

Categories: 行動裝置, 技術分享 | 標籤: | 2 則迴響

在WordPress.com寫網誌.

%d 位部落客按了讚: