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

Kitty

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

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

  • Посещение

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

    16

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

  1. Вот два устройства, на которых не работает. Вижу ShowMessage и тишина:

    http://www.iconbit.ru/products/107378/ Андроид 4.2.2

    http://www.3-q.ru/products/tablets/bc9710am/  прошивка Андроид 4.1.1

    Все устройства с root правами.

     

    Тестовый код создан на С++ Builder XE6.

  2. Правило 2.2.5 приложить проект. У меня всего пару строчек кода в абсолютно чистом тестовом проекте. И все это прекрасно работает на одном планшете, а на двух других устройствах нет. Просто ничего не происходит. Вижу ShowMessage и все.

    #include <System.IOUtils.hpp>
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     //файл file1.mp4 лежит в папке Downloads андроид устройства
     String VideoFileName = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetSharedDownloadsPath(), L"file1.mp4");
     if(FileExists(VideoFileName))
       {
    	ShowMessage(L"Все нормально я здесь!");//вижу сообщение на всех устройствах
    	MediaPlayer1->FileName = VideoFileName;
    	MediaPlayer1->Play();
       }
    }
    
  3. У меня есть код который просто запускает видео файл.

    MediaPlayer1->Play();
    

    На планшете с Андроид 4.4.2 все нормально никаких проблем. Видео запускается.

     

    На планшете с Андроид 4.1 ничего не происходит. Видео файл не запускается. Нажимаю Button c кодом MediaPlayer1->Play(); и тишина. Тот же самый код, тот же самый видео файл. Такая же проблема на Андроид 4.2 на устройстве iconBIT (HD-медиаплеер).

     

    Может работа TMediaPlayer возможна только в последних версиях Андроида?

     

    С++ Builder XE 6.

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

    Иду по коду клавишей F8:

    String path = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetSharedDownloadsPath(), L"files.ini");
    if(FileExists(path))
    {
     //попадаю сюда по F8 однако не вижу в дебаге чему равно path
     //path =  unavailable
    
    ***код***
    
    }
    

    С++ Builder XE 6

  5. Я использую TMediaPlayer для воспроизведения видео по кругу и плюс в таймере необходим запуск разных видео файлов по расписанию. Выяснилось следующее -

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

    //в таймере запуск видео с другим именем
    MediaPlayer1->Stop();
    MediaPlayer1->FileName = name; //другой файл
    MediaPlayer1->Play();
    

    А если запускать новый файл в TMediaPlayer так, то вроде работает и программа не вываливается:

    //в таймере запуск видео с другим именем
    MediaPlayer1->Stop();
    MediaPlayer1->Clear();//вроде помогло, но надежно ли?
    MediaPlayer1->FileName = name;
    MediaPlayer1->Play();
    

    Достаточно ли строки MediaPlayer1->Clear(); чтобы предотвратить возможное вываливание программы из памяти в будущем?

  6. Согласно рекомендациям модифицировала стандартный пример Embarcadero:

    #include <fmx.h>
    #include <System.ioutils.hpp>
    #pragma hdrstop
    
    #include "VideoForm.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.fmx"
    TVideoPlayBackForm *VideoPlayBackForm;
    //---------------------------------------------------------------------------
    __fastcall TVideoPlayBackForm::TVideoPlayBackForm(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TVideoPlayBackForm::videoBtnClick(TObject *Sender)
    {
      /*Under Project-Deployment, we added the media file and set the remote path.
      When the program starts, everything in the directory that is set under remote path is
      copied over to the Documents folder on the device. The MediaPlayer loads the file from
      the Documents folder*/
    #if defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR) || defined(__ANDROID__)
    	MediaPlayer1->FileName =
    		IncludeTrailingPathDelimiter(System::Ioutils::TPath::GetDocumentsPath()) + "Ocean.mp4";
    #endif
    	MediaPlayer1->Play();
    	Timer1->Enabled = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TVideoPlayBackForm::Timer1Timer(TObject *Sender)
    {
    
      // Выполнять таймер с интервалом 1 секунда
      if(MediaPlayer1->CurrentTime == MediaPlayer1->Duration)
      {
    	MediaPlayer1->CurrentTime = 0;
    	MediaPlayer1->Play();
      }
    }
    //---------------------------------------------------------------------------
    

    На моем планшете с андроид, видео проиграло один раз и замерло. Где моя ошибка?

  7. Значит, межу воспроизведениями будет секунда паузы, и пользователь увидит черный экран?
    Медиа классик плеер воспроизводит видео по кругу без задержки и пользователь не замечает перезагрузку видео от конца к началу. MX плеер из Андроид маркета, если в его настройках поставить, галочку программное декодирование, тоже крутить видео без видимого для пользователя перехода от конца к началу. Если видео ролик представляет собой рекламную композицию, то очень досадно, когда появляется черный секундный экран при переходе.

    Может ли FMX плеер справиться с такой задачей – проигрывание видео по кругу без заметной паузы перехода от конца к началу?

  8. В стандартных примерах Embarcadero есть пример использования на мобильном устройстве TMediaPlayer. Пример есть и на паскале и на С++. На С++ он тут:

    C:\Users\Public\Documents\Embarcadero\Studio\14.0\Samples\CPP\Mobile Snippets\VideoPlayback

    Видео нормально воспроизводится на моем андроид устройстве.

     

    Как заставить видео работать в зацикленном режиме? Мне надо чтобы видео играло по кругу. TMediaPlayer может сделать зацикливание при воспроизведении видео? Эта функция есть у всех стандартных плеерах.

     

    Спасибо.

  9.  

    не просто об ответе на вопрос, а о наборе технических статей,

    Хотелось бы чтобы в этиx статьях были бы и примеры кода на С++ для Builder. Ну хотя бы основные моменты. Иногда очень сложно понять как портировать код на паскале в проект С++. Бывает проект на паскале работает, а с кодом на С++ нет. :(

    Сейчас С++ Builder ХЕ6 полностью поддерживает все виды проектов FM, поэтому хотелось бы чтобы С++ также не обделили вниманием.

    Спасибо.

  10. Например, стандартные приемы, которые можно использовать в Windows - привязка к оборудованию.  Просто интересно в познавательных целях, какие технологии используются для защиты в андроид приложениях.

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

    Спасибо.

  12. Чтобы убить процесс нужной программы на андроид устройстве разработчикам java справка дает такую рекомендацию:

    Цитата
    android.os.Process.killProcess (int pid)
    public static final void killProcess (int pid)

    Added in API level 1
    Kill the process with the given PID. Note that, though this API allows us to request to kill any process based on its PID, the kernel will still impose standard restrictions on which PIDs you are actually able to kill. Typically this means only the process running the caller's packages/application and any additional processes created by that app; packages sharing a common UID will also be able to kill each other's processes.
    1. Можно ли эту рекомендацию применить в Delphi/C++ Builder?
    2. Если да то, как будет выглядеть этот код?

    Я пробовала использовать альтернативную эту рекомендацию: Delphi Android ActivityManager

    ActivityManager.killBackgroundProcesses(String packageName)

    Но в С++ этот PAS файл у меня не заработал.

  13. Вот это исправляет проблему:

    void __fastcall TForm1::FormResize(TObject *Sender)
    {
      //Портретная ориентация
      if (Height > Width)
      {
    	Application->ProcessMessages();
    	Realign();
      }
      //Альбомная ориентация
      else if (Height < Width)
      {
    	Application->ProcessMessages();
    	Realign();
      }
    }
    

    Спасибо Nix0N.

  14. Может кому пригодиться. Использование java классов JIntent и JNet_Uri. Спасибо разработчику Indy Remy Lebeau (TeamB)

    http://bcbjournal.org/forums/

    void PlayVideo(const String AFileName)
    {
    	_di_JIntent Intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_VIEW);
    	_di_Jnet_Uri Data = StrToJURI(AFileName);
    	Intent->setDataAndType(Data, StringToJString(L"video/mp4"));
    	SharedActivity()->startActivity(Intent);
     
    }
    
  15. У меня в таймере, если происходит ошибка, выдается сообщение пользователю и программа закрывается. Пример кода:

    ShowMessage(L"Не найден видео файл " + VideoFileName + L". Программа будет закрыта.");
    Application->Terminate();

    Также на форме есть кнопка просто закрытия главной формы приложения:

    Close();

    В обоих случаях программа реагирует одинаково  -  уходи в список ранее запускаемых программ.

    Есть ли принципиальная разница для Андроид приложений между кодом:

    Application->Terminate();

    и закрытием главной формы:

    Close();

    ?

  16. Может и у вас что то подобное мешает жить?

     

    У меня на форме панель с выравниванием по центру на панели две кнопки и текстовая метка. Все, больше ничего нет. Никаких стилей, все по дефолту.

  17. Большое спасибо за развернутые ответы!

     

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

     

    Да, именно так и планируется. Закуплены однотипные устройства: http://rozetka.com.ua/iconbit_movie_3d_iptv/p387929/ и сугубо для этих целей - играть по одному видео по расписанию. Сейчас вместо программы, в назначенное время ходит человек и запускает нужные видео.

     

    Конкретно на этих устройствах еще не тестировала программу т.к. пока все в разработке. На моем же PIPO M7 Андроид 4.4.2 похоже, что работает. Обидно будет, что возможно на этих устройствах программа не заработает как надо, но плюс по любому есть - изучение FM. :)

  18. Большое спасибо!

    Видео запускается в том же экземпляре MXPlayer-a. Устройства с Андроид подсоединены к телевизорам, которые весят в ресторане фаст фуда. На телевизорах крутятся видео ролики (реклама-меню и т.п.). Программа просто должна сама менять видео в назначенное время. Сейчас попробовала на своем планшете, вроде видео меняется в том же окне MXPlayer плеера без заметных проблем. Просто думала может есть какие-то не учтенные подводные камни (утечки памяти и т.п.) т.к. смутно представляю пока ОС Андроид.

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