Accediendo a la cámara del dispositivo Android con Rad Studio 10


Para empezar vamos a hacer una pequeña aplicación móvil en la que vamos a capturar y compartir imágenes de la cámara y de la galería de nuestro dispositivo. Nuestra aplicación va a estar escrita en código  Delphi y se ejecutará en un dispositivo Android.





Empecemos...



Iniciamos nuestro Delphi RAD Studio 10 y empezamos a crear nuestra aplicación desde File–New–Multi Device Application 

Vale la pena señalar que hay varias plantillas de diseño de aplicaciones que se pueden seleccionar, en nuestro caso elegimos una en blanco (Blank Application).









En Style seleccionaremos Android y en View= Master, el Form le llamaremos Form1. Salvamos el proyecto a través de la opción de menú  File – Save All




Vamos a incluir en nuestro proyecto un TImage, un TToolBar,  tres TButton y un TActionListAhora tenemos que cambiar algunas propiedades de los objetos en nuestro proyecto, empezando por la forma en que se mostrará en el dispositivo de visualización IDE, Los otros objetos seguirán se configurarán como sigue:



Button1

- Name= btnCam

- StyleLookup=cameratoolbutton

Button2

- Name= btnArchivo



- StyleLookup=searchtoolbutton

Button3

- Name= btnCompartir

- StyleLookup=actiontoolbutton

image1

-Name=ImgFoto

-Align=Client




Asignación de código y acciones



Con la aplicación que tiene el diseño ya definido falta sólo poner nuestras líneas de código, pero junto con este proceso vamos a asignar acciones predefinidas para poder permitir que nuestra aplicación pueda acceder a las características del dispositivo Android. 

Seleccione la btnCam y Object Inspector haga clic en la propiedad Action, a continuación, seleccione New Standard Action-Media Library-TTakePhotoFromCameraAction





Desde el Object Inspectorvaya a la pestaña Events y expanda la propiedad Action, ver más abajo:









desde allí seleccione el evento onDidFinishTaking y escriba image1.Bitmap.Assign(Image);





















procedure TfrmAndPrincipal.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);


begin


    image1.Bitmap.Assign(Image);

end;





Con este código nuestra aplicación es capaz de capturar imágenes desde la cámara del dispositivo. 


Para el botón   btnArchivo, haremos el mismo procedimiento, usando New Standard Action-Media Library-TTakePhotoFromLibraryAction. Para este botón también se utilizará el mismo evento onDidFinishTaking y su código para btnArchivo será:



















procedure TfrmAndPrincipal.TakePhotoFromLibraryAction1DidFinishTaking(Image: TBitmap);


begin   

image1.Bitmap.Assign(Image);

end;








Finalmente asignamos a  btnCompartir  desde New Standard Action - Media Library –TShowShareSheetAction y en este caso va a codificar su evento onBeforeExecute:





















procedure TfrmAndPrincipal.ShowShareSheetAction1BeforeExecute(Sender: TObject);


begin


    ShowShareSheetAction1.Bitmap.Assign(image1.Bitmap);


end;









Compilar y distribuir



Terminado nuestro proceso de codificación de aplicaciones ahora vamos a compilar y desplegar nuestra aplicación. Seleccione el dispositivo de destino para nuestra aplicación, en mi caso elegí un Nexus5.


Aquí tenemos que recordar que el teléfono debe estar con el modo de depuración USB activo y la aceptación de aplicaciones de fuentes desconocidas.



Dar un Build al proyecto y ejecutar sin depurar (Run without debugging). Espere a que el propio RAD Studio 10 se encargue de instalar el APK en su dispositivo.





Como ven con sólo 3 líneas de código hemos podido crear una aplicación que capture fotos con nuestro dispositivo,  las selecciona desde la galería y las comparte, ¡¡ esto es Delphi !! ...cada día facilitándonos la vida a los programadores...





La unit quedaría así:




unit Unit1;



interface



uses

  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,

  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,

  FMX.MediaLibrary.Actions, System.Actions, FMX.ActnList, FMX.StdActns,

  FMX.StdCtrls, FMX.Controls.Presentation, FMX.Objects;



type

  TForm1 = class(TForm)

    Image1: TImage;

    ToolBar1: TToolBar;

    BtnCam: TButton;

    BtnArchivo: TButton;

    BtnCompartir: TButton;

    ActionList1: TActionList;

    TakePhotoFromCameraAction1: TTakePhotoFromCameraAction;

    TakePhotoFromLibraryAction1: TTakePhotoFromLibraryAction;

    ShowShareSheetAction1: TShowShareSheetAction;

    procedure TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);

    procedure TakePhotoFromLibraryAction1DidFinishTaking(Image: TBitmap);

    procedure ShowShareSheetAction1BeforeExecute(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;



implementation



{$R *.fmx}

{$R *.LgXhdpiPh.fmx ANDROID}



procedure TForm1.ShowShareSheetAction1BeforeExecute(Sender: TObject);

begin

ShowShareSheetAction1.Bitmap.Assign(image1.Bitmap);

end;



procedure TForm1.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);

begin

image1.Bitmap.Assign(Image);

end;



procedure TForm1.TakePhotoFromLibraryAction1DidFinishTaking(Image: TBitmap);

begin

image1.Bitmap.Assign(Image);

end;



end.







2 comentarios:

  1. solo me funciona al leer la biblioteca de fotos, pero la camara no toma la foto, sale un mensaje de java.lang al ejecutar un metodo aparentemente encuentra unvalor nulo..para ser exacto el mensaje es:
    java.lang.nullpointerException: Attemp to invoke virtual method android.content.res.xmlResoursceParser android.content.pm.providerinfo.loadxmlmetadata ( and roid.content.pm.packagemanager , java.lang.string on null object reference...

    ResponderEliminar
  2. Si alguien me puede ayudar por favor, quiero tomar una de un documento para cargarlo en un base de datos.. es muy importante tomar la foto desde la aplicacion por que va asociada a otros datos..

    ResponderEliminar

Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...