妖比不上性感的骚 發表於 2022-5-9 14:33:00

为Delphi 10.4.2实现android拍照填坑

<p>&nbsp;最新的Delphi版本发展到10.4.2,完美支持Andriod 11,但由于Android本身的变化,在开发Android app拍照功能功能时,还是会遇到问题,但这不是Delphi本身的问题,而是你不知如何在Delphi中处理的问题。为什么会这样呢?一句话,Android本身不断变化造成的。</p>
<p>今天就有朋友遇到在10.4.2下拍照出现问题,就是拍完后,点对号,不返回。</p>
<p>1.拍照对于Delphi来说,已经做成了一个 <span style="color: rgba(224, 62, 45, 1)"><strong>标准的Action</strong></span>,在Form上放置一个 <strong><span style="color: rgba(224, 62, 45, 1)">ActionList</span> </strong>,然后增加一个标准的拍照:</p>
<p><img src="https://img2022.cnblogs.com/blog/275839/202205/275839-20220509142449299-805381117.png"></p>
<p>&nbsp;增加后,我们需要处理 <span style="color: rgba(224, 62, 45, 1)"><strong>TakePhotnFormCameraAction </strong></span>的 OnDidFinishTaking事件,即接收拍照的结果:<img src="https://img2022.cnblogs.com/blog/275839/202205/275839-20220509142711441-1924681734.png"></p>
<p>&nbsp;这个事件代码,将拍照结果,传给 <span style="color: rgba(224, 62, 45, 1)">imgPhotoLibraryImage</span>,来显示照片。</p>
<pre class="language-pascal"><code>procedure TCameraRollForm.TakePhotoFromCameraAction1DidFinishTaking(
Image: TBitmap);
begin
{ Assign the image retrieved from the Photo Library to the TImage component. }
imgPhotoLibraryImage.Bitmap.Assign(Image);
end;</code></pre>
<h4>2.执行拍照。这块我们要动态的申请权限。</h4>
<pre class="language-pascal"><code>procedure TCameraRollForm.btnPhotoLibraryClick(Sender: TObject);
begin
PermissionsService.RequestPermissions([
JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE),
JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE),
JStringToString(TJManifest_permission.JavaClass.CAMERA)],
LoadPicturePermissionRequestResult, DisplayRationale)
end;

// Optional rationale display routine to display permission requirement rationale to the user
procedure TCameraRollForm.DisplayRationale(Sender: TObject; const APermissions: TArray&lt;string&gt;; const APostRationaleProc: TProc);
var
I: Integer;
RationaleMsg: string;
begin
for I := 0 to High(APermissions) do
begin
    if APermissions = JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE) then
      RationaleMsg := RationaleMsg + 'The app needs to load photo files from your device';
end;
// Show an explanation to the user *asynchronously* - don't block this thread waiting for the user's response!
// After the user sees the explanation, invoke the post-rationale routine to request the permissions
TDialogService.ShowMessage('The app needs to read a photo file from your device to show it to you',
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)
end;

procedure TCameraRollForm.LoadPicturePermissionRequestResult(Sender: TObject; const APermissions: TArray&lt;string&gt;; const AGrantResults: TArray&lt;TPermissionStatus&gt;);
begin
if (Length(AGrantResults) = 3) and
   (AGrantResults = TPermissionStatus.Granted) and
   (AGrantResults = TPermissionStatus.Granted) and
   (AGrantResults = TPermissionStatus.Granted)
   then
//      TakePhotoFromLibraryAction1.Execute
      TakePhotoFromCameraAction1.Execute
else
    TDialogService.ShowMessage('Cannot do photo editing because the required permissions are not granted');
end;</code></pre>
<p>PermissionsService.RequestPermissions这个方法,请求拍照权限,请求后会执行回调函数LoadPicturePermissionRequestResult,在这个函数中,判断用户是否同意了请求的权限,如果同意,则执行拍照动作:TakePhotoFromCameraAction1.Execute。</p>
<p>写到这里,我不仅想,如果官方在TakePhotoFromCameraAction1.Execute中,自动请求权限该有多好,能省去我这么多麻烦,还要记得需要请求哪些权限。唉,想多了不是...</p>
<p>接下来,我们要对项目做一些配置,不然拍照也不正常。</p>
<p>首先,要设置Secure File Sharing为True,如下图:</p>
<p><img src="https://img2022.cnblogs.com/blog/275839/202205/275839-20220509143055951-1755824682.png"></p>
<p>关于这项设置,我前期有写过,Delphi 10.3.1 Secure File Sharing解决应用间文件共享。</p>
<p>对应的这三个权限也要设置一下:</p>
<pre class="language-pascal"><code>TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)
TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)
TJManifest_permission.JavaClass.CAMERA)</code></pre>
<p>有两种方法,一是在Project Options中设置,如下图:<img src="https://img2022.cnblogs.com/blog/275839/202205/275839-20220509143149106-672668234.png"></p>
<p>或者,另外一种就是直接修改AndroidManifest.template.xml,增加需要的权限,实际上这两种方法的目的是一样的,第一种方法,也是由Delphi把设置的权限填加到AndroidManifest.xml文件中:</p>
<pre class="language-xml"><code>&lt;uses-permission android:name="android.permission.CAMERA"/&gt;
&lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/&gt;
&lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&gt;
&lt;uses-feature android:name="android.hardware.camera"/&gt;
&lt;uses-feature android:name="android.hardware.camera.autofocus" /&gt;</code></pre>
<p>最后,对于从10.3.3升级过来的项目,我们还要在AndroidManifest.template.xml中增加一句:</p>
<pre class="language-xml"><code>android: requestLegacyExternalStorage = "true"</code></pre>
<p>上面朋友遇到的就是这个问题,其实,我前期遇到过,并且整理出来了:Delphi 10.4.1 在android平台下建立文件无权限,可以去参考一下</p><br><br>
来源:https://www.cnblogs.com/karkash/p/16249156.html
頁: [1]
查看完整版本: 为Delphi 10.4.2实现android拍照填坑