Перейти к содержанию
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 эмодзи.

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

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

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

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