Faire vibrer un smartphone sous iOS ou Android depuis une application développée avec Delphi

En terme d'expérience utilisateur il y a une chose bien pratique sur les smartphones : la possibilité de les faire vibrer. Bien entendu ça ne fonctionne pas de la même façon sur iOS et Android, chacun ayant sa vision des choses.

Sur Android il est possible de spécifier la durer de la vibration.

Sur iOS il n'est possible que de demander au système de déclencher le vibreur qui s'arrête de lui-même.

Deux politiques différentes mais le résultat est le même : on peut faire bouger un smartphone pour signaler par exemple une erreur à son utilisateur ou une action en attente ou encore le réveiller lorsqu'il s'est assoupi en conduisant (mais dans ce cas il ne devrait pas avoir son smartphone en main).
Les sportifs pourront l'utiliser pour gérer un chronomètre et émettre une vibration au début et en fin des temps d'exercice de leur session d'interval training ou de cross training.

Blague à part passons aux choses sérieuses qui avaient été initialement fournies par David Intersimone sur son blog. Comme vous le verrez ce fut le résultat d'une collaboration internationale.

Je vous propose une version de cette librairie qui fonctionne sur Delphi 10.x (Seattle, Berlin et Tokyo). En effet les noms des unités des API Android et iOS ont quelque peu changé avant ces versions.

En préalable pour Android: dans les options du projet activez l'autorisation "vibrer".

En préalable pour iOS: ajoutez le framework AudioToolbox dans Outils / Options / Gestion des SDK, puis mettez le SDK à jour pour récupérer tous les fichiers nécessaires.

Utilisez ensuite simplement la fonction vibrate() au moment où vous désirez déclencher le vibreur du smartphone sur lequel s'exécute votre application. Si aucun vibreur n'est présent sur l'appareil, rien ne se produira.

unit u_vibrate;

interface

(*
  Permet le déclenchement du vibreur du smartphone.
  basé sur http://community.embarcadero.com/blogs/entry/how-to-vibrate-ios-and-android-phones-using-firemonkey-and-xe8

  Pour Android :
  - activer l'autorisation "vibrate" ou "vibrer" dans les autorisations de l'application

  Pour iOS :
  - ajouter le framework "AudioToolbox" dans le SDK Manager avec comme chemin "$(SDKROOT)/System/Library/Frameworks"

  Pour les autres plateformes :
  - ne rien faire puisqu'elles ne sont pas gérées.

  Liste des mises à jour :
  23/05/2016, Patrick Prémartin : version initiale
*)

/// <summary>Use vibrator's smartphone or tablet (Android / iOS)</summary>
/// <param name="milliseconds">Number of milliseconds the device vibrate for Android. On iOs, there is no delay.</param>
procedure vibrate(milliseconds: cardinal = 500);

implementation

{$IFDEF ANDROID}

uses
  Androidapi.JNI.Os,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.Helpers,
  Androidapi.JNIBridge;
{$ENDIF}
{$IFDEF IOS}

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';
{$ENDIF}

procedure vibrate(milliseconds: cardinal);
{$IFDEF ANDROID}
Var
  Vibrator: JVibrator;
{$ENDIF}
begin
{$IFDEF ANDROID}
  Vibrator := TJVibrator.Wrap
    ((SharedActivityContext.getSystemService
    (TJContext.JavaClass.VIBRATOR_SERVICE) as ILocalObject).GetObjectID);
  Vibrator.vibrate(milliseconds);
{$ENDIF}
{$IFDEF IOS}
  AudioServicesPlaySystemSound(kSystemSoundID_vibrate);
{$ENDIF}
end;

end.

 


Mug Chinese New Year 2023 : year of the rabbitMug Toucan DX dans la baie de Rio