Delphi XE5 Android 调用手机震动,通过JObject测试是否支持震动

源码如下:

[delphi]view plaincopy

  1. uses
  2. Androidapi.JNI.Os,
  3. Androidapi.JNIBridge;
  4. function GetVibratorArray(const AIntArr: array of Int64): TJavaArray<Int64>;
  5. var
  6. LIndex: Integer;
  7. begin
  8. Result := TJavaArray<Int64>.Create(Length(AIntArr));
  9. for LIndex := Low(AIntArr) to High(AIntArr) do
  10. Result.Items[LIndex] := AIntArr[LIndex];
  11. end;
  12. procedure VibratorTest;
  13. var
  14. LVibratorObj: JObject;
  15. LVibrator: JVibrator;
  16. LJavaArray: TJavaArray<Int64>;
  17. begin
  18. { Vibrator概要:
  19. cancel(): 关闭震动
  20. hasVibrator():检查硬件是否支持
  21. vibrate(long milliseconds): 震动milliseconds毫秒
  22. vibrate(long[] pattern, int repeat):按给定数组震动 }
  23. { 需要开启Vibrator权限 }
  24. // <del>LVibrator := TJVibrator.Create as JVibrator;</del>
  25. { 使用官方推荐方式创建 2014-5-8 update}
  26. LVibratorObj := SharedActivity.getSystemService(
  27. TJContext.JavaClass.VIBRATOR_SERVICE);
  28. LVibrator := TJVibrator.Wrap((LVibratorObj as ILocalObject).GetObjectID);
  29. { 测试手机是否支持震动 }
  30. if not LVibrator.hasVibrator then
  31. begin
  32. ShowMessage('手机不支持震动');
  33. Exit;
  34. end;
  35. { Test procedure vibrate(milliseconds: Int64); cdecl; overload; }
  36. { 效果A: 立即震动 800 毫秒 }
  37. // LVibrator.vibrate(800);
  38. { Test procedure vibrate(pattern: TJavaArray<Int64>; repeat_: Integer); cdecl; overload;
  39. pattern: 为震动数组参数,偶数代表等待时间(ms), 奇数代表震动持续时间(ms)
  40. repeat_: -1: 只震动一遍; > -1: 从Index为 repeat_ 的位置开始重复震动 }
  41. { 创建测试数组 }
  42. LJavaArray := GetVibratorArray([500, 1000, 2000, 3000]);
  43. { 效果B: 等待500毫秒 -> 震动1秒 -> 等待2秒 -> 震动3秒 }
  44. // LVibrator.vibrate(LJavaArray, -1);
  45. { 效果C: 效果B重复震动 }
  46. // LVibrator.vibrate(LJavaArray, 0);
  47. { 取消震动(当手机暗屏或锁屏时会自动取消) }
  48. // LVibrator.cancel;
  49. { 效果D: (等待500毫秒 -> 震动1秒 -> 等待2秒 -> 震动3秒)(先按原顺序震动一遍)
  50. 接着循环 [1000, 2000, 3000]
  51. ->(等待1秒 -> 震动2秒 - > 等待3秒)
  52. ->[等待1秒 -> 等待2秒 ... ]
  53. 这个听上去的效果像( 等待4秒 -> 震动2秒 )}
  54. // LVibrator.vibrate(LJavaArray, 1);
  55. { 效果E: (先按原顺序执行一遍), 接着不会震动(偶数为等待时间) }
  56. // LVibrator.vibrate(LJavaArray, 3);
  57. { 效果F: 当然是报IndexOutBounds异常 }
  58. // LVibrator.vibrate(LJavaArray, {!!!}4);
  59. end;

http://blog.csdn.net/flcop/article/details/13290779