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

[Android] Не удается использовать класс Camera.Size из Android API для изменения параметров камеры?


AngryOwl

Вопрос

Опубликовано (изменено)

Уважаемые гуру!

Подскажите, что не правильно в коде? И самое главное - как именно использовать данные интерфейсы (Java классы).

 

Имеем модуль (исходники на https://github.com/FMXExpress/android-object-pascal-wrapper/blob/master/android-19/android.hardware.Camera_Size.pas#L32)

unit android.hardware.Camera_Size;

interface

uses
  AndroidAPI.JNIBridge,
  Androidapi.JNI.JavaTypes;

type
  JCamera_Size = interface;

  JCamera_SizeClass = interface(JObjectClass)
    ['{3CB31FD5-10EB-4FDB-9AF1-768748A6454B}']
    function _Getheight : Integer; cdecl;                                       //  A: $1
    function _Getwidth : Integer; cdecl;                                        //  A: $1
    function equals(obj : JObject) : boolean; cdecl;                            // (Ljava/lang/Object;)Z A: $1
    function hashCode : Integer; cdecl;                                         // ()I A: $1
    function init(w : Integer; h : Integer) : JCamera_Size; cdecl;              // (Landroid/hardware/Camera;II)V A: $1
    procedure _Setheight(Value : Integer) ; cdecl;                              //  A: $1
    procedure _Setwidth(Value : Integer) ; cdecl;                               //  A: $1
    property height : Integer read _Getheight write _Setheight;                 // I A: $1
    property width : Integer read _Getwidth write _Setwidth;                    // I A: $1
  end;

  [JavaSignature('android/hardware/Camera_Size')]
  JCamera_Size = interface(JObject)
    ['{0ACB3AB0-AC98-4575-BD3D-1821B1C6B525}']
    function _Getheight : Integer; cdecl;                                       //  A: $1
    function _Getwidth : Integer; cdecl;                                        //  A: $1
    function equals(obj : JObject) : boolean; cdecl;                            // (Ljava/lang/Object;)Z A: $1
    function hashCode : Integer; cdecl;                                         // ()I A: $1
    procedure _Setheight(Value : Integer) ; cdecl;                              //  A: $1
    procedure _Setwidth(Value : Integer) ; cdecl;                               //  A: $1
    property height : Integer read _Getheight write _Setheight;                 // I A: $1
    property width : Integer read _Getwidth write _Setwidth;                    // I A: $1
  end;

  TJCamera_Size = class(TJavaGenericImport<JCamera_SizeClass, JCamera_Size>)
  end;

implementation

procedure RegisterTypes;
begin
  TRegTypes.RegisterType('android.hardware.Camera_Size', TypeInfo(android.hardware.Camera_Size.JCamera_Size));
end;

initialization
  RegisterTypes;

end.

При попытке вызова метода имею ошибку

var
  CameraSize : JCamera_Size;
...
  CameraSize := TJCamera_Size.JavaClass.init(640, 480);
...

Может я чего-то не понял или допустил ошибку, но при любой попытке обратиться к TJCamera_Size, ведрофон ругается

"Java class JCamera_Size could not be found".

 

P.S. Я в курсе темы http://fire-monkey.ru/topic/397-kak-osuschestvit-sviaz-mezhdu-delphi-interfeisom-i-java-kl/

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

post-115-0-61080500-1408908872.png

post-115-0-90198300-1408908875.png

Изменено пользователем Brovin Yaroslav

Рекомендуемые сообщения

  • 0
  • Модераторы
Опубликовано (изменено)

Ну, я вижу несколько проблем:

  • В своём блоге, я уже писал статью по созданию обёрток и предупреждал, что перед использованием обёртки, которая сгенерирована автоматически, необходимо её проверить. В данном случае, я вижу несоответствие правилу №7 (Как создавать обёртки для JAVA-кода)
  • В Rad Studio уже есть правильно написанный класс, подключите лучше его – это модуль «Androidapi.JNI.Hardware».
  • Честно говоря, я не совсем уверен, что проблем после этого не будет, сейчас проверить не могу. Нужно посмотреть АПИ и примеры, т.к. с таким вызовом я ещё не сталкивался. Может кто-то ещё сможет подсказать.
Изменено пользователем Andrey Yefimov
  • 0
Опубликовано

Спасибо!

Я читал Вашу статью "Как создавать обёртки для JAVA-кода". Возможно чего-то не понял или упустил.

Проверю, и с использованием Androidapi.JNI.Hardware тоже. О результатах сообщу.

  • 0
  • Модераторы
Опубликовано

Не за что.

 

Посмотрел АПИ, если вы работаете с камерой, то мне кажется лучше менять настройки при помощи методов, которые для этого предназначены. У два метода для работы с настройками камеры getParameters и setParameters, если посмотреть класс Camera.Parameters, то можно заметить вот такие методы setJpegThumbnailSize(int width, int height), setPictureSize(int width, int height), setPreviewFpsRange(int min, int max), setPreviewSize(int width, int height). После инициализации камеры, устанавливаете свои настройки и всё.

  • 0
Опубликовано

Я "вдоль и поперек" перелопатил и класс Camera.Parameters, и все вышеуказанные методы. Но пока что-то не срасталось... Хотя не покидает ощущение, что вот-вот вопрос решится, и просто где-то что-то пропустил.

Еще раз спасибо за инфу и за класс Camera.Parameters, а то я про него уже успел забыть.

 

О результатах и решении проблем в любом случае отпишу в эту тему. (Кроме возможных доп.вопросов))

  • 0
  • Администраторы
Опубликовано

  • Попробуйте при подписи класса через атрибут указать следующую подпись:

    [JavaSignature('android/hardware/Camera$Size')]
    JCamera_Size = interface(JObject)
    
  • В Delphi уже транслирован этот класс. Находится в Androidapi.JNI.Hardware.pas.
  • 0
  • Модераторы
Опубликовано

Вот сырое решение, проверено на демке «Mobile Snippets\CameraComponent»:

Открываем FMX.Media.Android.pas, находим procedure TAndroidVideoCaptureDevice.DoStartCapture;

После

  if TPlatformServices.Current.GlobalFlags.ContainsKey(EnableGlassFPSWorkaround) and
    TPlatformServices.Current.GlobalFlags[EnableGlassFPSWorkaround] then
  begin
    Params.setPreviewFpsRange(30000, 30000);
    Camera.setParameters(Params);
  end

добавляем необходимые настройки:

  Params.setPreviewSize(800, 480);
  Camera.setParameters(Params);

Сохраняем, запускаем демо, и картинка отображается и сохраняется из TBitmap с разрешением 480x800.

 
Картинку в демке сохранял так:
imgCameraView.Bitmap.SaveToFile(TPath.Combine(TPath.GetPicturesPath, 'test.png'));
Очень важно не забывать, что камеры в устройствах поддерживают только определённые списки разрешений. Например, у моей камеры минимальное разрешение 640x480, 800x480, и т.д. по возрастанию.

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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