LoginSignup
6
1

More than 3 years have passed since last update.

[Delphi] 10.4 移行で TakePhotoFromLibraryAction を使ってると落ちる罠

Last updated at Posted at 2020-10-15

10.4.1

みなさん!Delphi 10.4.1 は楽しんでますか!
Community Edition が出てないから楽しめないって!?
わかる~
早く出してくれることを祈りましょう。

TakePhotoFromLibraryAction

さて、僕は 10.4.1 を楽しんでいるのですが、Android で、ちょっとした問題にぶつかりました。

それは、TakePhotoFromLibraryAction を使っていると、10.4 に移行したときにアプリが落ちてしまうという問題です。

TakePhotoFromLibraryAction はデバイスの写真を取ってくるアクションですが、ここで写真を選択して、アプリに戻ると直後に落ちます。

対処

10.4.1 で新規に作ったアプリでは落ちないので 10.3.3 から持ってきたファイルで 10.4.1 と何が違うのか diff を取ってみたところ原因がわかりました。

10.4 で新規に作った AndroidManifest.Template.xml には application タグの最後に

android:requestLegacyExternalStorage="true"

が挿入されていました。
そこで、10.3.3 から持ってきた AndroidManifest.Template.xml の application タグの最後に

AndroidManifest.Template.xml
    <application android:persistent="False" 
        android:restoreAnyVersion="False" 
        android:label="Project1" 
        android:debuggable="True" 
        android:largeHeap="False"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme"
        android:hardwareAccelerated="true"
        android:resizeableActivity="false"
        android:requestLegacyExternalStorage="true"> ←ここ!

追加したところ、写真を選んでも落ちなくなりました。

対象範囲別外部ストレージアクセス

Android 10 から「対象範囲別外部ストレージアクセス」(Scoped Strage)という機能が入りました。
これによりメディアファイル(写真や動画)などの取得方法が変りました。

写真を端末から選ぶ操作は普通は Scoped Strage の影響を受けないのですが、TakePhotoFromLibraryAction は受け取った写真データを一旦ファイルに保存し、後でそれを TBitmap.LoadFromFile を使って読み出す、というロジックになっています。

一旦ファイルに保存した時点で Scoped Strage の影響を受けることになり、TBitmap.LoadFromFile が例外を吐いて落ちていました。

requestLegacyExternalStorage

今回追加した requestLegacyExternalStorage は、旧式の外部ファイル管理方式を使うフラグで、これを付けると Scoped Strage は無効化されるため、上記の TakePhotoFromLibraryAction が動作します。

ですが、この救済措置が使えるのは Android 10 (API Level 29) までです。
TargetSDKVersion を Android 11 (API Level 30) にすると無視されます。

Delphi 10.4.1 は正式には Android 11 に対応していないため、現状はこの解決方法でも良いですが、次に出る 10.4.2 は Android 11 に対応して欲しいものです。

See also: サポートされているターゲット プラットフォーム

最後に

ちょっとした問題と書きましたが、いくつか要因を排除するために数日かかっています。
これが皆さんの移行の手助けになれば幸いです!

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1