顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

Google Flutter 編譯時出現Warning: Mapping new ns to old ns

 在一次Android Studio更新完成後,重新執行指令:flutter run時,出現下列的訊息:

Warning: Mapping new ns ... to old ns ...

在網路找了好久,才找到是Android Studio是以Gradle來建置系統,而出現的Mapping訊息是指版本不一致。

因為我是用Visual Studio Code,所以要開啟Android Studio,在File -> Project Structure內可以找到版本訊息。



接著開啟/projcet/android/build.gradle,並修改dependencies內容,將版本更改,如下改為7.2.1:

classpath 'com.android.tools.build:gradle:7.2.1'

再來開啟/project/android/gradle/wrapper/gradle-wrapper.properties,並修改內容,將版本改為為7.3.3,如下:

distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip

最後執行flutter clean後,再重新執行flutter run,此時就沒有出現Mapping的訊息了。


在Android模擬器中設定指紋

 在測試Flutter的程式時,需要用到指紋的功能,這在實機上是沒有問題的。但是模擬器中要如何設定呢?

因為我們的電腦沒有指紋讀取機,所以沒有辦法設定真實的指紋,但是利用adb可以設定虛擬的指紋資料。

首先執行adb來檢查是否可以連結到模擬機

c:\> adb devices

接著在android模擬器中依照設定指紋的方式來準備設定,如下圖


要按下指紋的這一步,直接輸入語法:adb emu finger touch 自訂ID,如下:
c:\> adb emu finger touch 123

換句話說,就是用指令來取代指紋,之後如果要用指紋解鎖時,如下圖螢幕要解鎖時,
一樣輸入語法:adb emu finger touch 設定ID
例如:adb emu finger touch 123,就可以模擬指紋來解鎖了。



啟動Android Emulator時出現could not detect ADB binary

 我在開啟android Emulator時出現一個訊息如下,主要是說沒有辦法自動發現ADB binary


此時可以在模擬器中手動定ADB的路徑位置,如下圖,先把「Use detected ADB location」的選項取消掉。


取消後就可以手動選擇ADB的路徑如下圖。



Android Emulator在Win10啟動時出現Another emulator is still running

 今天在嘗試學習Fultter時,安裝完Android Studio與設定好emulator後,在命令列執行指令以啟動emulator時出現下列的錯誤:

WARNING | Another emualtor is still running, wait for a sec...

其實訊息明白是說已經有一個emualtor在執行,但是我卻沒有看見任何的emualtor。

在Win 10下,Android是使用qemu_system_x86_64.exe來管理虛擬機,所以開啟工作管理員後,再把qemu_system_x86_64.exe刪掉後就可以了。






Python TOTP、HOTP測試

 一開始接觸OTP是因為註冊一個雲端平台的測試帳號後,開啟兩階段認證的選項,進而產生興趣。


我們的VPN也有啟用兩階段的認證,當然它是商用版。網路上有一套FreeOTP的開源程式,有支援Android與IOS


OTP(one-time password)稱為一次性密碼,又稱動態密碼或單次有效密碼,在一段有效期只能使用一次的密碼。


原本以為需要架設網路服務來產生密碼與認證,但是看了一下FreeOTP官網卻看不到有任何Server端的安裝文件。


原來OTP是不需要網路服務的,OTP用一組金鑰並搭配變數,例如時間,利用演算法讓伺服器端及用戶端可以產生一

樣的密碼,且這組密碼會隨時間變動失效。


目前常見的OTP密碼傳送方式有簡訊與手機APP,簡訊是由服務端(伺服器)產生密碼後,寄送到使用者的手機上,


而APP則是在用戶端(手機)自行產生密碼,再將密碼鍵入伺服器端來認證,這種方式完全不需要網路服務的。


我測試了兩種不同的技術:HOTP與TOTP,程式語言是python,不過網頁也有相關的模組,原理都是一樣的。


Event Base - OATH HOTP:

HOTP 是HMAC-based One-Time Password的簡寫,雜湊函數加密的一次性密碼。

變動因子Counter 值(OTP 的產生次數)每個密碼僅在一次驗證中有效。

公式:OTPc = HOTP(Key,Counter) = Truncate(HMAC-SHA1(Key,Counter))


Time Base - OATH TOTP:

TOTP 是Time-based One-Time Password的簡寫,表示基於時間戳算法的一次性密碼。

由於量以時間為變數因子,所以用戶端和伺服器時間必須保持一樣,否則會產生不一致的密碼。

公式:OTPt = HOTP(Key,Time) = Truncate(HMAC− SHA1(Key,Time))


以下是我實測的過程與自己的一點小小心得,記錄下來。


首先安裝模組,我用的是pyotp

pip install pyotp


金鑰是Base32格式,所以有下列兩種方式可以產生。

1、pyotp.random_base32() => 直接產生一組隨機的金鑰

2、(base64.b32encode(bytearray("abcd", 'ascii')).decode('utf-8') => 指定字串轉換成Base32


python測試HOTP,金鑰是abcdefg:

>>> import pyotp

>>> hotp = pyotp.HOTP('abcdefg') 

>>> hotp.at(2) #產生密碼

'922982'

>>> hotp.verify('922982',2) #驗證密碼

True

>>> hotp.verify('922982',1)

False

>>> hotp.at(3)

'480228'

>>> hotp.verify('922982',2)

True

>>> hotp.verify('480228',3)

True



python測試TOTP,金鑰是abcdefg,目前預設有效期是30秒:

>>> import pyotp

>>> import time

>>> totp = pyotp.TOTP('abcdefg')

>>> totp.now() #利用時間來產生密碼

'153947'

>>> totp.verify('153947') #驗證密碼 

True

>>> time.sleep(30) #等待30秒

>>> totp.verify('153947') #驗證密碼

False

>>> totp.now() #重新產生密碼

'288940'

>>> totp.verify('288940') 

True



測試APP TOTP,金鑰是abcdefg,目前預設有效期是30秒,使用FreeOTP App或Google Authenticator:

pyotp.totp.TOTP('abcdefg').provisioning_uri(name='Test@test.com', issuer_name='TEST App')

>>> 'otpauth://totp/Secure%20App:alice%40google.com?secret=JBSWY3DPEHPK3PXP&issuer=Secure%20App'

將上一步驟的otpauth的字串複製下來,到免費的產生QRCode網站產出QRCode



在手機上開啟FreeOTP App或Google Authenticator,掃描QRCode來註冊,APP每隔一段時間就會產生一組新密碼

驗證密碼的程式下:

>>> import pyotp

>>> atotp = pyotp.TOTP('abcdefg') #金鑰需要一樣的。

>>> atotp.verify('598189') #將手機APP上的密碼鍵入驗證

True

>>> atotp.now() #也可以自行產生一組密碼



所以建立兩階段的程式設計流程應該是這樣:

1、建立一個記錄帳號密碼及key的資料庫

2、依據key來產生一組otpauth註冊碼

3、FreeOPT或Google Authenticator登錄註冊碼

4、使用者開啟程式並輸入帳號及密碼,先檢查帳號密碼無誤,此為第一階認證

5、再到資料庫抓出key值,以及FreeOPT或Google Authenticator產生的密碼放入檢查程式來確認

6、如檢查結果為true,則通過第二階認證,程式就可以回傳認證成功

7、只要把帳號的key值刪掉或改掉,則第二階認證就會失敗,所以控制權在內部人員手上,使用者不必做任何動作。


如果要以簡訊或Mail來傳送TOTP的密碼,則更改上述第5步驟即可

2017臺南古都國際馬拉松APP初次試用

在FB上看見今年(2017)的臺南古都國際馬拉松有上架一款APP,因為覺得新鮮所以就下載來試試。Android的下載位置:點我前往



React Native 環境安裝

React Native 是由 Facebook 推出,用 JavaScript 建立原生 iOS 及 Android App的一種框架。

與 Phonegap、Cordova 不同的是,Phonegap、Cordova 是將 Webview (手機瀏覽器的元件)封裝成 App,讓使用者感覺上是在操作App,而不是使用瀏覽器,所以開發者可以用 Javascript/CSS3/HTML5 等網頁的技術來製作 Web UI 並在手機上執行,原則上可以跨平台而不必重寫程式碼。

React Native 則是主張只需學習一次,就在不同的平台上實作,換句話說,React Native 希望開發者僅使用 Javascript ,就可以在 iOS、Android平台開發出原生的 App,以便享有原生 App 的執行速度與特殊功能。

小米2/2s、紅米Note 4G 取得Root權限

為了修改gps.conf的設定,所以試著解開 Root 權限,剛好手上有小米2s跟紅米Note 4G可以測試。

下載 UPDATE-SuperSU.zip:https://1drv.ms/u/s!ANrqgZk456KOjxQ

手機上要先安裝好第三方的 Recovery 程式,我是安裝 TWRP Recovery。

小米2/2s的TWRP(mi2s-twrp-3.0.2):https://1drv.ms/u/s!ANrqgZk456KOjxQ

紅米Note 4g的TWRP(紅米NOTE4g-TWRP2.8.1.5中文.zip):https://1drv.ms/u/s!ANrqgZk456KOjxQ

下載完zip檔後將壓縮檔解壓,執行 run.bat 並依指示進行即可,小米2/2S、紅米Note 4g的步驟都一樣,可參考:http://blog.twtnn.com/2016/08/note-4gtwrp-recovery.html

接著將UPDATE-SuperSU.zip直接放到手機的目錄上,我是放在Download的目錄。

將手機關機,同時按「音量上」 + 「電源鍵」開機,進入TWRP的主畫面。

點選「Install」後,選擇目錄內的 UPDATE-SuperSU.zip ,將畫面下方的滑桿滑過去就可以安裝了。




最後將手機重開(Reboot)到系統(System),手機會自動安裝 SuperSU 的APP程式,這樣就可以控制Root 的權限。


紅米Note 4G刷TWRP Recovery

TWRP 版本:2.8.0.5簡體中文
解壓後執行run.bat,依說明進行即可刷TWRP Recovery

MiFlash在Win10找不到手機裝置

我有一支紅米Note手機,想要從MIUI 7 升級到 MIUI 8 ,在MIUI的論壇上下載了線刷 Img檔與刷機程式MiFlash。

之前都是以Win 7的系統來做線刷的動作,沒有什麼問題,如今系統已升級為Win 10 x64,卻無法順利線刷。

第一個出現的問題是找不到 qcCoInstaller.dll 。



所以從MiFlash的安裝目錄內準備複製出來,有三個資料夾,系統是x64,那就從amd64複製出來好了。(路徑:Qualcomm\Driver\serial)



將amd64底下qcCoInstaller.dll 複製到與 MiFlash.exe 同目錄內,重新執行 MiFlash.exe,解決了找不到qcCoInstaller.dll的問題。此時卻發生了第二個問題,就是畫面內看不見紅米Note的裝置,按「Refresh」也是找不到。


原本是複製amd64底下的qcCoInstaller.dll ,改為複製i386底下的qcCoInstaller.dll ,重新執行就成功了。




小米2s更新到MIUI 7




小米2s已經用了好多年,之前曾經合併分區並且升級至MIUI v6.7.2.0,一直以來使用上沒有什麼大問題,後來使用另一支被退役下來的紅米Note,就將2s暫時封存在倉庫內。

後來因為玩精靈寶可夢(pokemon go),覺得紅米Note執行起來有些卡卡的,也比較不易放在上衣的口袋,就把小米2s由倉庫中搬出來,因為之前已經升級到MIUI v6,順利下載與執行精靈寶可夢。

Google Play上傳APK錯誤:uploaded a debuggable APK

同事在上傳一個新的APK到Google Play時,出現下圖的錯誤:



這個訊息大致是說我們上傳的APK有開啟debug mode,而基於安全的理由應該要將它關閉。

將AndroidManifest.xml裡的android:debuggable設為false,重新編譯就可以了。

cordova編譯錯誤:uses-sdk:minSdkVersion 7 cannot be smaller

收到google play store寄來的信,內容是app以有安全性問題的舊版cordova編譯,要我將app重新以新版本的cordova編譯或改寫。

因為之前已經把cordova昇級到最新的版本,所以依文件的說明,在我的app專案下執行了下列的指令:
cordova platform update android

順利完成後,要以「cordova build android」重新編譯app時,出現了下列的錯誤:
Error:uses-sdk:minSdkVersion 7 cannot be smaller than version 14 declared in library

於是修改config.xml這個檔案,將minSdkVersion的版本手動修一下:
找到<preference name="android-minSdkVersion" value="7" />將7改為14,重新編譯就成功了。

上傳apk到play store時,出現憑證(key)不一致的錯誤

今天在上傳一個更新版的apk到play store時,出現了下列的錯誤畫面:


訊息說的我的更新版apk使用的憑證(key)與已在play store上的apk憑證(key)不同。

但是我已經忘了當初是用了哪一個ketstore檔的key,所以隨便以一個keystore檔的key來使用,果然還是不行。

找了一些網路的說法,似乎只能重新命名apk並重新發佈,幸好最後有找到當時留下的keystore檔。

查詢keystore的key值:
c:\> keytool -list -v  -keystore c:\my\my-release-key.keystore

找到與play store上一樣key之後,再將apk重新以正確的key編譯後上傳,就成功了。

因為keystore是如此的重要,所以最後好好地將keystore檔備份起來。

Google--Please declare ad status for your Google Play apps

今天收到Google的Mail通知,主旨與內容大致如下:
Please declare ad status for your Google Play apps
By January 11, 2016, you must sign in to the Play Developer Console and declare whether your apps contain ads (such as ads delivered through third party ad networks, display ads, native ads, and/or banner ads).
After this date, the ads declaration will be required to make any updates to your apps.

在Google Developer Console 有對「廣告標籤」的說明
https://support.google.com/googleplay/android-developer/answer/113469#ads

依說明登入Goole play console,在「定價與發佈」選擇APP是否內含廣告



簡單的滑塊拼圖遊戲(網頁版)

以HTML + jQuery開發可以跨不同的平台系統,輔以Cordova編譯可以轉成Android、iOS、Windows Phone的APP程式。

 Android版本(Play商店): https://play.google.com/store/apps/details?id=com.twtnn.puzzle_sample

 原始碼(GitHub): https://github.com/lyhpcha/puzzle_sample

Cordova--簡單的滑塊拼圖APP

Cordova版本:5.1.1

Google Play商店網址:
https://play.google.com/store/apps/details?id=com.twtnn.puzzle_sample

原始碼(GitHub):
https://github.com/lyhpcha/puzzle_sample

Plugin:
E:test\puzzle_sample>cordova plugin list
com.admob.plugin 5.0.4 "AdmobPlugin"
cordova-plugin-whitelist 1.0.0 "Whitelist"

一個以 HTML5 + jQuery Mobile 完成的簡單遊戲,圖片分為9個圖塊,打亂圖形後拿掉第9個圖塊,
以滑塊的方式將圖塊的順序排好即可過關,每個圖塊右上角有位置提示,降低難度。
共有15張圖片,都是在台灣旅行時所拍的照片(非專業攝影,請見諒),會隨機出現不同的圖片。
操作方式很簡單,按下「遊戲開始」就可以開始玩了,有計時與步數,可以知道此次花了多少時間。
這次的APK有加上AdMob的廣告,是以plugin的方式來掛載廣告。



Cordova 加入AdMob的Plugin

Cordova版本:5.1.1
Plugin:http://plugins.cordova.io/#/package/com.admob.admobplugin
GitHub:https://github.com/admob-google/admob-cordova
授權:免費(Apache 2.0)

1、加入AdMob plugin,在命令列下鍵入:
cordova plugin add com.admob.plugin

2、初始化參數,在JS中指定Admob的廣告ID。
ID的格式為ca-app-pub-xxxxxxxxxxxxxxxxxxx/xxxxxxxxxx,
必需先在AdMob上新增廣告單元後就可以取得廣告的ID,
依類型可分為banner(橫幅)與interstitial(換頁),
所以也會有不同的ID值  
admob.initAdmob("admob banner ID","admob interstitial ID");

3、顯示廣告並指定廣告的地址
讓廣告顯示在APP的最上面
admob.showBanner(admob.BannerSize.BANNER,admob.Position.TOP_APP);
讓廣告顯示在APP的最下面
admob.showBanner(admob.BannerSize.BANNER,admob.Position.BOTTOM_APP);
指定廣告的顯示的座標值(x:50、y:150)
admob.showBannerAbsolute(admob.BannerSize.BANNER,50,150);
其他的位置(這部份我有試過TOP_CENTER、BOTTOM_CENTER)
資料是由其他的地方找到的,沒有全部測試過
admob.Position.TOP_LEFT    
admob.Position.TOP_CENTER  
admob.Position.TOP_RIGHT    
admob.Position.LEFT        
admob.Position.CENTER      
admob.Position.RIGHT        
admob.Position.BOTTOM_LEFT  
admob.Position.BOTTOM_CENTER
admob.Position.BOTTOM_RIGHT

4、測試廣告
因為AdMob有嚴格的規定不能自己點擊廣告,就算是誤點也不行,
這樣對於測試程式有很大的風險,為此AdMob有提供測試的方法。
所以plugin也有提供測試廣告的方法,讓開發人員不用膽顫心驚。


5、簡單的範例
下面是一個簡單的廣告範例,可以讓AdMob顯示在APP的最下面
<script>
    admob.initAdmob("ca-app-pub-12345678/1234","");
    var admobParam=new  admob.Params();
    admobParam.isTesting=true;
    admob.showBanner(admob.BannerSize.BANNER,admob.Position.BOTTOM_APP,admobParam);
<script>

程式說明:
初始化,需指定Admob橫幅的ID與換頁的ID,如下列語法,只有橫幅ID,換頁ID為空白
admob.initAdmob("ca-app-pub-12345678/1234","");
var admobParam=new  admob.Params();
啟用admob的測試模式,以免點擊到自己的廣告
admobParam.isTesting=true;
指定廣告顯示在APP的下面,並且指定admobParam的參數值,也就是測試模式
admob.showBanner(admob.BannerSize.BANNER,admob.Position.BOTTOM_APP,admobParam);



Cordova自訂Android的Launcher Icon

Cordova版本:5.1.1
完成一個Android的專案之後,當然要修改預設的Launcher Icon,
不然每個用cordova開發的Icon都是一樣,就沒有變化了。

除了可以用其他的Android Icon編輯程式來直接修改apk的圖示之外,
其實可以修改config.xml來完成自訂Launcher Icon的作業。

我準備了四種不同的尺寸圖檔,而圖檔格式必需是PNG,試過JPG是不行的。
檔名與尺寸分別如下列所示:
xhdpi:icon96.png     96x96
hdpi:icon72.png     72x72
mdpi:icon48.png     48x48
ldpi:icon36.png     36x36


四個PNG圖我是放在「主目錄/res/android」底下,結構如下(不是放在www底下):


用文字編輯器開啟上圖中的comfig.xml,加入下列語法:
<platform name="android">
    <icon src="res/android/icon36.png" density="ldpi" />
    <icon src="res/android/icon48.png" density="mdpi" />
    <icon src="res/android/icon72.png" density="hdpi" />
    <icon src="res/android/icon96.png" density="xhdpi" />
</platform>

重新編譯成apk就可以了,下圖為上傳到手機模擬器後的畫面



參考資料:http://docs.phonegap.com/en/edge/config_ref_images.md.html



jQuery Mobile取消active焦點

jQuery Mobile可以設定ui-btn-active,讓元素可以設定焦點。
但是沒有ui-btn-inactive這種設定,可以取消元素的焦點,
其實可以用removeClass來移除焦點,範例如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" type="text/css" href="css/jquery.mobile-1.4.5.min.css">
  <title>測試</title>
  <script type="text/javascript" src="js/jquery-2.1.4.min.js"></script>
  <script type="text/javascript" src="js/jquery.mobile-1.4.5.min.js"></script>
</head>

<body>
  <div data-role="navbar">
    <ul>
      <li><a href="#" id="li01">測試一</a></li>
      <li><a href="#"  id="li02" class="ui-btn-active">測試二</a></li>
    </ul>  
  </div>

 <input type="button" id="btn01"  value="取消active"></input>
 <script>
   $(document).on('tap','#btn01',function() {
     $('#li02').removeClass($.mobile.activeBtnClass);
  });
</script>
</body>
</html>

AI創作實驗紀錄