-
Постов
55 -
Зарегистрирован
-
Посещение
-
Победитель дней
17
Активность репутации
-
Fedor K получил реакцию от AngryOwl в Как можно реализовать таблицу?
Для таких таблиц лучше ее рисовать на ListView. Пока не видел достойных гридов для Андроид.
Пример реализации:
-
Fedor K получил реакцию от Rusland в Список приложений Android в listbox
Думаю для старта Вам хватит этого sample. Код писал на старой XE7 и сейчас требуются правки, но для понимания подойдет. Если будут вопросы - пишите.
-
Fedor K получил реакцию от Rusland в Работа с намерениями в iOS
Один из вариантов открытия одного приложения из другого - это использование URL schemes (Ярослав давал выше ссылку).
Из приложение А:
//отправка uses Macapi.Helpers, FMX.Helpers.iOS; //делаем намерение открыть URL (по сути тоже самое Intent в Android) SharedApplication.openURL(StrToNSUrl(Url)); Приложение Б (подробнее, хотя немного устарело):
//подписываемся на события if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent); //обработчик function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var lURL : string; begin case AAppEvent of TApplicationEvent.OpenURL : begin lURL := (AContext as TiOSOpenApplicationContext).URL; //реализуем логику end; Как передать файлы я вижу несколько вариантов:
- использовать буфер обмена (класс UIPasteboard - думаю не сложно его использовать в FMX, я им пользовался только в Xamarin, на FMX возможно (нужно проверить) можно использовать FMX.Platform.IFMXClipboardService). Перед открытием URL в "А" - сохраняем картинку/файл в буфер обмена, в "Б" при открытии считываем.
- передавать в URL путь к файлу (это возможно только, если и "А" и "Б" являются приложением одной группы). пример с Object-C.
-
Fedor K получил реакцию от Rusland в Работа с намерениями в iOS
1. TMS iCL
2. DPF- смотрите в сторону TDPFQLPreviewController
3. Ручками, что-то вроде такого (документация apple):
var controller : UIDocumentInteractionController; URL: NSURL; {$ENDIF} path : string; temp : Boolean; begin path := ExtractFilePath(ParamStr(0)) + '/Sample.pdf'; {$IFDEF IOS} URL := TNSUrl.Wrap(TNSUrl.OCClass.fileURLWithPath(StrToNSStr(path))); controller := TUIDocumentInteractionController.Wrap( TUIDocumentInteractionController.OCClass.interactionControllerWithURL(URL)); TNSUrl.Wrap(TNSUrl.OCClass.fileURLWithPath(StrToNSStr(path))); temp := controller.presentOpenInMenuFromRect( WindowHandleToPlatform(self.Handle).View.frame, WindowHandleToPlatform(self.Handle).View,true); {$ENDIF} end;
-
Fedor K получил реакцию от rareMax в Работа с намерениями в iOS
Один из вариантов открытия одного приложения из другого - это использование URL schemes (Ярослав давал выше ссылку).
Из приложение А:
//отправка uses Macapi.Helpers, FMX.Helpers.iOS; //делаем намерение открыть URL (по сути тоже самое Intent в Android) SharedApplication.openURL(StrToNSUrl(Url)); Приложение Б (подробнее, хотя немного устарело):
//подписываемся на события if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent); //обработчик function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var lURL : string; begin case AAppEvent of TApplicationEvent.OpenURL : begin lURL := (AContext as TiOSOpenApplicationContext).URL; //реализуем логику end; Как передать файлы я вижу несколько вариантов:
- использовать буфер обмена (класс UIPasteboard - думаю не сложно его использовать в FMX, я им пользовался только в Xamarin, на FMX возможно (нужно проверить) можно использовать FMX.Platform.IFMXClipboardService). Перед открытием URL в "А" - сохраняем картинку/файл в буфер обмена, в "Б" при открытии считываем.
- передавать в URL путь к файлу (это возможно только, если и "А" и "Б" являются приложением одной группы). пример с Object-C.
-
Fedor K получил реакцию от Pax Beach в Работа с намерениями в iOS
Один из вариантов открытия одного приложения из другого - это использование URL schemes (Ярослав давал выше ссылку).
Из приложение А:
//отправка uses Macapi.Helpers, FMX.Helpers.iOS; //делаем намерение открыть URL (по сути тоже самое Intent в Android) SharedApplication.openURL(StrToNSUrl(Url)); Приложение Б (подробнее, хотя немного устарело):
//подписываемся на события if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent); //обработчик function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var lURL : string; begin case AAppEvent of TApplicationEvent.OpenURL : begin lURL := (AContext as TiOSOpenApplicationContext).URL; //реализуем логику end; Как передать файлы я вижу несколько вариантов:
- использовать буфер обмена (класс UIPasteboard - думаю не сложно его использовать в FMX, я им пользовался только в Xamarin, на FMX возможно (нужно проверить) можно использовать FMX.Platform.IFMXClipboardService). Перед открытием URL в "А" - сохраняем картинку/файл в буфер обмена, в "Б" при открытии считываем.
- передавать в URL путь к файлу (это возможно только, если и "А" и "Б" являются приложением одной группы). пример с Object-C.
-
Fedor K получил реакцию от Равиль Зарипов (ZuBy) в Работа с намерениями в iOS
Один из вариантов открытия одного приложения из другого - это использование URL schemes (Ярослав давал выше ссылку).
Из приложение А:
//отправка uses Macapi.Helpers, FMX.Helpers.iOS; //делаем намерение открыть URL (по сути тоже самое Intent в Android) SharedApplication.openURL(StrToNSUrl(Url)); Приложение Б (подробнее, хотя немного устарело):
//подписываемся на события if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent); //обработчик function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var lURL : string; begin case AAppEvent of TApplicationEvent.OpenURL : begin lURL := (AContext as TiOSOpenApplicationContext).URL; //реализуем логику end; Как передать файлы я вижу несколько вариантов:
- использовать буфер обмена (класс UIPasteboard - думаю не сложно его использовать в FMX, я им пользовался только в Xamarin, на FMX возможно (нужно проверить) можно использовать FMX.Platform.IFMXClipboardService). Перед открытием URL в "А" - сохраняем картинку/файл в буфер обмена, в "Б" при открытии считываем.
- передавать в URL путь к файлу (это возможно только, если и "А" и "Б" являются приложением одной группы). пример с Object-C.
-
Fedor K получил реакцию от Kitty в Как правильно обрабатывать параметры запуска приложения в iOS и Android и открывать нужную форму?
Для Android достаточно в приложении "Дочка" обработать стартовый Intent:
uses System.StartUpCopy, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; ... var Intent: JIntent; lStartIndex : Integer = -1; begin Application.Initialize; Intent := TAndroidHelper.Activity.getIntent; if (Intent <> nil) and (Intent.getExtras <> nil) and Intent.getExtras.containsKey(StringToJString('START_FORM')) then begin lStartIndex := Intent.getExtras.getInt(StringToJString('START_FORM')); end; //создание нужной формы в зависимости от lStartIndex Для мобильных платформ я бы советовал использовать TFrame, вместо TForm, оперирую лишь одной главной формой. Много форм оставьте для VCL.
-
Fedor K получил реакцию от AngryOwl в Как правильно обрабатывать параметры запуска приложения в iOS и Android и открывать нужную форму?
Для Android достаточно в приложении "Дочка" обработать стартовый Intent:
uses System.StartUpCopy, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; ... var Intent: JIntent; lStartIndex : Integer = -1; begin Application.Initialize; Intent := TAndroidHelper.Activity.getIntent; if (Intent <> nil) and (Intent.getExtras <> nil) and Intent.getExtras.containsKey(StringToJString('START_FORM')) then begin lStartIndex := Intent.getExtras.getInt(StringToJString('START_FORM')); end; //создание нужной формы в зависимости от lStartIndex Для мобильных платформ я бы советовал использовать TFrame, вместо TForm, оперирую лишь одной главной формой. Много форм оставьте для VCL.
-
Fedor K получил реакцию от Rusland в Как правильно обрабатывать параметры запуска приложения в iOS и Android и открывать нужную форму?
Для Android достаточно в приложении "Дочка" обработать стартовый Intent:
uses System.StartUpCopy, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; ... var Intent: JIntent; lStartIndex : Integer = -1; begin Application.Initialize; Intent := TAndroidHelper.Activity.getIntent; if (Intent <> nil) and (Intent.getExtras <> nil) and Intent.getExtras.containsKey(StringToJString('START_FORM')) then begin lStartIndex := Intent.getExtras.getInt(StringToJString('START_FORM')); end; //создание нужной формы в зависимости от lStartIndex Для мобильных платформ я бы советовал использовать TFrame, вместо TForm, оперирую лишь одной главной формой. Много форм оставьте для VCL.
-
Fedor K получил реакцию от Равиль Зарипов (ZuBy) в Как правильно обрабатывать параметры запуска приложения в iOS и Android и открывать нужную форму?
Для Android достаточно в приложении "Дочка" обработать стартовый Intent:
uses System.StartUpCopy, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; ... var Intent: JIntent; lStartIndex : Integer = -1; begin Application.Initialize; Intent := TAndroidHelper.Activity.getIntent; if (Intent <> nil) and (Intent.getExtras <> nil) and Intent.getExtras.containsKey(StringToJString('START_FORM')) then begin lStartIndex := Intent.getExtras.getInt(StringToJString('START_FORM')); end; //создание нужной формы в зависимости от lStartIndex Для мобильных платформ я бы советовал использовать TFrame, вместо TForm, оперирую лишь одной главной формой. Много форм оставьте для VCL.
-
Fedor K получил реакцию от x11 в TNotificationCenter. Можно ли изменить иконку?
Иконка изменится внутри приложения в рамах текущего контекста до ее завершения. С других приложений и в системе ничего не поменяется (см. прикрепление).
Чтобы не влиять на другой функционал, достаточно сделать следующее:
//запоминаем ид по умолчанию lDefaultId := TAndroidHelper.Context.getApplicationInfo.icon; //устанавливаем нашу кастомную иконку TAndroidHelper.Context.getApplicationInfo.icon := lId; //создаем локальное уведомление NotificationCenter.PresentNotification(lNotification); //возвращаем обратно TAndroidHelper.Context.getApplicationInfo.icon := lDefaultId; п.с. Если такой вариант не устраивает, всегда можно написать class helper for TBaseNotificationCenter и использовать классы JNotificationCompat_Builder, JNotificationManager, JNotification. Справка из developer.android.com.
-
Fedor K получил реакцию от Rusland в NOTIFICATION_SERVICE перестает работать с андроид 5.0
Необходимо использовать
TJContext.JavaClass.NOTIFICATION_SERVICE вместо
TJActivity.JavaClass.NOTIFICATION_SERVICE Для получения менеджера лучше использовать контекст (данный код работает на версии 4.4 и 5+):
function GetNotificationService: JNotificationManager; var NotificationServiceNative: JObject; begin NotificationServiceNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE); Result := TJNotificationManager.Wrap((NotificationServiceNative as ILocalObject).GetObjectID); end;
-
Fedor K получил реакцию от zairkz в Андроид-фейсбук-вконтакте
При реализации OAuth 2.0 при помощи TWebBrowser главное отследить Redirect. В случае успешной авторизации в URL будет содержаться необходимый токен. Посмотрите в сторону использования вот этих форм (находятся в ..\source\data\rest):
{$IFDEF MSWINDOWS} REST.Authenticator.OAuth.WebForm.Win {$ELSE} REST.Authenticator.OAuth.WebForm.FMX {$ENDIF} У них есть событие:
property OnAfterRedirect: TOAuth2WebFormRedirectEvent read FOnAfterRedirect write FOnAfterRedirect; TOAuth2WebFormRedirectEvent = procedure(const AURL: string; var DoCloseWebView : boolean) of object; Вот обработчик:
procedure TframeAutch.AfterRedirect(const AURL: string; var DoCloseWebView: boolean); var i:integer; Str: string; Params: TStringList; begin i := pos('#access_token=',AURL); if (i>0) then begin Str := AURL; Delete(Str,1,i); Params:=TStringList.Create; try Params.Delimiter:='&'; Params.DelimitedText := Str; token := Params.Values['access_token']; DoCloseWebView := True; finally Params.Free; end; end; end; **Код выше из XE7, сейчас мб что-то изменилось. Использовал такой подход для авторизации в vk, facebook, google+.
***Если нужно, могу сделать демку, но это только на выходных.
-
Fedor K получил реакцию от AngryOwl в Андроид-фейсбук-вконтакте
При реализации OAuth 2.0 при помощи TWebBrowser главное отследить Redirect. В случае успешной авторизации в URL будет содержаться необходимый токен. Посмотрите в сторону использования вот этих форм (находятся в ..\source\data\rest):
{$IFDEF MSWINDOWS} REST.Authenticator.OAuth.WebForm.Win {$ELSE} REST.Authenticator.OAuth.WebForm.FMX {$ENDIF} У них есть событие:
property OnAfterRedirect: TOAuth2WebFormRedirectEvent read FOnAfterRedirect write FOnAfterRedirect; TOAuth2WebFormRedirectEvent = procedure(const AURL: string; var DoCloseWebView : boolean) of object; Вот обработчик:
procedure TframeAutch.AfterRedirect(const AURL: string; var DoCloseWebView: boolean); var i:integer; Str: string; Params: TStringList; begin i := pos('#access_token=',AURL); if (i>0) then begin Str := AURL; Delete(Str,1,i); Params:=TStringList.Create; try Params.Delimiter:='&'; Params.DelimitedText := Str; token := Params.Values['access_token']; DoCloseWebView := True; finally Params.Free; end; end; end; **Код выше из XE7, сейчас мб что-то изменилось. Использовал такой подход для авторизации в vk, facebook, google+.
***Если нужно, могу сделать демку, но это только на выходных.
-
Fedor K получил реакцию от Pax Beach в Андроид-фейсбук-вконтакте
При реализации OAuth 2.0 при помощи TWebBrowser главное отследить Redirect. В случае успешной авторизации в URL будет содержаться необходимый токен. Посмотрите в сторону использования вот этих форм (находятся в ..\source\data\rest):
{$IFDEF MSWINDOWS} REST.Authenticator.OAuth.WebForm.Win {$ELSE} REST.Authenticator.OAuth.WebForm.FMX {$ENDIF} У них есть событие:
property OnAfterRedirect: TOAuth2WebFormRedirectEvent read FOnAfterRedirect write FOnAfterRedirect; TOAuth2WebFormRedirectEvent = procedure(const AURL: string; var DoCloseWebView : boolean) of object; Вот обработчик:
procedure TframeAutch.AfterRedirect(const AURL: string; var DoCloseWebView: boolean); var i:integer; Str: string; Params: TStringList; begin i := pos('#access_token=',AURL); if (i>0) then begin Str := AURL; Delete(Str,1,i); Params:=TStringList.Create; try Params.Delimiter:='&'; Params.DelimitedText := Str; token := Params.Values['access_token']; DoCloseWebView := True; finally Params.Free; end; end; end; **Код выше из XE7, сейчас мб что-то изменилось. Использовал такой подход для авторизации в vk, facebook, google+.
***Если нужно, могу сделать демку, но это только на выходных.
-
Fedor K получил реакцию от Равиль Зарипов (ZuBy) в Андроид-фейсбук-вконтакте
При реализации OAuth 2.0 при помощи TWebBrowser главное отследить Redirect. В случае успешной авторизации в URL будет содержаться необходимый токен. Посмотрите в сторону использования вот этих форм (находятся в ..\source\data\rest):
{$IFDEF MSWINDOWS} REST.Authenticator.OAuth.WebForm.Win {$ELSE} REST.Authenticator.OAuth.WebForm.FMX {$ENDIF} У них есть событие:
property OnAfterRedirect: TOAuth2WebFormRedirectEvent read FOnAfterRedirect write FOnAfterRedirect; TOAuth2WebFormRedirectEvent = procedure(const AURL: string; var DoCloseWebView : boolean) of object; Вот обработчик:
procedure TframeAutch.AfterRedirect(const AURL: string; var DoCloseWebView: boolean); var i:integer; Str: string; Params: TStringList; begin i := pos('#access_token=',AURL); if (i>0) then begin Str := AURL; Delete(Str,1,i); Params:=TStringList.Create; try Params.Delimiter:='&'; Params.DelimitedText := Str; token := Params.Values['access_token']; DoCloseWebView := True; finally Params.Free; end; end; end; **Код выше из XE7, сейчас мб что-то изменилось. Использовал такой подход для авторизации в vk, facebook, google+.
***Если нужно, могу сделать демку, но это только на выходных.
-
Fedor K получил реакцию от AngryOwl в NOTIFICATION_SERVICE перестает работать с андроид 5.0
Необходимо использовать
TJContext.JavaClass.NOTIFICATION_SERVICE вместо
TJActivity.JavaClass.NOTIFICATION_SERVICE Для получения менеджера лучше использовать контекст (данный код работает на версии 4.4 и 5+):
function GetNotificationService: JNotificationManager; var NotificationServiceNative: JObject; begin NotificationServiceNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE); Result := TJNotificationManager.Wrap((NotificationServiceNative as ILocalObject).GetObjectID); end;
-
Fedor K получил реакцию от Brovin Yaroslav в NOTIFICATION_SERVICE перестает работать с андроид 5.0
Необходимо использовать
TJContext.JavaClass.NOTIFICATION_SERVICE вместо
TJActivity.JavaClass.NOTIFICATION_SERVICE Для получения менеджера лучше использовать контекст (данный код работает на версии 4.4 и 5+):
function GetNotificationService: JNotificationManager; var NotificationServiceNative: JObject; begin NotificationServiceNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE); Result := TJNotificationManager.Wrap((NotificationServiceNative as ILocalObject).GetObjectID); end;
-
Fedor K получил реакцию от Brovin Yaroslav в TNotificationCenter. Можно ли изменить иконку?
Иконка изменится внутри приложения в рамах текущего контекста до ее завершения. С других приложений и в системе ничего не поменяется (см. прикрепление).
Чтобы не влиять на другой функционал, достаточно сделать следующее:
//запоминаем ид по умолчанию lDefaultId := TAndroidHelper.Context.getApplicationInfo.icon; //устанавливаем нашу кастомную иконку TAndroidHelper.Context.getApplicationInfo.icon := lId; //создаем локальное уведомление NotificationCenter.PresentNotification(lNotification); //возвращаем обратно TAndroidHelper.Context.getApplicationInfo.icon := lDefaultId; п.с. Если такой вариант не устраивает, всегда можно написать class helper for TBaseNotificationCenter и использовать классы JNotificationCompat_Builder, JNotificationManager, JNotification. Справка из developer.android.com.
-
Fedor K получил реакцию от Kitty в NOTIFICATION_SERVICE перестает работать с андроид 5.0
Необходимо использовать
TJContext.JavaClass.NOTIFICATION_SERVICE вместо
TJActivity.JavaClass.NOTIFICATION_SERVICE Для получения менеджера лучше использовать контекст (данный код работает на версии 4.4 и 5+):
function GetNotificationService: JNotificationManager; var NotificationServiceNative: JObject; begin NotificationServiceNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE); Result := TJNotificationManager.Wrap((NotificationServiceNative as ILocalObject).GetObjectID); end;
-
Fedor K получил реакцию от Kitty в Андроид-фейсбук-вконтакте
Общая схема такая:
1. Регистрация своего приложения в API соцсетей (facebook, vk).
2. Реализуете в своем приложении авторизацию через OAuth 2.0:
- можно использовать легкий вариант через WebBrowser, т.о. образом сразу поддерживая Android/IOS.
- можно сделать красиво, используя "Intent" и "startActivityForResult".
- можно использовать SDK соцсетей, но это совсем другая история...
3. После регистрации сохраняем токен, при помощи которого мы можем через API автоматически постить сообщения. Учитываем здесь время действия токена, периодически его обновляя.
-
Fedor K получил реакцию от Kitty в Андроид-фейсбук-вконтакте
1. Перед подобными вызовами активностей с указанием пакета, всегда рекомендуется проверять наличие их в системе:
//получаем список пакетов, которые могут обработать ваше намерение tempList := TAndroidHelper.Activity.getPackageManager. queryIntentActivities(Intent); //стартуем только в случае наличия пакета if tempList.size > 0 then TAndroidHelper.Activity.startActivity(Intent); 2. При отправке сторонним приложениям файлов (изображения в частности) всегда рекомендуется создавать копию изображения:
а) с УНИКАЛЬНЫМ именем - необходимо для разрешения проблем с кешированием в других приложениях. Например Facebook кеширует по имени и при повторном вызове не обновляет;
б) сохранять нужно в CacheDir, т.к. другим приложениям может попросту не быть доступа к файлу вашего приложения (использование Uri обязательно).
3. Т.к. у подобных приложений шарингом занимаются отдельные активности, то не забудьте про флаги NewTask | ClearTask у намерения.
п.с. Не забудьте потом периодически удалять свой кеш.
-
Fedor K получил реакцию от Rusland в TNotificationCenter. Можно ли изменить иконку?
Иконка изменится внутри приложения в рамах текущего контекста до ее завершения. С других приложений и в системе ничего не поменяется (см. прикрепление).
Чтобы не влиять на другой функционал, достаточно сделать следующее:
//запоминаем ид по умолчанию lDefaultId := TAndroidHelper.Context.getApplicationInfo.icon; //устанавливаем нашу кастомную иконку TAndroidHelper.Context.getApplicationInfo.icon := lId; //создаем локальное уведомление NotificationCenter.PresentNotification(lNotification); //возвращаем обратно TAndroidHelper.Context.getApplicationInfo.icon := lDefaultId; п.с. Если такой вариант не устраивает, всегда можно написать class helper for TBaseNotificationCenter и использовать классы JNotificationCompat_Builder, JNotificationManager, JNotification. Справка из developer.android.com.
-
Fedor K получил реакцию от Kitty в TNotificationCenter. Можно ли изменить иконку?
Иконка изменится внутри приложения в рамах текущего контекста до ее завершения. С других приложений и в системе ничего не поменяется (см. прикрепление).
Чтобы не влиять на другой функционал, достаточно сделать следующее:
//запоминаем ид по умолчанию lDefaultId := TAndroidHelper.Context.getApplicationInfo.icon; //устанавливаем нашу кастомную иконку TAndroidHelper.Context.getApplicationInfo.icon := lId; //создаем локальное уведомление NotificationCenter.PresentNotification(lNotification); //возвращаем обратно TAndroidHelper.Context.getApplicationInfo.icon := lDefaultId; п.с. Если такой вариант не устраивает, всегда можно написать class helper for TBaseNotificationCenter и использовать классы JNotificationCompat_Builder, JNotificationManager, JNotification. Справка из developer.android.com.