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

zonik

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

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

  • Посещение

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

  1. Добрый день

    Данная тема обсуждалась на форуме (топик не смог найти).

    Если вам надо снять видео на Android, то стандартного решения в delphi нет (это связано с проблемами в iOS).

    Вам придётся задать Intent для ОС, и в намерении указать куда сохранять файл.

    можно перевести в Delphi код с официального сайта Google

    http://developer.android.com/guide/topics/media/camera.html

  2. Что не получилось:

    1) Некоторые программы отдают файл в схеме «content» (к примеру Gmail v5.1 отдает). Как в этом случае получить содержание файла не разобрался. Поэтому в фильтре ограничил вид контента "file"

    Для получения «content» я сделал так

     

    var
      Intent: JIntent;
      Uri: Jnet_Uri;
      INStream: JInputStream;
      OUTStream: JOutputStream;
      outputfile: string;
      FFF: JFile;
      NumRead, NumWritten: Longint;
      Buffer: TJavaArray<Byte>;
    begin
    ...
            Intent := SharedActivity.getIntent;
            if (Pos('image/', JStringToString(Intent.getType))>0) or
              (Pos('audio/', JStringToString(Intent.getType))>0) or
              (Pos('video/', JStringToString(Intent.getType))>0) or
              (Pos('application/', JStringToString(Intent.getType))>0)    or
              ('*/*' = JStringToString(Intent.getType)) then
            begin
              if JStringToString(Intent.getType) <> '' then
              begin
                Parcel := Intent.getParcelableExtra(TJIntent.JavaClass.EXTRA_STREAM);
                Uri := TJnet_Uri.Wrap(Parcel);
    
                  if JStringToString(Uri.getScheme) = 'content' then
                  begin
                    if Pos('/mpeg', JStringToString(Intent.getType)) > 0 then
                      outputfile := 'my.mp3'
                    else
                      if Pos('/jpeg', JStringToString(Intent.getType)) > 0 then
                        outputfile := 'my.jpg'
                      else
                        outputfile :=  'my.' + copy(JStringToString(Intent.getType), Pos('/', JStringToString(Intent.getType))+1, 
                           Length(JStringToString(Intent.getType)));//выдергиваем имя типа для того чтобы сделать его расширением
                    //на случай если в Intent не уточнен тип, а указана *, например image/*  
    	        if Pos('.*', outputfile) > 0 then
                      outputfile := StringReplace(outputfile, '.*', '.tmp', [rfReplaceAll]);
    
                    Buffer := TJavaArray<Byte>.Create(4096);
                    INStream := SharedActivityContext.getContentResolver.openInputStream(Uri);
                    try
                        FFF := TJFile.JavaClass.init(StringToJString(<ИМЯ_ПАПКИ>), StringToJString(outputfile));
                        FFF.setWritable(true, false);
                        OUTStream := TJFileOutputStream.JavaClass.init(FFF);
                        repeat
                          NumRead := inStream.read(buffer);
                          if (NumRead <= 0) then
                            Break;
                          outStream.write(buffer, 0, NumRead);
                          application.ProcessMessages;
                        until NumRead <= 0;
                        outStream.close;
                        inStream.close;
                    except
                      on e: exception do
                        raise Exception.CReate('Error. Can''t copy file');
                    end;
                  end
              end
            end
    end
    
    может не самое оптимальное, но работает, в итоге у вас файл с именем outputfile и в папке <ИМЯ_ПАПКИ>
  3. Подскажите можно ли сделать Android активити, которое будет появляться в меню по намерению ACTION_SEND в неком приложении. При выборе моего активити, он должен будет запуститься и обработать полученный JIntent. Может есть у кого пример?
     

    Спасибо за внимание

  4. Не знаю в какую тему определить данный вопрос, но бьюсь с ним долго.

    В FMX у класса TAudioCapture есть возможность записывать звук с микрофона в файл, в Android для этого используется класс MediaRecorder. В Android этот же класс MediaRecorder используется и для записи видео в файл в заданном формате (например MPEG4). В iOS ситуация аналогичная, там тоже на уровне ОС есть инструментарий для записи видео в файл.
    Видеозапись FMX не реализована ни для какой из мобильных ОС. Класс TVideoCapture не полон, т.к. позволяет только получать изображение с камеры, но записывать его в файл видеоформата (конечно со звуком) не даёт. Самому написать видеокодек и записывать картинки с камеры в файл - затея нереальная. надо получить хорошее живое видео.
    Есть решение для iOS на FMX DPF.iOS.Native.Components, где можно воспользоваться нативным иснтрументарием iOS и записать видеофайл, но надо под Android.
    В DPF.Android.Native.Components видеозаписи нет.
    Смотрел FFMPEG Android видео получается покадровое и обрывистое, похоже (исходников у меня нет) что берет с камеры картинками и сохраняет в файл.
    Есть ли у кого какие-нибудь идеи по решению проблемы?
    Спасибо

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