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

OnePeople

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

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

  • Посещение

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

    55

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

  1. В 19.03.2024 в 12:28, UFO 007 сказал:

    А мона слегонца развернуть:

    это в *.pas вставка типа asm или на Андрюхину студию пересаживаться?

    Это просто использовать Androidapi.JNI.Bluetooth

    Это для примера
    Допустим инициализировали адаптер  
    
    BtObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.BLUETOOTH_SERVICE);
      if BtObject <> nil then
         FJBluetoothManager := TJBluetoothManager.Wrap((BtObject as ILocalObject).GetObjectID);
      if FJBluetoothManager <> nil then
        FJBluetoothAdapter := FJBluetoothManager.getAdapter;
    
    тут подключились
    mmBluetoothDevice := FJBluetoothAdapter.GetRemoteDevice(StringTOJString(mac));
    tmpBluetoothSocket := mmBluetoothDevice.createInsecureRfcommSocketToServiceRecord
                         (TJUUID.JavaClass.fromString(StringToJString('00001101-0000-1000-8000-00805F9B34FB')));
    mmBluetoothSocket.Connect();
    
    отправка и прием ответа
        repeat
        if mmBluetoothSocket.isConnected = true then
           begin
    
             isOk := false;
             Answer := '';
             mmInStream := mmBluetoothSocket.getInputStream;
             mmOutStream := mmBluetoothSocket.getOutputStream;
    
    
             try
                mmOutStream.Write(StringToJAMove(command + #13#10));
                mmOutStream.Flush();
             except
             end;
    
             isClose := false;
             SW := TStopwatch.StartNew;
             milisec := 0;
    
             repeat
    
               try
                   if mmInStream.available > 0 then
                     begin
                       LData := mmInStream.read();
                       isDataAviable := True;
                     end else
                       isDataAviable := false;
               except
                   LData := -1;
               end;
    
               if (LData <> -1) and (isDataAviable = true) then
                 begin
    
                   try
                     Wdata := LData;
                     sym := Chr(WData);
                   except
                     LData := -1;
                   end;
    
                   if sym <> '>' then
                       Answer := Answer + sym;
                 end;
    
                try
                  if Assigned(OBDListner) then
                    isClose := OBDListner.Terminated;
                except
                   Form1.LogOBDAdd('SendBTData except 3');
                end;
    
             milisec := SW.ElapsedMilliseconds;
             until  (LData = -1) or
                    (sym = '>') or
                    (isClose = true) or
                    (milisec > 5000);

     

  2. В 12.03.2024 в 12:51, Slym сказал:

    Загружать картинки не в Stream а в битмап сразу

    Я думаю почему так кадров много, тоже делал на днях как у вас, только проблема не в этом, вся загвоздка в bringtofront, вот эту проблему как решить? Забил на это так как времени не было.

    Так же делал все это в потоке с использованием floatanimation, но прирост не большой получился.

  3. procedure MyCurrentForm.MyButtonClick(Sender: TObject);
    var
      dlg: TMyModalForm;
    begin
      // Create an instance of a form.
      dlg := TMyModalForm.Create(nil);
    
      // Configure the form. For example, give it a display name.
      dlg.Caption := 'My Modal Dialog Box';
    
      // Show your dialog box and provide an anonymous method that handles the closing of your dialog box.
      dlg.ShowModal(
        procedure(ModalResult: TModalResult)
        begin
          // Do something.
        end
      );
    end;

    Из docwiki.embarcadero.com

  4. В 30.01.2024 в 17:03, vanechka25 сказал:

    Проблема в примере от Embarcadero в том, что прием сообщений и отправка происходят через два разных соединения

    Да не проблема это, может быть такая ситуация что вам устройство будет отправлять данные допустим "12" потом в JInputStream будет доступных байт ноль, потом придет "345", поэтому тут нужно делать проверку на завершающий символ сообщения и на необходимый таймаут. Все делается через java код, за 10 минут.

  5. В 04.01.2024 в 15:16, KazakOFF сказал:

    Добрый день, а вас не затруднит выложить полностью рабочий проект? 

     

    Так у меня его нет) Себе делал callback для поиска количества спутников. Пишите на java callback (GnssStatusCallback.rar)

    Через codex генерируете jar файл, добавляете его себе в проект в Libraries

    Пишите объявления методов (Androidapi.JNI.GnssStatusCallback.rar)

    Создаем класс

      type
        TGnnsStatusCallbackDelegate = class(TJavaLocal, JGnssStatusCallbackDelegate)
      private
        class var FConnectivityManager: JConnectivityManager;
      private
        FCallback: JGnssStatusCallback;
      protected
      public
        procedure onFirstFix(ttffMillis: Integer); cdecl;
        procedure onSatelliteStatusChanged(status: JGnssStatus); cdecl;
        procedure onStarted; cdecl;
        procedure onStopped; cdecl;
      public
        constructor Create();
      end;
    constructor TGnnsStatusCallbackDelegate.Create;
    begin
      inherited Create;
      FCallback := TJGnssStatusCallback.JavaClass.init(TAndroidHelper.Context, Self);
    end;
    GnnsStatusCallbackDelegate := TGnnsStatusCallbackDelegate.Create;

    Androidapi.JNI.GnssStatusCallback.rar GnssStatusCallback.rar

  6. Может их нет, новых, а есть устройства которые уже подключались ранее Bluetooth.GetPairedDevices;

     FPairedDevices := Bluetooth.GetPairedDevices;
        if FPairedDevices.Count > 0 then
          for I:= 0 to FPairedDevices.Count - 1 do
            ListBox.Items.Add(FPairedDevices[I].DeviceName)

    Ну и если Android API >= 31

         if TJBuild_VERSION.JavaClass.SDK_INT >= 31  then
            begin
               FPermissionBTConnectSettings := JStringToString(TJManifest_permission.JavaClass.BLUETOOTH_CONNECT);
               FPermissionBTScanSettings := JStringToString(TJManifest_permission.JavaClass.BLUETOOTH_SCAN);
               FPermissionBTAdvertiseSettings := JStringToString(TJManifest_permission.JavaClass.BLUETOOTH_ADVERTISE);
    
               PermissionsService.RequestPermissions([FPermissionBTConnectSettings] +
                                                     [FPermissionBTScanSettings] +
                                                     [FPermissionBTAdvertiseSettings], nil);
            end;
  7. Для начала доступ к памяти проверьте

         if TJBuild_VERSION.JavaClass.SDK_INT >= 30  then
            begin
               if TJEnvironment.JavaClass.isExternalStorageManager = false then
                begin
    
                  Intent := TJIntent.Create;
                  Intent:=  TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                  intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('package:').concat(TAndroidHelper.Context.getPackageName)));
                  if intent.resolveActivity(TAndroidHelper.Context.getPackageManager) <> nil then
                     TAndroidHelper.Context.startActivity(Intent);
    
                end;
            end;

        В <application android:persistent="%persistent%" 
            android:restoreAnyVersion="%restoreAnyVersion%" 
            android:label="%label%" 
            android:debuggable="%debuggable%" 
            android:largeHeap="%largeHeap%"


       Должна быть строка   
            android:requestLegacyExternalStorage="true"

  8.  var IMessageSubscriptionID: Integer;
    
    // в создании формы
    IMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(
        TMessageReceivedNotification, HandleIntentMessage);
    
    
    procedure TForm1.HandleIntentMessage(const Sender: TObject;
      const M: TMessage);
    begin
     try
      if M is TMessageReceivedNotification then
          begin
               OnNewIntent(TMessageReceivedNotification(M).Value);
          end;
     except
        Form1.LogAdd('HandleIntentMessage except');
     end;
    end;
    
    
    function TForm1.OnNewIntent(Intent: JIntent): Boolean;
    var
      insPath: String;
      uri: Jnet_Uri;
    begin
      Result := False;
      try
        if Intent <> nil then
        begin
          uri := Intent.getData;
          if uri <> nil then
            begin
              insPath:= JStringToString( uri.getEncodedPath);
    
              if (ExtractFileExt(insPath)='.x10') then
                 begin
                   // работаете с файлом
                 end;
            end;
        end;
      except
        LogAdd('OnNewIntent except');
      end;
    end;

    Также в манифест добавить

                <intent-filter>
                  <action android:name="android.intent.action.VIEW"/>
                  <category android:name="android.intent.category.DEFAULT"/>
                  <category android:name="android.intent.category.BROWSABLE"/>
                    <data android:scheme="file" />
    		<data android:scheme="content" />
    		<data android:scheme="http" />
    		<data android:scheme="https" />
    		<data android:host="*" />             
    				<data android:pathPattern=".*\\.x10" />
                </intent-filter>
                <intent-filter>
                  <action android:name="android.intent.action.VIEW"/>
    	      <action android:name="android.intent.action.EDIT"/>
                  <category android:name="android.intent.category.DEFAULT"/>
                  <category android:name="android.intent.category.BROWSABLE"/>
                    <data android:scheme="file" />
    		<data android:scheme="content" />
    		<data android:scheme="http" />
    		<data android:scheme="https" />
    		<data android:host="*" />
            <data android:mimeType="*/*" /> 
    		<data android:pathPattern=".*\\.x10" />
                </intent-filter>

     

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