:: MVP ::
|
|
:: RSS ::
|
|
|
[Android] Как в run-time получить информацию, указанную в окне "Project->Options->Version Info"?
{for Delphi XE6: Add to "uses" module "Androidapi.Helpers"}
uses
{...,} Androidapi.JNI.JavaTypes, FMX.Helpers.Android,
Androidapi.JNI.GraphicsContentViewText
{$IF CompilerVersion >= 20}, Androidapi.Helpers{$ENDIF};
// В примере показано как получить versionName
procedure TForm1.Button1Click(Sender: TObject);
var
PackageManager: JPackageManager;
VersionPackage, PackageName: JString;
begin
PackageManager := SharedActivity.getPackageManager;
PackageName := SharedActivityContext.getPackageName;
VersionPackage := PackageManager.getPackageInfo(PackageName, 0).versionName;
Label1.Text := JStringToString(VersionPackage);
end;
|
[MacOS] Как изменить прозрачность формы (альфа-канал)?
uses
Macapi.AppKit, FMX.Platform.Mac;
procedure TForm1.Button1Click(Sender: TObject);
var
Wnd: NSWindow;
begin
Wnd := WindowHandleToPlatform(Form1.Handle).Wnd;
Wnd.setAlphaValue(0.5); // Диапазон: 0 .. 1.0
// Узнать значение текущего альфа-канала можно так:
Caption := FloatToStr(Wnd.alphaValue);
end;
|
[MacOS] Как ограничить размер растяжения/сжатия формы?
uses
FMX.Platform.Mac, Macapi.CoreGraphics;
procedure SetFormMinSize(const AForm: TForm; const AMinSize: TSize);
var
MacHandle: TMacWindowHandle;
begin
MacHandle := WindowHandleToPlatform(AForm.Handle);
MacHandle.Wnd.setMinSize(CGSizeMake(AMinSize.Width, AMinSize.Height));
end;
procedure SetFormMaxSize(const AForm: TForm; const AMaxSize: TSize);
var
MacHandle: TMacWindowHandle;
begin
MacHandle := WindowHandleToPlatform(AForm.Handle);
MacHandle.Wnd.setMaxSize(CGSizeMake(AMaxSize.Width, AMaxSize.Height));
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
SetFormMinSize(Self, TSize.Create(500, 500));
SetFormMaxSize(Self, TSize.Create(800, 800));
end;
|
[Android] Как определить, установлено ли приложение или нет?
uses
Androidapi.JNI.GraphicsContentViewText
{$IF CompilerVersion >= 20}, Androidapi.Helpers{$ENDIF};
function IsAppInstalled(const AAppName: string): Boolean;
var
PackageManager: JPackageManager;
begin
PackageManager := SharedActivity.getPackageManager;
try
PackageManager.getPackageInfo(StringToJString(AAppName),
TJPackageManager.JavaClass.GET_ACTIVITIES);
Result := True;
except
on Ex: Exception do
Result := False;
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
if IsAppInstalled('com.google.zxing.client.android') then
ShowMessage('Приложение установлено')
else
ShowMessage('Приложение не установлено');
end;
|
[Windows, MacOS] Как отловить перемещение формы и изменение её размеров?
type
TForm1 = class(TForm)
public
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
end;
{...}
implementation
procedure TForm1.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
inherited;
Caption := Format('L: %d T: %d W: %d H: %d', [ALeft, ATop, AWidth, AHeight]);
end;
|
[Android] Как установить ярлык на домашний экран Android?
uses
Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android, Androidapi.Helpers,
Androidapi.JNI.JavaTypes, FMX.Platform.Android, AndroidApi.JniBridge,
AndroidApi.JNI.App, AndroidAPI.Jni.OS;
procedure InstallShortcut( Action: string );
{$IFDEF ANDROID}
var
ShortcutIntent: JIntent;
addIntent: JIntent;
wIconIdentifier: Integer;
wIconResource: JIntent_ShortcutIconResource;
{$ENDIF}
begin
{$IFDEF ANDROID}
ShortcutIntent := TJIntent.JavaClass.init(SharedActivityContext, SharedActivityContext.getClass);
ShortcutIntent.setAction(TJIntent.JavaClass.ACTION_MAIN);
addIntent := TJIntent.Create;
addIntent.putExtra(TJIntent.JavaClass.EXTRA_SHORTCUT_INTENT,
TJParcelable.Wrap((shortcutIntent as ILocalObject).GetObjectID));
addIntent.putExtra(TJIntent.JavaClass.EXTRA_SHORTCUT_NAME, StringToJString(Application.Title));
addIntent.setAction(StringToJString(Action));
// Получаем идентификатор ресурса иконки
wIconIdentifier := SharedActivity.getResources.getIdentifier(StringToJString('ic_launcher'),
StringToJString('drawable'), StringToJString('com.embarcadero.Project1')); // Имя должно быть указано правильно
wIconResource := TJIntent_ShortcutIconResource.JavaClass.fromContext(SharedActivityContext, wIconIdentifier);
// Устанавливаем значок для ярлыка
addIntent.putExtra(TJIntent.JavaClass.EXTRA_SHORTCUT_ICON_RESOURCE,
TJParcelable.Wrap((wIconResource as ILocalObject).GetObjectID));
SharedActivityContext.sendBroadcast(addIntent);
{$ENDIF}
end;
// Создание ярлыка
// В манифесте должно быть прописано разрежение
//
// На устройствах некоторых производителей (непример Sony) ярлыки можно создать
// до тех пор, пока на экране не закончится свободное место, а устройства от
// ASUS такого не допускают.
procedure TForm1.Button1Click(Sender: TObject);
begin
{$IFDEF ANDROID}
InstallShortcut('com.android.launcher.action.INSTALL_SHORTCUT');
{$ENDIF}
end;
// Удаление ярлыка
// В манифесте должно быть прописано разрежение
//
// Если для приложения создано несколько ярлыков, они будут удалены все сразу.
procedure TForm1.Button2Click(Sender: TObject);
begin
{$IFDEF ANDROID}
InstallShortcut('com.android.launcher.action.UNINSTALL_SHORTCUT');
{$ENDIF}
end;
|
[Android] Как заставить устройство вибрировать?
// В манифесте должно быть прописано разрежение
// <uses-permission android:name="android.permission.VIBRATE" />
// Для этого в Uses Permissions» ставим галочку в пункте «Vibrate».
uses
FMX.Helpers.Android, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os,
Androidapi.Helpers, Androidapi.JNI.App, Androidapi.JNIBridge,
Androidapi.JNI.GraphicsContentViewText;
// Проверяем, поддерживается ли вибрация
procedure TForm1.Button1Click(Sender: TObject);
var
VibratorObj: JObject;
Vibrator: JVibrator;
begin
//VibratorObj := SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_SERVICE);
VibratorObj := SharedActivity.getSystemService(TJContext.JavaClass.VIBRATOR_SERVICE);
if Assigned(VibratorObj) then
begin
Vibrator := TJVibrator.Wrap((VibratorObj as ILocalObject).GetObjectID);
if Assigned(Vibrator) then
if Vibrator.hasVibrator() then
ShowMessage('Вибрация поддерживается!')
else
ShowMessage('Вибрация НЕ поддерживается!')
else
ShowMessage('Вибрация НЕ поддерживается!');
end;
end;
// Включение вибрации
procedure TForm1.Button2Click(Sender: TObject);
var
VibratorObj: JObject;
Vibrator: JVibrator;
begin
//VibratorObj := SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_SERVICE);
VibratorObj := SharedActivity.getSystemService(TJContext.JavaClass.VIBRATOR_SERVICE);
if Assigned(VibratorObj) then
begin
Vibrator := TJVibrator.Wrap((VibratorObj as ILocalObject).GetObjectID);
if Assigned(Vibrator) then
Vibrator.vibrate(1000);
end;
end;
// Вибрация по шаблону
procedure TForm1.Button3Click(Sender: TObject);
function IntArrayToJArray(const Arr: array of Integer): TJavaArray<Int64>;
var
i: Integer;
begin
Result := TJavaArray<Int64>.Create(Length(Arr));
for i := Low(Arr) to High(Arr) do
Result.Items[i] := Arr[i];
end;
var
VibratorObj: JObject;
Vibrator: JVibrator;
begin
//VibratorObj := SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_SERVICE);
VibratorObj := SharedActivity.getSystemService(TJContext.JavaClass.VIBRATOR_SERVICE);
if Assigned(VibratorObj) then
begin
Vibrator := TJVibrator.Wrap((VibratorObj as ILocalObject).GetObjectID);
if Assigned(Vibrator) then
// Первый параметр – массив со значениями.
// Первое значение в массиве означает длительность паузы, второе – длительность вибрации,
// третье – длительность паузы, четвёртое – длительность вибрации и т.д.
// Второй параметр – это число повторов. «-1» значит, что повторять не надо.
Vibrator.vibrate(IntArrayToJArray(
// Тема из "Звездных войн" :)
[0, 500, 110, 500, 110, 450, 110, 200, 110, 170, 40, 450, 110, 200, 110, 170, 40, 500]), -1);
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
VibratorObj: JObject;
Vibrator: JVibrator;
begin
//VibratorObj := SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_SERVICE);
VibratorObj := SharedActivity.getSystemService(TJContext.JavaClass.VIBRATOR_SERVICE);
if Assigned(VibratorObj) then
begin
Vibrator := TJVibrator.Wrap((VibratorObj as ILocalObject).GetObjectID);
if Assigned(Vibrator) then
Vibrator.cancel();
end;
end;
|
[Android] Как определить текущий уровень громкости в приложении?
uses
Androidapi.JNI.JavaTypes, Androidapi.JNI.Media, Androidapi.Helpers,
Androidapi.JNI.App, Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
Shift: TShiftState);
var
AudioObj: JObject;
Audio: JAudioManager;
begin
if (Key = vkVolumeDown) or (Key = vkVolumeUp) then
begin
AudioObj := SharedActivity.getSystemService(TJContext.JavaClass.AUDIO_SERVICE);
Audio := TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID);
lbCurrentVolume.Text := Audio.getStreamVolume(TJAudioManager.JavaClass.STREAM_RING).ToString;
lbMaxVolume.Text := Audio.getStreamMaxVolume(TJAudioManager.JavaClass.STREAM_RING).ToString;
end;
end;
|
Как изменить предпочитаемый графический процессор?
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Используемая канва: ' + Canvas.ClassName);
// • TCanvasD2D - Direct 2D (Win)
// • TCanvasGdiPlus - GDI + (Win)
// • TCanvasGpu - GPU (Все платормы)
// • TCanvasQuartz - Quartz (iOS, OSX)
end;
{$IFDEF MSWINDOWS}
initialization
FMX.Types.GlobalUseDX := False;
// FMX.Types.GlobalUseDXInDX9Mode := False;
// FMX.Types.GlobalUseDXSoftware := False;
FMX.Types.GlobalUseDirect2D := False;
// FMX.Types.GlobalUseGPUCanvas := False;
{$ENDIF}
|
При использовании материала - ссылка на сайт обязательна
|
|