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

Belov.V.

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

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

  • Посещение

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

    6

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

  1. Сделал не через подписку, а через событие запуска или вывода приложения из спящего режима.

    Регистрация на обработку файла по типу через <intent-filter> в AndroidManifest.xml

     

    Как писал выше, метод через подписку не сработает, если приложение на момент создания Intent системой не было запущено. Полную реализацию обязательно выложу, вот только бы до файла добраться.

  2. Вопрос в продолжение темы.

    Добрался до получении файла или пути к нему:

    var 
      uri     : Jnet_Uri;
      uriStr  : String;
    ....
    begin
    ...
        if TJIntent.JavaClass.ACTION_VIEW.equals(intent.getAction) then
        begin
          uri := intent.getData;
          uriStr := JStringToString(intent.getData.getEncodedPath);
     

    Не могу вытащить содержимое. Из uri или uriStr разными способами getPath, toString или через JURIToStr() ) можно вытащить строку двух видов (для примера событие активировалось из почтового приложения):

          content: //...../messages/2687/attachments/0.1/BEST/false
          или
          /<почтовый профиль>/messages/2687/attachments/0.1/BEST/false 

    Ни пути ни такого файла из приложения не находится. Extras тоже пустой.

     

    Как из intent.getData получить контент? Кто мысль подкинет.?

  3. Все же путь подписи на получение широковещательную рассылку кмк не верный, т.к. приложение может быть не запущено, а событие в системе уже произошло (к примеру проводится вызов для обработки файла, полученного по почте, а приложение на событие не подписано, т.к. на момент вызова не запущено).
     
    В любом случае проверил - приложение активируется (или запускается, или выводится из бека), т.к. зарегистрировано через <intent-filter>. При этом рассылка TMessageResultNotification не поступает.
     
    Приведенный выше пример о другом - это вариант обмена данными между своими приложениями. Возможно я что-то не так понимаю. :-(
  4. Добрый день,

     

    Я думаю эта тема вам поможет: [Android] Как в вызываемом приложении получить результат, объект JIntent?

     

    Приложение делает широковещательную рассылку с сообщением TMessageResultNotification

     

    Ярослав, спасибо!

     

    Эту тему смотрел, но попробую еще раз покрутить. У меня почему то TMessageResultNotification.Value всегда неопределенный возвращался (и оба *Code всегда нулевые). В результате из него ничего, кроме вылетания приложения получить не удавалось.

     

    Как минимум, если точно делается широковещательная рассылка TMessageResultNotification направление копания понятно.

  5. Приложение зарегистрировано для обработки файла по типу через файл манифеста (неявное намерение).

    <intent-filter>  
         <action android:name="android.intent.action.VIEW" />
         <category android:name="android.intent.category.DEFAULT" />
         <data android:mimeType="text/xml" />
    </intent-filter>
    

    В списке выбора появляется. Как корректно в приложении получить содержание Intent (имя файла, путь)?

    Пробовал реализовать через подписку на получение сообщения на изменение статуса приложения:
    TMessageManager.DefaultManager.SubscribeToMessage(TApplicationEventMessage, DoApplicationEventChanged);
    

    При этом событие вызвавшее активацию определить можно, но вот как добраться до Intent не пойму:

    procedure TForm1.DoApplicationEventChanged(const Sender: TObject; const Message: TMessage);
    var
       Intent   : JIntent;
       app_data : TApplicationEventData;
    begin
    	if not(Message is TApplicationEventMessage) then exit;
    	app_data :=  TApplicationEventMessage(Message).Value;
            case app_data.Event of
              FinishedLaunching, BecameActive : ....
            end;                
    end;
    
    
    Что-то застрял я на этом. Как вообще добраться до открывшего приложение Intent? 
    Если реализовывать через IFMXApplicationEventService вопрос в итоге такой же.
     
    Если есть описание реализации аналогичного функционала для iOS, буду благодарен.
  6. "... процесс передачи двух событий: картинка+текст в постороннее приложение"

     

    Возможно вопрос все же не про два Intent, а как написано выше про Exstra?

    Если к примеру для отправки по e-mail, то текст и присоединенный файл можно.

     

    Вот тут пример реализации: http://fire-monkey.ru/topic/698-otpravka-failov-cherez-namerenie/?p=4918

  7. BurcevD, да вроде как все в вашем примере работает. По крайне мере проверил для 'txt' и  'jpg', сохранив рабочий файл в:

     

        // Path file
        aFileName := TPath.Combine(TPath.GetSharedDownloadsPath, 'sample-temp.jpg');
  8. Путем поисков и мучений:

    uses
      FMX.Helpers.Android,
      //  Androidapi.IOUtils,
      Androidapi.Helpers,
      Androidapi.JNI.GraphicsContentViewText,
      Androidapi.JNIBridge,
      Androidapi.JNI.JavaTypes,
      Androidapi.JNI.Net,
      Androidapi.JNI.Os;
    ...
    var
      Intent  : JIntent;
      uri     : Jnet_Uri;
      j_file  : JFile;
      f_name  : string;
    ...  
    begin
      // имя пересылаемого файла
      f_name := 'picture.png';
      // файл должен быть сохранен по пути: Androidapi.IOUtils.getExternalFilesDir
      // или тоже самое: GetPublicPath
      // К примеру:
      ...SaveToFile(TPath.Combine(TPath.GetPublicPath, f_name));
        
      Intent := TJIntent.Create;
      Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
      Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString('....')); // тема, если нужно
      Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('....'));    // текст сообщения, если нужно
      // прикрепляем файл
      j_file := SharedActivity.getExternalFilesDir(StringToJString(f_name));
      uri := TJnet_Uri.JavaClass.fromFile(j_file);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM,TJParcelable.Wrap((uri as ILocalObject).GetObjectID));
      Intent.setType(StringToJString('vnd.android.cursor.dir/email'));
      //
      SharedActivity.startActivity(Intent);
    end;
    

    Как приаттачить файл по любому другому пути не знаю.

  9. Уважаемый Ra72, мне кажется Вы ушли в неверную сторону при поиске решения, пытаясь подписывать приложение отладочным ключем.

     

    Используя свой ключ Вы можете создавать приложения как в режиме «Debug», так и в режиме «Application Store».

     

    То, какое приложение «билдится», Вы определяется в «Build Configurations».

    А то, каким ключом приложение подписывается Вы устанавливаете в «Target Platforms - Android… - Configuration (Debug или Application store)».

     

    Для решения задачи совместной работы на разных устройствах, сформируйте свой ключ подписи. Разместите его на стационарный ПК и ноутбук. Установите в «Target Platforms - Android… - Configuration = «Application store». Далее Вы можете менять в «Build Configurations» тип приложения (следите, первый раз меняются синхронно). При этом обе создаваемые версии (Debug и Release) существуют на андроиде в списке приложений независимо. !!!Но вот если нужен режим отладки, то тут да, кроме как использовать debug.keystore другого я способа я не знаю.

  10. Wamaco, решение пока одно - отказаться от xcode 6.2

     

    Все что мы описывали с невидимостью SDK iOS 7.1 относится именно к этой версии.

     

    1) удаляем  xcode 6.2;

    2) устанавливаем xcode 6.1.1;

    3) скачиваем на мак SDK iOS 7.1;

    4) теперь RAD для симулятора увидит две версии SDK, но!... можно в RAD установить только одни SDK 8.1

    Где-то в документации попадалось, что xcode 6 сам выбирает нужную версию SDK, а так как он пока в симуляторе 8.1 с PAServer-ом не дружит, всегда переключает на симуляцию iOS 7.1 (выше про такой эффект писали);

     

    В итоге в симуляторе всегда IOS 7.1, а в iOS Devices нормально собираются приложения под iOS 8;

     

    ... и ждем обновлений....

  11. Wamaco, ошибка в логе. Я в сообщении выше лог запуска "прицепил", сравни с тем что у тебя. Скорее всего тоже самое.

    Почему SDK только один, тоже в конце есть. Как исправить пока не знаю.

  12. Плюсую по проблеме запуска приложения в симуляторе. Первый раз столкнулся с выходом 6-го xCode. Те же приложения на xCode 5 в симуляторе запускались без ошибки. От версии SDK у меня результат не зависил (пробовал и 7 и 8).

    Откатился на xCode 5. Другого решения не искал, т.к. было не критично, решил что баг шестерки и его быстро поправят.

     

    Сейчас новое железо с OS X 10.10.2, xCode 6.2 (5-ку не поставить), установлены SDK iOS 8.2 и iOS 7.1.

    Проблему получил снова. В логах симулятора 8.2 при запуске простейшего приложения вот такая диагностика:

    Process: GetAllPath [508]
    Path: /Users/USER/Library/Developer/CoreSimulator/Devices/5C445C3A-8B64-449A-9872-287E2C330BBD/data/Containers/Bundle/Application/E8E8FCC0-6CD0-4001-8D28-2F7FF9DFCD3D/GetAllPath.app/GetAllPath
    Identifier: GetAllPath
    Version: ???
    Code Type: X86 (Native)
    Parent Process: launchd_sim [338]
    Responsible: launchd_sim [338]
    User ID: 501

    Date/Time: 2015-03-12 18:42:37.408 +0300
    OS Version: Mac OS X 10.10.2 (14C1510)
    Report Version: 11
    Anonymous UUID: 6871E7AB-A22C-7B2F-9FFA-E7F7B549C12F


    Time Awake Since Boot: 950 seconds

    Crashed Thread: 0

    Exception Type: EXC_BREAKPOINT (SIGTRAP)
    Exception Codes: 0x0000000000000002, 0x0000000000000000

    Application Specific Information:
    dyld: launch, loading dependent libraries
    DYLD_SHARED_REGION=avoid
    DYLD_ROOT_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
    DYLD_FALLBACK_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks
    DYLD_FALLBACK_LIBRARY_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib
    DYLD_FALLBACK_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks
    DYLD_FALLBACK_LIBRARY_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib

    Dyld Error Message:
    missing LC_DYLD_INFO load command

    Binary Images:
    0xc8a000 - 0xcae44b +dyld_sim (353.2.1) <26A9F7ED-911A-38B9-B8EB-E30B7C3619E6> /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/dyld_sim
    0x8fe71000 - 0x8fea4e03 dyld (353.2.1) <06B1254D-9BB9-327C-BA15-8F18FFF97586> /usr/lib/dyld

     

    Кстати, с версиями SDK в 6.2 что-то тоже интересное. Почитал обсуждение выше и решил установить симуляторе iOS 7.1 Скачал, установил, все перезапустил, в эмуляторе 7.1 появилось. Но PAServer SDK iOS 7.1 не видит (RAD естественно тоже).

    Проверил через консоль:

    MBP:$ /usr/bin/xcodebuild -version -sdk | grep SDKVersion

    SDKVersion: 10.9

    SDKVersion: 10.10

    SDKVersion: 8.2

    SDKVersion: 8.2

     

    Или:

    MBP:bin $xcodebuild -showsdks

    OS X SDKs:
    OS X 10.9 -sdk macosx10.9
    OS X 10.10 -sdk macosx10.10

    iOS SDKs:
    iOS 8.2 -sdk iphoneos8.2

    iOS Simulator SDKs:
    Simulator - iOS 8.2 -sdk iphonesimulator8.2

    Где-то он в общем «потерялся»

  13. А если обработчик повесить на каждый итем при его создании и для каждого не забыть установить HitTest.

     

    Что-то типа:

     

    i  := ListBox.Items.Add('Ваше содержание...');

    ListBox.ListItems.HitTest := True;

    ListBox.ListItems.OnApplyStyleLookup := Self.Doapplys;
     

    (Возможно из описания не совсем понял постановку задачи, но примерно то что выше у меня работает)

  14. С удалением строк из Button2Click, после изменения TSearchBox (не важно, в каком состоянии его оставить), тоже ошибки начинают возникать. Причем там вообще жестко.

     

    Помогает тупое передергивание значение фильтра, пусть даже он был пустой:

     

    var s : string;
    begin
      ListBox1.Items.Delete(0);
      //
      s := SearchBox1.Text;
      SearchBox1.Text := s+'`';
      SearchBox1.Text := s;
    end;
     
    Примерно таким путем можно бороться с ошибкой при добавлении итемов (убрать сортировку, добавить итем, дернуть фильтр, последняя строка наша добавленная, восстанавливаем состояние на момент "до добавления"), но как-то все это.... стыдновато за такой код. :-(
  15. К сожалению этот вопрос до сих пор не имеет однозначного ответа.

    А вопрос такой, какой индекс итема должен вернуться?

    1. Индекс в отфильтрованном списке
    2. или индекс в исходном?

    В текущей реализации возвращается индекс в отфильтрованном списке. Поэтому если добавляемый итем не попадает под условие фильтра, то функция возвращает -1. А если попадет, то она вернет индекс в отфильтрованном списке.

     

    Индекс в отфильтрованном не возвращает ни в каком варианте.

     

    - Если список не упорядочен (ListBox1.Sorted:=False), то возвращается индекс последнего добавленного по порядку (0,1,2,3 и т.д.). Из вопроса выше - 2-й вариант.

    - Если список упорядочить (ListBox1.Sorted:=True), по возвращается индекс в упорядоченном списке. Тут вроде все корректно работает.

    Но это варианты с сортировкой.

     

    Если же мы устанавливаем значение TSearchBox, который действительно в данном случае выступает как фильтр, то при добавлении нового итема, вне зависимости от того попадает в фильтр или нет, всегда получаем "-1". В общем-то для упрощения я указал в п.3 (Очищаем TSearchBox). При пустом фильтре все равно "-1".

     

    ListBox1.Count  тоже начинает "глючить". Не показывает верное значение, пока повторно не установишь /сбросишь значение в TSearchBox. 

     

    Пробовал после использования TSearchBox вообще этот объект "убивать". Все равно последствия его применения остаются.

  16. Столкнулся с такой ситуацией.
     
    1) Заполняем TListBox;
    2) Пользуемся поиском через TSearchBox;
    3) Очищаем TSearchBox;
    4) При попытке добавить любой новый элемент в TListBox, всегда возвращается индекс добавленного элемента "-1".
     
    Накидал пример для экспериментов, упростив до безобразия (прикрепляю).
     
    Как восстановить возможность получать индекс добавленного элемента?
     

    0_116754_6fc8cf12_orig.png

    Project1.zip

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