網頁

2021年5月26日 星期三

手機 App 程式設計- AppInventor2 -QR_Code_辨識器

題目

  1. 設計一個 App,可用手機鏡頭掃描 QR Code。
  2. 如果 QR Code 內容的開頭是發簡訊(SMSTO:),那就執行發簡訊的工作,但要判斷若不是發給1922( 防疫專線), 要出現一個對話框,提醒使用者要不要發此簡訊。
  3. 如果 QR Code 內容的開頭是 http ,讓使用者選擇是使用 AppInventor2的瀏覽器或是手機上面已安裝的程式來執行。因為 AppInventor2 的瀏覽器祇能看網頁,但不能下載檔案。
  4. 如果 QR Code 內容不是上述的2 跟3 ,那就當作一般的內容,不做任何事。

根據行政院的說明,傳送的簡訊給1922 ,是傳送至電信業者,費用方面由各大電信自行吸收。而傳送的資料僅供疫調使用,僅會保留28天,並不包含其他細部個人資訊等。
註:簡訊實聯制在2022年4月27日已退場了,可將發簡訊給 1922的功能刪除。

研究動機

  1. 如果祇是辨識 QR Code ,執行發簡訊、瀏覽網頁、秀出內容等工作,使用 LINE 來處理,也太麻煩。
  2. 使用網路上的 QR Code 軟體,怕有惡意軟體在裏面,所以不如自己寫,比較沒有資安疑慮。
執行畫面
( 註:ZenFone 如何截圖 ?同時壓住"電源鍵"&"音量下鍵"1秒 即 完成。)

起始畫面:
掃描 簡訊實聯制的店家,把場所代碼 以簡訊方式發送給 1922 (防疫專線)。

按簡訊,即發送。

電話號碼不是1922。

提示是否要發送,因為這需要簡訊費。

QR Code的內容是網址,使用 AppInventor2 的瀏覽器來瀏覽。

QR Code的內容是網址,但要下載檔案,使用 手機上面已安裝的程式來執行。

選擇一個程式來執行。

此 QR Code的內容不是要發簡訊,也不是要瀏覽網頁!


素材

本 app的 icon (圖示),可自己繪製或網路搜尋。
在Google 輸入關鍵字,如  qrcode icon , 選擇 「圖片」,可找到相關的小圖示。

找到圖片,按下去,再按右鍵,選「另存圖片」,就可使用。但要注意著作財產權。
以下是我設計的 icon:


進入 Appinventor 

Google 輸入 appinventor 。選 「MIT App Inventor」。

選 「Create Apps」。

網址為 :http://ai2.appinventor.mit.edu/

開新專案(project)

Projects / Start new project 。


輸入專案的 名稱,如 qrcode,按 「OK」鈕。

 專案的名稱只能使用大小寫字母、數字及「 _」符號,名稱的第一個字元必須是英文字母,不能使用中文字。

其實可以把前面已做好的簡訊實聯制project 打開。

Projects / My projects。


選 簡訊實聯制的 project ( SMS_Real_Link_Scanner) ,按一下即打開。

Projects / Save projects as,另存新專案,名稱為 qrcode。


Designer (畫面編排)

Screen1(頁面或稱為畫面):

AppName:qrcode,可以改成 「QR Code辨識器」(出現在手機上面的App名稱,可用中文)。

Icon : 可以上傳1個 icon(圖示) (可選背景透明的圖示),此程式在手機上面的App 圖示。

按 「 Upload File」鈕。


按「選擇檔案」。

選一個圖示,按「開啟」。


再按「OK」鈕。

選「Screen1」,右邊Properties(元件屬性)視窗 往下拉,更改 Title (標題)的值為:   QR Code辨識器 (原本為 Screen1)。

Screen1 元件屬性表

元件

類別

屬性

功能

Screen1

 

Title: QR Code辨識器

AppName: qrcode,可以改成為 : QR Code辨識器
(出現在手機上面的App名稱)

Icon :可以上傳1icon圖示。

1Screen元件就是1個頁面(畫面)

HorizontalArrangement1

Layout(介面配置)

AlignVertical:Center:2(垂直置中)

Width:Fill Parent,填滿父元件,自動填滿可用空間。HorizontalArrangement1的父元件為 Screen1。 

水平配置元件,讓裏面的元件可以水平對齊

Button_scan

User Interface(使用者介面)

Text:掃描 QR Code

按鈕

Button_submit

User Interface

Enabled:打勾

Text:發送簡訊給

按鈕

HorizontalArrangement2

Layout(介面配置)

AlignVertical:Center:2(垂直置中)

Width:Fill Parent

水平配置元件,讓裏面的元件可以水平對齊

Label1

User Interface

Text:QR Code 內容:

標籤

TextBox_qrcode

User Interface

Width:Fill Parent

Hint: (清空),不要有提示文字。

Multiline :要打勾,可以多行顯示,不然祇顯示一行,後面的文字看不到。

ReadOnly: 要打勾,不能輸入。

Text: (清空),由程式填入。

文字方塊,可以輸入或顯示文字

HorizontalArrangement_sms

Layout(介面配置)

AlignVertical:Center:2(垂直置中)

Width:Fill Parent

水平配置元件,讓裏面的元件可以水平對齊

Label2

User Interface(使用者介面)

Text:簡訊內容:

標籤

TextBox_sms

User Interface

Width:Fill Parent

Hint: (清空),不要有提示文字。

Multiline :要打勾,可以多行顯示,不然祇顯示一行,後面的文字看不到。

ReadOnly: 要打勾,不能輸入。

Text: (清空),由程式填入。

文字方塊,可以輸入或顯示文字

HorizontalArrangement_browser

Layout(介面配置)

AlignVertical:Center:2(垂直置中)

Width:Fill Parent

水平配置元件,讓裏面的元件可以水平對齊

Button_browser

User Interface

Enabled:打勾

Text:確定瀏覽

按鈕

Button_external_browser

User Interface

Enabled:打勾

Text:使用外部瀏覽器

按鈕

WebViewer1

User Interface

 

網路瀏覽器

BarcodeScanner1

Sensors(感測器)

 

條碼掃描器

可以掃描一維與二維條碼,其中二維條碼又稱為QR Code。

Texting1

Social(社交應用)

 

簡訊元件

Notifier1

User Interface

 

對話框元件(有的稱為通知),出現訊息後自動消失。

Notifier_1922

User Interface

 

對話框元件(有的稱為通知),有「確定」、「取消」二個按鈕。

ActivityStarter1

Connectivity(通訊)

 

活動啟動器,呼叫另一項活動(Activity),此例是呼叫另1個程式。



本例子,所有按鈕的Enabled(啟用) 都用預設值,即打勾,都有作用。跟 簡訊實聯制 的例子不一樣。

元件的Visible(可見性)都用預設值,即打勾,皆為可見。

根據 QR Code的內容,再用程式去設定 其 Visible 是 True(可見)或 False(不可見,即隱藏看不到)。

Button_scan,把 左邊Palette(元件面板) / User interface 中的 Button,拉到工作面板的 Screen1,在右邊的元件清單區,選 Button1,再按 Rename 按鈕,更改名稱為Button_scan,以利在寫程式時,便於判斷這個元件是作什麼用的,不然都是Button1、Button2,不知這些按鈕的用途。
右邊的屬性 Text:掃描 QR Code 。


HorizontalArrangement_sms

BarcodeScanner1(條碼掃描器 )直接從 Sensors (感測器)把 BarcodeScanner,拖曳到 Screen1內,自動掉下去,放在Non-visible components (非可視元件)區內。

Texting1 (Social(社交) )、Notifier1(User Interface)、Notifier_1922(User Interface)、ActivityStarter1(
Connectivity(通訊)) 都是一樣的作法,皆放在Non-visible components (非可視元件)區內。

Notifier_1922 此對話框元件,用來顯示有「確定」、「取消」二個按鈕的對話框。如果使用者按「確定」鈕,才發送簡訊。

ActivityStarter1活動啟動器,呼叫另一項活動(Activity。因為   WebViewer1  (網路瀏覽器)祇能看網頁,不能下載檔案,所以 使用   ActivityStarter 呼叫另 1個程式來執行。

 Blocks(拼塊,程式設計)



----------------------------------------------------------------
說明:
從 Variables (變數),拉出 initialize global to此程式block(拼塊)。
將 name 改名為 :qrcode_content。

global (全域變數)可用在程式中所有程序或是事件程序內。

從 Lists (清單),拉出 create empty list 此 block(拼塊),放在 initialize global qrcode_content to 的後面。

設定  全域變數 qrcode_content  (qrcode 內容) 為空的list (清單) 。
phonenumber : 簡訊發送給對方的電話號碼,先設定為空字串。
-------------------------------------------------------------------------------------

----------------------------------------------------------------
說明:
initialize 此程序,先設定相關元件的可見性為false,即隱藏起來看不到。
qrcode 的內容為空字串。sms (簡訊)內容為空字串。
----------------------------------------------------------------


----------------------------------------------------------------
說明:
執行此App程式,就呼叫本事件。
----------------------------------------------------------------

----------------------------------------------------------------
說明:



因為預設會使用外部QRCode掃描器,但是手機可能沒有安裝此類軟體。所以還是  set barCodeScanner1.useExternalScanner to false,使用App Inventor 內建的 QRcode 掃描器。
----------------------------------------------------------------



----------------------------------------------------------------
說明:
滑鼠移到 result ,停留一下,直到出現 get result,將它移到 to 的後面。

設定 qrcode 文字方塊的文字為掃描後的result 結果。

如果是QR Code 的內容類似下面(簡訊實聯制):
SMSTO:1922:場所代碼:2852 1802 2493 766
本次簡訊實聯限防疫目的使用。

檢查  SMSTO: 是否出現在 QR Code 的內容 的第1個位置,也就是開頭是  SMSTO:。



如果 條件成立,則把 
sms 水平配置元件設為可見,發送簡訊 鈕設為可見。

 將 QR Code 的內容以 :  為分割字元,可分割(split)出 三個字串。
第1個字串 SMSTO
第2個字串 1922
第3個字串 場所代碼:2852 1802 2493 766
本次簡訊實聯限防疫目的使用。

所以使用 qrcode_content 此清單變數儲存這三個字串。



 qrcode_content 的第2個元素為電話號碼。


簡訊內容為 qrcode_content 此清單變數 第3個元素,即 
場所代碼:2852 1802 2493 766
本次簡訊實聯限防疫目的使用。


設定 Button_submit 按鈕上面的文字為 合併 "發送簡訊給\n"和  phonenumber 二個文字為一個文字。
即 發送簡訊給
      電話號碼

\n 是換行的意思。



否則檢查  http 是否出現在 QR Code 的內容 的第1個位置,也就是開頭是 http。


如果條件成立,然後 設定 browser水平配置元件為可見,WebView1 網路瀏覽器 為可見。


否則  Notifier1 的 notice 內容為:此 QR Code的內容不是要發簡訊,也不是要瀏覽網頁!
此訊息短暫出現後消失。
----------------------------------------------------------------

----------------------------------------------------------------
說明:
使用 WebView1 網路瀏覽器 檢視網頁,url(網址)為 qrcode 文字方塊的內容。
----------------------------------------------------------------

----------------------------------------------------------------
說明:
當 使用外部瀏覽器此按鈕被點選後。
活動啟動器,呼叫另一項活動(Activity),此例是呼叫另1個程式。
----------------------------------------------------------------

----------------------------------------------------------------
說明:
send_message程序
PhoneNumber :電話號碼
Message : 簡訊內容
----------------------------------------------------------------

----------------------------------------------------------------
說明:
如果電話號碼不是 1922,則 出現 Notifier_1922 顯示選擇對話框。
訊息為: 合併 "這是發簡訊給" 電話號碼 ",不是防疫專線 1922,確定要發送嗎?"  這三個文字為一個文字。
標題為 :確定要發送。
按鈕1文字 "確定" 。
按鈕2文字 "取消" 。
允許取消為假,因為已有 按鈕2 此取消 按鈕。

----------------------------------------------------------------

----------------------------------------------------------------
說明:
當選擇完成 (使用者按了確定 或取消 )後,如果 使用者按了 "確定" 鈕,則 呼叫 send_message程序。
----------------------------------------------------------------

如何下載 apk 到自己的手機 

Build/App (provide QR code for .apk)

產生 此 apk  的 QR code , 使用手機能辨識  QR code 的程式,如LINE,可下載此 apk程式到手機上,再安裝。

使用 Line 「加入好友」的功能,按 「行動條碼」。


按手機上面的連結,就可下載 寫好的 apk。
再按 「開啟」,「安裝」,安裝apk。

如何下載 apk 到自己的電腦

Build/App (save .apk to my computer)

電腦會自動下載已編譯好的 apk 檔。
從  BlueStacks  此模擬器 開啟 apk,就可執行此 apk。

儲存專案

Projects /Save project ,將專案儲存到 Mit 伺服器上。


測試程式

將寫好的App 安裝在手機上,掃描下面的 QR Code,

如果內容為:
SMSTO:1922:場所代碼:2852 1802 2493 766
本次簡訊實聯限防疫目的使用。

出現 「發送簡訊給1922」按鈕表示程式正確。

掃描下面的 QR Code:

如果內容為:
https://www.ntu.edu.tw

出現 「確定瀏覽」和「使用外部瀏覽器」二個按鈕,表示程式正確。

掃描下面的 QR Code:

如果內容為:
SMSTO:123456789:John,好久不見!

且 按了「發送簡訊給123456789」此按鈕,會出現一個對話方框,「這是發簡訊給 123456789,不是防疫專線 1922,確定要發送嗎?」,使用者可以按「確定」 或 「取消」按鈕。表示程式正確。

掃描下面的 QR Code:
如果內容為:
問世間,情為何物?直教生死相許。
天南地北雙飛客,老翅幾回寒暑。
會出現一個通知訊息,「此 QR Code的內容不是要發簡訊,也不是要瀏覽網頁!」。表示程式正確。

註: QR Code Generator,https://www.the-qrcode-generator.com/

完成作品:qrcode.apk

程式進階

修改 成 可以打電話 、Wifi 自動連線 。
打電話的 QR Code 內容 tel:0422223307
Wifi 連線 QR Code 內容 WIFI:S:<SSID>;T:<wpa|wep|>;P:<password>;;

因為有的 QR Code 產生器會把第一個字串 寫成 小寫或者 大寫,所以程式在判斷時,把 以  : 分割後的第1個字串 ,使用 upcase函數 全轉換為 大寫。

 AppInventor2 沒有 wifi 元件,所以要另外安裝此 擴充元件 ,方法如下:
(註 : android 10 以上,TaifunWiFi 元件已無法 wifi 連線 )

因 Screen1的元件太多,增加 Screen2,把 WebView1 放在 Sceen2內。

測試程式 使用的QR Code

 
電話號碼的 QR Code :
tel:0422223307

註:WiFi QR Code Generator,pure JS WiFi QR Code Generator


產生出來的 WiFi QR Code:
WIFI:S:my;T:WPA;P:1234;;



Designer

Screen1



PhoneCall 是放在 Social(社交應用)此類別內。

Screen2



Block

Screen1












註 : 
  1. 因為有些 qr code 內容是用小寫,所以 應該使用 upcase 函數,把 TextBox_qrcode.Text 轉成為大寫,再來判斷開頭是 SMSTO 、TEL、HTTP、WIFI。
  2. 目前使用 call Texting1.SendMessage,重新編譯後,無法叫出手機原本的簡訊畫面,以至於無法發送簡訊,為何如此,查不到原因。
    可改用 call Texting1.SendMessageDirect,會把簡訊內容直接發送出去,不會先進入手機的簡訊畫面,為了讓使用者知道簡訊已發送出去,可以使用 Notifier1.ShowAlert 加上一些訊息。

Screen2