#android #delphi #camera #firemonkey
#Android #delphi #камера #firemonkey
Вопрос:
Я пытаюсь воспроизвести приложение AccessCameraApp.dproj, но оно не работает для TakePhotoFromCameraAction1, выдавая следующую ошибку: java.lang.Исключение NullPointerException: попытка вызвать виртуальный метод ‘android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.Строка)’ для нулевой ссылки на объект.
Странно то, что кнопка библиотеки работает отлично…
Форма выглядит так: Form1
и код выглядит следующим образом:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Permissions,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, System.Actions,
FMX.ActnList, FMX.StdActns, FMX.MediaLibrary.Actions, FMX.Objects, FMX.Graphics,
FMX.Controls.Presentation;
type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
ActionList1: TActionList;
Button2: TButton;
TakePhotoFromLibraryAction1: TTakePhotoFromLibraryAction;
TakePhotoFromCameraAction1: TTakePhotoFromCameraAction;
procedure TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
procedure DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
procedure TakePicturePermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
private const
PermissionCamera = 'android.permission.CAMERA';
PermissionReadExternalStorage = 'android.permission.READ_EXTERNAL_STORAGE';
PermissionWriteExternalStorage = 'android.permission.WRITE_EXTERNAL_STORAGE';
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
TAG := 1;
PermissionsService.RequestPermissions([PermissionCamera, PermissionReadExternalStorage, PermissionWriteExternalStorage], TakePicturePermissionRequestResult, DisplayRationale);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TAG := 2;
PermissionsService.RequestPermissions([PermissionCamera, PermissionReadExternalStorage, PermissionWriteExternalStorage], TakePicturePermissionRequestResult, DisplayRationale);
end;
procedure TForm1.DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
begin
APostRationaleProc;
end;
procedure TForm1.TakePicturePermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
if (Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted) then
begin
if TAG = 1
then TakePhotoFromCameraAction1.Execute
else TakePhotoFromLibraryAction1.Execute;
end
else
ShowMessage('Cannot take a photo because the required permissions are not all granted');
end;
procedure TForm1.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
Image1.Bitmap := Image;
end;
end.
Ответ №1:
Убедитесь, что для параметра «Параметры проекта»> «Список прав доступа»> «Безопасный общий доступ к файлам» установлено значение true. Благодаря Дэйву Ноттаджу