我正在使用Delphi10.3 Community编写一个简单的Android应用程序,并试图调用本地设备摄像头,但却得到了一个错误。
我正在跟踪官方的德尔菲指南
在表单设计器上,选择按钮(用于拍照)。在对象检查器中,为Action属性选择下拉列表.选择“新标准操作”( New )媒体库( Media ):TTakePhotoFromCameraAction: 在Events选项卡上,展开Action节点,然后双击OnDidFinishTaking事件. 向OnDidFinishTaking事件处理程序添加以下代码: TForm1.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);Image1.Bitmap.Assign(图像);结束; 此代码将从移动设备摄像机拍摄的图片分配给TImage组件的Bitmap属性。
我已经验证了Project使用权限-照相机设置设置为true
。我也在请求应用程序启动的必要许可。在调试和发行版中运行是没有区别的。
然而,存在一个问题。单击该按钮时,将收到以下错误消息:
android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager,:尝试在空对象引用上调用虚拟方法'android.content.res.XmlResourceParser android.content.res.XmlResourceParser java.lang.String‘。
下面是我为最简单的测试应用程序编写的代码:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Permissions,
FMX.StdCtrls, FMX.MediaLibrary, FMX.Platform, System.Messaging, FMX.Objects,
System.Actions, FMX.ActnList, FMX.StdActns, FMX.MediaLibrary.Actions,
FMX.Controls.Presentation;
type
TForm1 = class(TForm)
Button1: TButton;
ActionList1: TActionList;
TakePhotoFromCameraAction1: TTakePhotoFromCameraAction;
procedure FormCreate(Sender: TObject);
private
procedure PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
procedure DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
end;
var
Form1: TForm1;
implementation
uses
{$IFDEF ANDROID}
Androidapi.Helpers,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.Os,
{$ENDIF}
FMX.DialogService;
{$R *.fmx}
procedure TForm1.PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
// 3 permission involved
if (Length(AGrantResults) = 3)
and (AGrantResults[0] = TPermissionStatus.Granted)
and (AGrantResults[1] = TPermissionStatus.Granted)
and (AGrantResults[2] = TPermissionStatus.Granted) then
else
ShowMessage('Required permission has not been granted') ;
end;
procedure TForm1.DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
begin
TDialogService.ShowMessage('Need to access the camera',
procedure(const AResult: TModalResult)
begin
APostRationaleProc;
end);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
permCam, permRead, permWrite: string;
begin
// Request permissions
permCam := JStringToString(TJManifest_permission.JavaClass.CAMERA);
permRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
permWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
PermissionsService.RequestPermissions([permCam, permRead, permWrite], PermissionRequestResult, DisplayRationale);
end;
end.
如何使本机相机TTakePhotoFromCameraAction工作?
发布于 2018-12-18 07:32:22
检查项目选项>权益列表>安全文件共享选项是否设置为true
。
发布于 2020-03-12 04:05:53
对于任何将项目从旧版本移植到10.3版本的人,请确保您的AndroidManifest.xml在<%application-meta%>标记前面包含了<%provider%>标记。
我在其他方面发现了很多评论,这里建议在这里可以找到这个文件:
C:\Users\(yourusername)\AppData\Roaming\Embarcadero\BDS\20.0\AndroidManifest.xml
但是,如果这样做不起作用,那么您可能已经在您的AndroidManifest.template.xml
源目录中有了一个文件。如果是这样的话,那么编译器将使用这个模板文件并忽略AppData文件夹中的文件!
发布于 2020-12-29 10:44:56
我遇到了一些问题,有些运行Android 10的设备不能工作。我需要做上面列出的答案中的步骤,但我的回答直到我补充道:
Android:requestLegacyExternalStorage=“真”
到我的AndroidManifest.template.xml的应用程序部分
https://stackoverflow.com/questions/53829324
复制相似问题