一、前言
我们在开发移动端APP的时候,有时可能需要APP能够提供震动功能,以便提醒操作者,特别是ios提供的3D Touch触感功能,操作者操作时会有触感震动,给操作者的感觉很友好。那么,在Delphi的移动端FMX开发中如何实现?
二、验证环境
以下程序代码在Delphi 的11.3上测试通过,注意在android系统中需要设置 Vibrate 权限。
测试设备:
- android:Redmi K30 5G android 11版本
- ios:iPhone 13 Pro Max 15.0.2
以上设备版本测试通过。
三、实现代码
函数说明:
//Param :
// android上:表示震动需要持续的时间,单位是毫秒
// ios上:表示震动的类型
// $FFF 表示震动,
// $5EF(1519)表示3D Touch 中 Peek 震动反馈
// $5F0(1520) 3D Touch 中 Pop 震动反馈
// $5F1(1521)表示连续三次短震
procedure Vibrate(Param : Integer = 0);
全部代码如下:使用时引用uVibrate_IOS_Android.pas单元即可使用上述函数。
{ sensor 2023-12-06
}
unit uVibrate_IOS_Android;
interface
uses
{$IFDEF ANDROID}
Androidapi.JNI.Os,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.Helpers,
Androidapi.JNIBridge;
{$ENDIF}
{$IFDEF IOS}
//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
{$ENDIF}
{$IFDEF IOS}
Const
libAudioToolbox = '/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox';
kSystemSoundID_vibrate = $FFF; //表示震动
Procedure AudioServicesPlaySystemSound( inSystemSoundID: integer ); Cdecl; External libAudioToolbox Name _PU + 'AudioServicesPlaySystemSound';
{$ENDIF}
//Param :
// android上:表示震动需要持续的时间,单位是毫秒
// ios上:表示震动的类型
// $FFF 表示震动,
// $5EF(1519)表示3D Touch 中 Peek 震动反馈
// $5F0(1520) 3D Touch 中 Pop 震动反馈
// $5F1(1521)表示连续三次短震
procedure Vibrate(Param : Integer = 0);
implementation
procedure Vibrate(Param : Integer);
{$IFDEF ANDROID}
Var
Vibrator:JVibrator;
{$ENDIF}
begin
{$IFDEF ANDROID}
if Param = 0 then Param := 300;
Vibrator:=TJVibrator.Wrap((SharedActivityContext.getSystemService(TJContext.JavaClass.VIBRATOR_SERVICE) as ILocalObject).GetObjectID);
// Vibrate for Param milliseconds
Vibrator.vibrate(Param);
{$ENDIF}
{$IFDEF IOS}
if Param = 0 then Param := kSystemSoundID_vibrate;
AudioServicesPlaySystemSound( Param );
{$ENDIF}
end;
end.
参考:How to vibrate iOS and Android phones using FireMonkey and XE8