返回文章列表

Delphi行動開發相機通知與網頁瀏覽技術

本文探討 Delphi 行動開發中相機、通知與網頁瀏覽功能的實作,包含使用 TCameraComponent 錄製影片、TNotificationCenter 傳送通知,以及 TWebBrowser 進行網頁瀏覽。此外,文章也涵蓋瞭如何透過 Delphi 的語言橋接技術存取 Android 和 iOS 的原生

行動開發 Delphi

Delphi 的 FireMonkey 框架提供了一系列元件,方便開發者在行動應用程式中整合相機、通知和網頁瀏覽等功能。利用 TCameraComponent,除了基本的拍照功能外,還能進一步實作影片錄製。TNotificationCenter 則提供簡潔的 API,讓應用程式可以傳送使用者通知,有效提升使用者參與度。而 TWebBrowser 元件則讓應用程式內嵌網頁瀏覽功能變得輕而易舉,方便使用者在應用程式內直接瀏覽網頁資訊。更進一步,Delphi 的語言橋接技術允許開發者直接存取 Android 和 iOS 的原生 API,例如控制裝置振動等硬體功能,讓應用程式更能貼近使用者經驗。FireMonkey 框架的跨平台特性,讓開發者可以使用單一程式碼函式庫,開發同時適用於 Android、iOS 和桌面的應用程式,大幅提升開發效率。

在行動作業系統上使用相機與通知功能

在前兩節中,我們已經瞭解如何在應用程式中使用手機相機拍照並與其他應用程式分享。相機除了拍照外,還可以用於顯示或錄製完整的影片,這將在下一節中介紹。

相機操作

如果我們可以使用動作元件來拍照,那麼在工具調色盤(Tool Palette)中的額外類別(Additional category)中的TCameraComponent元件的作用是什麼?一個簡單的答案是,它可以用來開啟或關閉大多數手機都具備的手電筒功能。更詳細的答案是,它可以用來錄製影片。

FireMonkey函式庫對不同硬體上的多種相機型別提供了通用支援。對底層視訊硬體的實際存取是透過在FMX.Media單元中定義的非可視TCaptureDeviceManager類別來實作的。

程式設計模型遵循與其他平台服務相同的模式。該類別本身是抽象的,但它有一個公開的類別屬性Current,該屬性傳回對給定平台上實際的TCaptureDeviceManager實作的參照。TCaptureDeviceManager類別具有一個Devices陣列屬性,我們可以透過它存取所有可用的捕捉裝置,但也有以下現成的屬性:

  • DefaultAudioCaptureDevice: TAudioCaptureDevice
  • DefaultVideoCaptureDevice: TVideoCaptureDevice

雖然我們可以直接存取DefaultVideoCaptureDevice來實作視訊錄製,但TCameraComponent提供了一個更方便的介面來實作相同的功能。

建立示範應用程式

建立一個用於管理相機和顯示視訊的示範應用程式非常簡單。以下是建立步驟:

  1. 建立一個新的空白多裝置應用程式。將表單的單元儲存為uFormVideo,將整個專案儲存為VideoApp
  2. 在表單上放置一個TToolbar
  3. 在表單上放置一個TCameraComponent
  4. 在表單上放置一個TImage元件,將其對齊到客戶端,並將其重新命名為ImgVideo
  5. 現在,在Toolbar1上放置另一個TCheckbox元件。將其名稱更改為ChkbxCamera,將其文字更改為「Camera Active」,並將其對齊到左側。在其Margin.Left屬性中輸入8,以便核取方塊不會恰好位於表單的邊緣。
  6. 在核取方塊的OnChange事件中,新增以下程式碼以啟動相機:
procedure TFormVideo.ChkbxCameraChange(Sender: TObject);
begin
  CameraComponent1.Active := ChkbxCamera.IsChecked;
end;

為了從相機存取視訊資訊,我們需要處理其OnSampleBufferReady事件,該事件在緩衝區中有新的影像可用時觸發。TCameraComponent類別提供了一個特定的SampleBufferToBitmap方法,可以用來輕鬆顯示緩衝區的內容:

  1. OnSampleBufferReady事件處理常式輸入以下程式碼:
procedure TFormVideo.CameraComponent1SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin
  CameraComponent1.SampleBufferToBitmap(ImgVideo.Bitmap, True);
end;

內容解密:

  • TCameraComponent1SampleBufferReady 事件處理常式負責處理來自相機的新影像緩衝區。當新的影像緩衝區準備就緒時,此事件會被觸發。
  • CameraComponent1.SampleBufferToBitmap(ImgVideo.Bitmap, True); 這行程式碼將影像緩衝區的內容轉換為點陣圖,並將其顯示在 ImgVideo 元件上。第二個引數 True 表示應該保持影像的原始比例。
  1. 儲存所有原始碼檔案並在裝置上執行應用程式。你將看到類別似於圖8.15所示的內容。

使用通知功能

吸引行動裝置使用者使用特定應用程式的最常見方法之一是顯示通知。當有新電子郵件到達或朋友在社群媒體上發布內容時,我們通常會收到通知。點選通知會顯示傳送通知的應用程式。

Delphi 提供了一個 TNotificationCenter 元件,可以用來顯示和回應通知。一個非常常見的使用案例是在應用程式圖示旁邊顯示新通知的數量。這也可以用於未讀電子郵件和未接來電:

  1. 建立一個新的空白多裝置應用程式。將主表單儲存為 uFormNotify,將專案儲存為 NotifyMe
  2. 新增一個工具列,其中包含一個標籤,將其對齊到客戶端,文字為「Delphi Notifications」。
  3. 現在,在表單上放置一個 TNotificationCenter 元件。作為副作用,系統會將 System.Notification 單元新增到表單的 uses 子句中。
  4. 此單元中定義的第一個類別是 TNotification,它被用作表示通知的輕量級物件。如果我們想要顯示通知,首先需要呼叫 TNotificationCenter 類別的 CreateNotification 方法,該方法傳回一個新的 TNotification 物件。在此時,我們需要組態通知的公開欄位。最後一步是將通知物件傳遞給 TNotificationCenter 的方法之一,以立即顯示通知或將其排程在未來或給定的時間間隔內顯示。還有方法可以取消已經排程的通知。

建立通知

  1. 在表單上放置一個按鈕。將其名稱更改為 BtnNotify,將其文字更改為「Notify Me」。
  2. 雙擊按鈕並輸入以下程式碼以顯示來自應用程式的測試通知:
procedure TFormNotify.BtnNotifyClick(Sender: TObject);
var
  N: TNotification;
begin
  N := NotificationCenter1.CreateNotification;
  try
    N.Name := 'MY_APP_NOTIFICATION_1';
    N.Title := 'Notify Me App';
    N.AlertBody := 'This is an important notification from Delphi!';
    NotificationCenter1.PresentNotification(N);

內容解密:

  • N := NotificationCenter1.CreateNotification; 這行程式碼建立了一個新的通知物件。
  • N.Name := 'MY_APP_NOTIFICATION_1'; 設定通知的名稱,用於識別通知。
  • N.Title := 'Notify Me App'; 設定通知的標題,顯示在通知中。
  • N.AlertBody := 'This is an important notification from Delphi!'; 設定通知的主體文字,顯示在通知中。
  • NotificationCenter1.PresentNotification(N); 這行程式碼呈現通知,將其顯示給使用者。

移動裝置網頁瀏覽功能實作

在開發行動應用程式時,內嵌網頁瀏覽功能是一項常見需求。Delphi 的 FireMonkey 框架提供了 TWebBrowser 元件,讓開發者能夠輕鬆實作跨平台的網頁瀏覽功能。

建立基本網頁瀏覽器應用程式

  1. 建立一個新的多裝置應用程式專案,並將表單儲存為 uFormWebBrowser,專案儲存為 WebBrowserApp
  2. 在表單上放置一個 TToolBar 元件,並在其上新增一個 TEdit 元件(命名為 EdtURL)用於輸入網址。
  3. 新增三個 TSpeedButton 元件(分別命名為 SpdbtnBackSpdbtnForwardSpdbtnGo),用於實作瀏覽器的前進、後退和前往功能。
  4. 在表單上放置一個 TWebBrowser 元件(命名為 WebBrowser1),並將其對齊設定為 Client

程式碼實作

procedure TFormWebBrowser.SpdbtnBackClick(Sender: TObject);
begin
  WebBrowser1.GoBack;
end;

procedure TFormWebBrowser.SpdbtnForwardClick(Sender: TObject);
begin
  WebBrowser1.GoForward;
end;

procedure TFormWebBrowser.SpdbtnGoClick(Sender: TObject);
begin
  WebBrowser1.Navigate(EdtURL.Text);
end;

內容解密:

  • TFormWebBrowser.SpdbtnBackClick:當點選「後退」按鈕時,呼叫 WebBrowser1.GoBack 方法,使瀏覽器傳回上一頁。
  • TFormWebBrowser.SpdbtnForwardClick:當點選「前進」按鈕時,呼叫 WebBrowser1.GoForward 方法,使瀏覽器前往下一頁。
  • TFormWebBrowser.SpdbtnGoClick:當點選「前往」按鈕時,呼叫 WebBrowser1.Navigate 方法,並傳入 EdtURL.Text 中的網址,使瀏覽器載入指定的網頁。

跨平台相容性

上述程式碼可以在 iOS 和 Android 裝置上順利執行,展現了 Delphi 在跨平台開發上的強大能力。

使用 Delphi 語言橋接技術存取原生 API

Delphi 提供了語言橋接技術,讓開發者能夠存取不同平台的原生 API。以 Android 為例,開發者可以透過 Java 與 Object Pascal 的橋接,呼叫 Android 的原生功能。

範例:使裝置振動

在 Android 平台上,可以透過呼叫 Vibrator 類別來實作裝置振動。

uses
  Androidapi.JNI.Os,
  Androidapi.JNIBridge,
  Androidapi.Helpers;

procedure VibrateDevice;
var
  Vibrator: JVibrator;
begin
  Vibrator := TJVibrator.Wrap((TAndroidHelper.Context.getSystemService(TJContext.JavaClass.VIBRATOR_SERVICE) as ILocalObject).GetObjectID);
  Vibrator.vibrate(1000); // 振動一秒
end;

內容解密:

  • 首先引入必要的單元,包括 Androidapi.JNI.OsAndroidapi.JNIBridgeAndroidapi.Helpers
  • VibrateDevice 程式用於使裝置振動。
  • 透過 TAndroidHelper.Context.getSystemService 方法取得 VIBRATOR_SERVICE 服務,並將其轉換為 JVibrator 物件。
  • 呼叫 Vibrator.vibrate 方法,使裝置振動指定的時間(此例中為 1000 毫秒,即一秒)。

平台特定功能的存取

Delphi 的語言橋接技術讓開發者能夠充分利用各個平台的原生功能,從而開發出更強大、更具創新的應用程式。儘管這需要對目標平台的 API 有深入的瞭解,但 Delphi 提供的原始碼和豐富的資源使得這項工作變得更加可行。

跨平台開發與行動裝置橋接技術

在行動裝置開發領域中,Delphi與FireMonkey為開發者提供了跨平台開發的強大能力,不僅支援行動裝置,也能擴充套件至桌面應用程式的開發。本章將探討如何使用單一原始碼基礎,開發適用於行動裝置與桌面的應用程式,並介紹如何利用FireMonkey函式庫實作跨平台功能。

行動裝置振動功能的實作

在行動裝置開發中,某些硬體功能如振動效果的實作,需要呼叫特定平台的API。以下分別介紹在Android與iOS平台上實作振動功能的方法。

Android平台上的振動功能

在Android平台上,實作振動功能需要呼叫Java API。Delphi透過Androidapi.Helpers單元提供了取得Java應用程式上下文的介面。具體實作步驟如下:

  1. 使用GetSystemService方法取得VIBRATOR_SERVICE服務。
  2. 透過TJavaGenericImport類別的Wrap方法,將傳回的服務轉換為JVibrator介面。
  3. 呼叫Vibrate方法實作振動效果。
uses
  Androidapi.JNI.Os, Androidapi.JNI.GraphicsContentViewText,
  Androidapi.Helpers, Androidapi.JNIBridge;

var
  AVibrator: JVibrator := TJVibrator.Wrap(
    (SharedActivityContext.GetSystemService(
      TJContext.JavaClass.VIBRATOR_SERVICE) as ILocalObject).GetObjectID
  );
// 振動500毫秒
AVibrator.Vibrate(500);

iOS平台上的振動功能

在iOS平台上,振動功能的實作需要呼叫AudioToolbox框架中的AudioServicesPlaySystemSound函式。首先需要在Delphi中匯入該框架:

  1. 使用SDK Manager啟用AudioToolbox框架。
  2. 使用SdkTransform工具生成對應的Object Pascal程式碼。
uses
  IOSapi.MediaPlayer, IOSapi.CoreGraphics, FMX.Platform,
  FMX.Platform.IOS, IOSapi.UIKit, Macapi.ObjCRuntime,
  Macapi.ObjectiveC, iOSapi.Cocoatypes, Macapi.CoreFoundation,
  iOSapi.Foundation, iOSapi.CoreImage, iOSapi.QuartzCore,
  iOSapi.CoreData;

const
  libAudioToolbox = '/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox';
  kSystemSoundID_vibrate = $FFF;

procedure AudioServicesPlaySystemSound(inSystemSoundID: integer); cdecl;
  external libAudioToolbox Name _PU + 'AudioServicesPlaySystemSound';

procedure TForm1.Button1Click(Sender: TObject);
begin
  AudioServicesPlaySystemSound(kSystemSoundID_vibrate);
end;

跨平台開發的優勢與實踐

FireMonkey提供了豐富的跨平台元件和API,讓開發者能夠使用單一原始碼開發適用於多個平台的應用程式。以下是一些跨平台開發的關鍵點:

  • 使用高階元件和跨平台抽象層,簡化不同平台間的差異。
  • 透過條件編譯(IFDEFs)處理特定平台的程式碼。
  • 利用Delphi提供的工具和函式庫,擴充套件原生功能。

桌面應用程式開發與行動橋接

本章還將介紹如何開發桌面應用程式,以及如何實作桌面與行動裝置之間的互動。主要內容包括:

  • 使用單一原始碼開發適用於桌面和行動裝置的應用程式。
  • 利用FireMonkey的多檢視控制項(MultiView)、資料網格(Data Grids)和佈局控制項(Layout Controls)。
  • 實作桌面與行動裝置之間的應用程式橋接(App Tethering)。

這些技術將幫助開發者更好地利用Delphi和FireMonkey進行跨平台應用程式開發,並擴充套件至桌面與行動裝置的互動應用場景。