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 TActionList. Ahora 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 Inspector, vaya 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.
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:
ResponderEliminarjava.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...
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