Перейти к содержанию
Fire Monkey от А до Я

mazayhin

Пользователи
  • Постов

    163
  • Зарегистрирован

  • Посещение

  • Победитель дней

    19

Сообщения, опубликованные mazayhin

  1. 21 час назад, Татьяна сказал:

    Как узнать не марку смартфона (Build.Model), а имя устройства (то есть то, как пользователь называет свой мобильник в настройках)?

    Спасибою

    Это будет имя Bluetooth-адаптера.

    //uses System.Bluetooth;
    TBluetoothManager.Current.CurrentAdapter.AdapterName

     

  2. 5 часов назад, Martifan сказал:

    можете дать премию ссылку?

    В ЛС можно спросить, может он довел до ума и выложит сюда.

    То что я делал выкладывать в общий доступ - стыдно, а приводить в нормальный вид - некогда.

     

  3. 7 часов назад, Martifan сказал:

    это маленькая приложения который отправляет запросы от клиента серверу о том что клиентский телефон включен и сколько процент батареи, ничего особенного просто удивился такое странное поведения клиента и подумал может кто то столкнулся таким же проблемой

    То есть команда:

    
    IOHandler.WriteLn(ObjectToJson(ASentObject), IndyTextEncoding_UTF8);

    работал фоновом режиме (когда экран отключен) 

    У @Rusland есть решение с фореграунд-сервисом

  4. 14 минут назад, msccenter сказал:

    Положил сюда:

    image.png.a2966d21939e4e736915a67341efc9c7.png

    Затем выполнил Deploy через кнопочку и получил такой список:

    image.thumb.png.759a2e3ee680e5b6fcba8dc8a350c5df.png

    И получается та же ошибка в приложении про то, что не может загрузить библиотеку libfbclient.so.2.5.8.

    В самом коде надо менять что-то?

    А если до подключения проверить, существует ли файл на устройстве?
     

    if TFile.Exists(TPath.Combine(TPath.GetDocumentsPath, 'libfbclient.so.2.5.8)) then
    	showmessage('Exists')

     

  5. 1 час назад, msccenter сказал:

    Добрый день!

    У меня вот не получается установить подключение к серверу Firebird через приложение Android.

    Я разместил файл libfbclient.so.2.5.8 в папке assets\internal, в меню Project - Deployment указал путь сначала так:

    image.thumb.png.848424ed726058dc833ef615c3ca6fa1.png

    Потом сделал через кнопку image.png.a39efb033b982ece3911ccffd6d19ef3.png так:

    image.thumb.png.d370f0717ae10737ac1d12f8cbb604f6.png

    В самом проекте у меня есть DataModule, в котором есть IBConnection из библиотеки IBDac от Devart.

    Путь к библиотеке я прописал в FormCreate этого модуля так:

    image.png.a58730139ff667ba9710b6b235076d61.png

    Когда пробую подключиться к моему удаленному серверу по IP адресу, то получаю ошибку:

    Cannot load client library: /data/user/0/com.embarcadero.msccMobile/files/libfbclient.so.2.5.8.

     

    Что я делаю не так? Как мне сделать, чтобы подключалось нормально?

    Прошу помочь, только второй день работаю с этим направлением.

    Скорее всего, файл не деплоится.

    Уберите библиотеку из \Android\Release\.... и поместите ее в другое место, к примеру, в корень проекта.

    Заново добавьте в Deployment

  6. 17 часов назад, Aleks133 сказал:

    Всем добрый день. Как в сделать развертывание файлов(например ini или картинки) по адресу:

    /storage/emulated/0/MyFolder/123.ini или 123.jpg (т.е. корень внутренней памяти/моя папка/мой файл)

    пробовал в deployment указать такой путь, но файл не появился.

    и как мне потом с ним работать?какой путь к нему указывать? например так

    image1.Bitmap.LoadFromFile(system.iOUtils.TPath.Combine
    (system.iOUtils.TPath.??????????,'MyFolder/123.jpg'));

    Или как-то иначе?

    Может нужно вообще как-то по другому все это делать?

    Заранее благодарен.

     

    Вот статья, что куда деплоить надо, и как получить доступ к этому

    http://delphifmandroid.blogspot.com/2014/02/deployment-manager.html

  7.  

    В 16.04.2019 в 15:20, Dev сказал:

    если мы в коде укажем что нужно получить разрешение, то приложение будет его запрашивать даже если оно разрешено по умолчанию андроидом

    Хм, по умолчанию не разрешено ничего такого особого, кроме как запуститься. Все выставляется в манифесте и разрешения даются при установке (напр. доступ в интернет). Не разу не видел такого, что бы что-то запрашивало разрешение на то, что можно, указанное в манифесте (да то же интернет). Но увы, возможности проверить нет. И да, все что вы хотите, в манифесте все равно должно быть.

    В 16.04.2019 в 15:20, Dev сказал:

    Вы правы, для ACCESS_WIFI_STATE, CHANGE_WIFI_STATE, CHANGE_WIFI_MULTICAST_STATE не нужны разрешения начиная с Андроид 6, но функции Wifi работать не будут, даже если запросить разрешения у пользователя и он их разрешит

    мне кажется, что вы сам себе противоречите? Хотите использовать WifiManager, разрешения все равно надо запросить, но только при установке - возвращаемся к манифесту.

    Ну а что бы уследить за изменениями, что надо, а что не надо, это уже на  https://developer.android.com все ведь меняется. Указали поддержку более позднего API, извольте соответствовать этому, но и не забывать про старое...

  8. В 06.04.2019 в 21:00, Dev сказал:

    немного разобрался, попробовал demo по это ссылке, оригинал работает, но когда начал со своими разрешениями запускать, программа вылетает при нажатии на кнопку, для меня показалось этот вариант очень тяжелым.
    нашел другой https://github.com/CarlosHe/AndroidPermission 
    здесь все понятно расписано что куда разложить по папкам и сам код примера более прозрачный для моих знаний.
    но опять загвоздка, нет тех разрешений которые мне нужны в файле FMX.Permissions.Android.pas

    ACCESS_WIFI_STATE

    CHANGE_WIFI_STATE

    CHANGE_WIFI_MULTICAST_STATE

    есть только эти:

    
    TAndroidPermission = (apREAD_CALENDAR, apWRITE_CALENDAR, apCAMERA, apCONTACTS, apREAD_CONTACTS, apWRITE_CONTACTS, apGET_ACCOUNTS, apLOCATION,
        apACCESS_FINE_LOCATION, apACCESS_COARSE_LOCATION, apMICROPHONE, apRECORD_AUDIO, apPHONE, apREAD_PHONE_STATE, apREAD_PHONE_NUMBERS, apCALL_PHONE,
        apANSWER_PHONE_CALLS, apREAD_CALL_LOG, apWRITE_CALL_LOG, apADD_VOICEMAIL, apUSE_SIP, apPROCESS_OUTGOING_CALLS, apSENSORS, apBODY_SENSORS, apSMS,
        apSEND_SMS, apRECEIVE_SMS, apREAD_SMS, apRECEIVE_WAP_PUSH, apRECEIVE_MMS, apSTORAGE, apREAD_EXTERNAL_STORAGE, apWRITE_EXTERNAL_STORAGE);

    я добавил в этот файл свои, приложение собирается, но при нажатии на кнопку не реагирует, не вылазит окно с запросом разрешения.
    поковырялся и нашел в папке Lib Студии эти два файла, FMX.Permissions.Android.dcu, FMX.Permissions.Android.o. открыл их в блокноте и обнаружил что там есть перечисленные разрешения которые есть pas файле.
    Можно как то изготовить эти два файла уже с моими добавленными разрешениями на основе этого FMX.Permissions.Android.файла? или это вобще бред, выкинуть все с головы и не тратить время

    Странно, что смогли разобраться с тем, что надо заменять в папках студии, ну и подключать уже кастомное активити в манифесте.

    Из DW надо подключить только пару файлов и все.

    Вы в манифесте добавили эти разрешения?

    И да, запрашивать у пользователя их не надо (потому, думаю, запрос и не выдает система). Для всех ваших разрешений указано Protection level: normal. Запрос нужен для тех, что dangerous.

    https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_WIFI_STATE и далее по тексту

    https://developer.android.com/guide/topics/permissions/overview (If your app lists normal permissions in its manifest (that is, permissions that don't pose much risk to the user's privacy or the device's operation), the system automatically grants those permissions to your app. )

  9. В 03.04.2019 в 16:51, Dev сказал:

    В приложении нужен доступ к WiFi, соответственно используются разрешения Access WiFi State, Change wifi multicast state, Change wifi state.

    Tokyo 10.2.3.

    В шаблон AndroidManifest.template.xml: вставляю эту строку  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="26" />, поскольку в конечном итоге приложение нужно разместить в play market, но с этой строкой после запуска приложение никак не реагирует на функции связанные с Wifi, если оставляю строку по умолчанию <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />, то всё работает.
    В Rio вроде из коробки target 26, но для Rio еще не завезли компонент который используется в приложении и неизвестно когда будет.
    Понимаю что это связанно с новыми правилами разрешений, но может есть какой-то способ заставить работать в Tokyo со строкой обманкой targetSdkVersion="26" ?

    Ставьте целевой уровень 26 и используйте KastriFree https://github.com/DelphiWorlds/KastriFree

  10. 13 часов назад, serser сказал:

     

    Получается Segmentation fault

     PIntent  на момент присваивания = nil

    И это явно не простое присваивание, потому что во время него 10 раз в логе пишется switching thread, потом появляется эксепшн.

     

    Передаю интент в сервис так:

    
    class procedure TssAndroidServiceHelper.StartService(const AServiceName: string; AIntent: JIntent);
    var
      PendingIntent: JPendingIntent;
    begin
      PendingIntent := TAndroidHelper.Activity.createPendingResult(1, AIntent, 0);
    
      AIntent.setClassName(TAndroidHelper.Context.getPackageName(),
        TAndroidHelper.StringToJString(AServiceName));
    
      AIntent.putExtra(StringToJString('q'), JParcelable(PendingIntent));
    
      TAndroidHelper.Activity.startService(AIntent);
    end;

     

    Получаю так:

    
    TDM = class(TAndroidService)
        function AndroidServiceStartCommand(const Sender: TObject;
          const Intent: JIntent; Flags, StartId: Integer): Integer;
        procedure AndroidServiceCreate(Sender: TObject);
      private
        FPIntent: JPendingIntent;
        FStr: string;
        FThread: TssThread;
        procedure StartThread;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      end;
    
    function TDM.AndroidServiceStartCommand(const Sender: TObject;
      const Intent: JIntent; Flags, StartId: Integer): Integer;
    var
      ResultIntent: JIntent;
      Parcelable: JParcelable;
    begin
      Parcelable := Intent.getParcelableExtra(StringToJString('q'));
      FPIntent := JPendingIntent(Parcelable);
    
      ResultIntent := TJIntent.Create;
      ResultIntent.putExtra(StringToJString('res'), StringToJString('content'));
      FPIntent.send(TAndroidHelper.Context, 7, ResultIntent);
    
      Result := TJService.JavaClass.START_STICKY;
    end;

     

    Есть еще идеи как вытащить отложенное намерение?

     

    Опять же, повторюсь, нет возможности проверить, и особо времени нет вникнуть. Только, кажется, все немного усложнили вы себе с этой посылкой.

    У PendingIntent есть метод readPendingIntentOrNullFromParcel(Parcel in)  который как раз вычитывает его из посылки.

    Напрямую да, не получится привести их.

     

     

  11. 59 минут назад, serser сказал:

    Помогите достать JPendingIntent из JIntent.

    Пытаюсь из сервиса получить отложенный интент, созданный с помощью TAndroidHelper.Activity.createPendingResult.

     

    Делаю так:

    var

      Parcel: JParcelable;
      PIntent: JPendingIntent;

    begin

    Parcelable := Intent.getParcelableExtra(StringToJString('pendingintent'));

    PIntent := Parcelable ;

    ...

    end;

    Получается ошибка:

    E2010 Incompatible types: 'JPendingIntent' and 'JParcelable'

    Как приводить эти интерфейсы друг к другу?

     

    Проверить возможности нет, но скорее всего

    PIntent := JPendingIntent(Parcelable);

  12. 2 часа назад, Евгений Корепов сказал:

    Кстати в каком то приложении видел что по кнопке открываются настройки приложений - удобно, но как интересно это сделать?

    Использовать LocationSettingsReqest, транслировав его. Но или устаревшее SettingsApi.

    К сожалению нет возможности самому посмотреть и воспроизвести это все, временно нет подходящего аппарата

  13. 6 часов назад, Heinrich сказал:

    Это очень странно как раз. Если вы выгрузили приложение, то почему оно висит в процессах и жрёт тем самым ресурсы? Закрыть приложение - да это более чем стандартное поведение для пользователя той или иной программы. Delphi использует Android NDK, стало быть в нём нет таких возможностей?

    Ну это вопросы к разработчикам системы, почему они решили что то, что пользователь закрыл, должно из памяти выгружаться системой (да, оно висит в recent, но на деле может быть выгружено - это вы видите, когда запускаете снова от туда, и все данные и состояние теряется.) JNI тут не причем. 

    Почитайте первоисточник (доки по андроиду от гугла, про жц активити. Оно одно, обычно, для всего приложения на делфи)

    Ну и попробуйте "закрыть" тот же навигатор гугла. Что будет? - поделитесь результатом

  14. 3 часа назад, Heinrich сказал:

    Здравствуйте.

    Вопрос такой, как выгрузить приложение из памяти? При вызове Close приложение просто сворачивается и при нажатии на кнопку отображения приложений каскадно оно по прежнему видно и к нему можно вернуться.

    MainActivity.finish; не помогает. Приложение не выгружается.  Halt(0) сворачивает приложение несколько по иному, но оно всё равно остаётся в процессах висеть. При чём, когда его вызываешь, происходит его перезапуск. Очищаются се данные. которым оно обладало после работы. Так же не понятно, как убрать при старте временно появляющиеся изображение этого самого огонька (факела). Я указал свои изображения во всех разрешениях (Launcher Icon)  и (Splash Image)  в виде PNG необходимого разрешения и эти изображения легли в финальный APK, как и положено, и в программах моя программа имеет правильную и конку, но при старте проскакивает этот факел и потом приложение запускается. Отключение галки Include Splash Image ничего не меняет. Работаю в RAD XE8 Delphi. Проверяю на адндроид устройстве с версией ОС 7.

    Кто со всем этим сталкивался и как поборол?

     

    Первым делом, конечно, обновиться.

    Люди пишут что https://developer.android.com/reference/android/app/Activity.html#finishAndRemoveTask()

    Но сам не проверял (может завтра), ну и флаг для активити в манифесте 

    android:autoRemoveFromRecents="true"/>

     

  15. Пример во вложении. Первым делом надо сделать Init.

    Пример написан как попало, все надергано кусками, к сожалению.

    Если кто-нибудь доведет до ума, и выложит на форум - будет замечательно!

    Обратите внимание - операция CreateRSAEntry - длительная, чем больше ключ, тем дольше. В тесте после нажатия на кнопку подвиснет на пару секунд.

    Шифрованные строки в примере надо смотреть в logcat. Так же для AES туда выведен вектор IV.

    Преобразование в/из base64 - нативное.

     

     

    KeyStore.zip

  16. 2 минуты назад, #WAMACO сказал:

    Я думаю, что многие скажут спасибо, если Вы выложите сюда пример! Очень полезно! :))

    Ок! А если кто нибудь листнер на java для сканера отпечатков напишет, что б колбэк в делфи прокинуть, то покажу и работу со сканером....

  17. В 27.02.2019 в 07:13, Женя сказал:

    В визуал студии в Xamarin есть такой класс -Java.Security.KeyStore Class, этот класс(как я понял) отвечает за подключение к хранилищу ключей  андроида,короче говоря Android keystore system .

    А вот как  достучаться до этой функции  в с++builder ?Я хочу сделать привязку  приложения  через  Android keystore system ,а как это сделать в Rad  студии не знаю

    Я могу отправить пример работы с кейстором, и шифрование/расшифровка на симметричном и асимметричном ключах из стора, но он для делфи. Вроде, к билдеру можно подключить. Разберетесь?

  18. По идее да. Разбирайтесь :)

    Все что было связано с изначальным вопросом я дал, работайте как в АС, от fmx по части работы с сенсором нет ничего, те же результаты получите и в АС

  19. через Api можно сделать, к примеру, так:

    var JObj: JObject; WindowManager: JWindowManager;
        Rotation: Integer;
    begin
      JObj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.WINDOW_SERVICE);
      WindowManager := TJWindowManager.Wrap((JObj as ILocalObject).GetObjectID);
      Rotation := WindowManager.getDefaultDisplay.getRotation;
      if Rotation = TJSurface.JavaClass.ROTATION_180 then
      begin
    
      end else
      if Rotation = TJSurface.JavaClass.ROTATION_270 then
      begin
    
      end else
      if Rotation = TJSurface.JavaClass.ROTATION_90 then
      begin
    
      end;

    Подключать ничего не надо, Androidapi.JNI.GraphicsContentViewText (в нашем случае) уже подключен

  20. 3 минуты назад, Bob32 сказал:

    я все так и понял )

    еще вопрос - хелп пишет, что состояния InvertedPortrait и InvertedLandscape - under IOS. 

    типа что под андроидом будет только Portrait и Landscape

    вы пробовали под андроидом с ними работать - они будут "срабатывать"?

    (это у нас 180 и 270)

    Вот этого не скажу. Можно попробовать и посмотреть. Если не даст то уже из api брать

  21. 3 минуты назад, Bob32 сказал:

    СПАСИБО! )

    а "получаете углы" - имеется ввиду углы наклона телефона из IFMXScreenService.GetScreenOrientation - верно?

    те - этот код нужно вставить между getRotationMatrix и getOrientation

    и getOrientation передавать OutMatrix вместо FMatrix, как сейчас. так?

    Немного не то имел ввиду.

    GetScreenOrientation не даст никаких углов, он укажет, грубо говоря, куда направлен верх телефона (где камера). Portrait = 0градусов, вверх.

    remapCoordinateSystem нужен как раз для того, что бы пересчитать матрицу в соответствии с изменившимся положением устройства на осях (верно ведь?).

    Если оси не изменились, смысла в лишней работе телефона нет, ровно как и в создании OutMatrix (его надо обязательно создать и задать размер).

    Как поступить - решать вам. Или считать дополнительно каждый раз, или только по необходимости.

×
×
  • Создать...