DelphiでビルドしたアプリをAndroidデバイスに配置すると、No resource identifier found for attribute 'requestLegacyExternalStorage' というエラーが発生することがある
対象となるIDE製品
- Delphi 10.4以降
問題
DelphiのAndroid 64ビット向けコンパイラ(dccarm64)によってビルドされたアプリを配置すると、パッケージングを行う際に以下のようなエラーが発生することがあります。
[PAClient Error] Error: E2312 <プロジェクトパス>\AndroidManifest.xml:20: error: No resource identifier found for attribute 'requestLegacyExternalStorage' in package 'android'
原因
10.4以降では、新規にFireMonkeyアプリケーションのプロジェクトを作成すると AndroidManifest.xmlの定義にrequestLegacyExternalStorageマニフェスト属性がデフォルトで追加されます。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" .. <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"> .. </application> </manifest>
requestLegacyExternalStorageマニフェスト属性は、'Android 29' API レベル以降で利用可能な項目で、古いAPI レベル(例えば、Android 26)では、このマニフェスト属性には対応しておらず、エラーになります。
10.4よりも前のバージョンで作成した既存のFireMonkeyアプリケーションのプロジェクトを移行すると、requestLegacyExternalStorageマニフェスト属性を使用しない古いバージョンの AndroidManifest.template.xmlファイルが含まれている可能性があり、10.4で、この問題が顕在化しないことがあります。
しかしながら、10.4でプロジェクトを新規作成、あるいは既存のプロジェクトでAndroidManifest.template.xmlファイルが requestLegacyExternalStorage'マニフェスト属性を使用するように更新すると、必要なAndroidのAPIレベルの要求を満たしていないため、同じくエラーが発生いたします。
解決
SDKマネージャのAndroid 64ビットの環境設定で、”SDK API レベルの場所“をAndroid 29のAPIレベルを参照するように設定を変更してください。
以下の図は、必要なAndroid 29のSDK Platformが見つからない、あるいはPCにインストールしていないため、"警告マーク"が表示されています。
もし上図のように警告マークが表示されている場合は、AndroidのSDKマネージャを実行し、Android 29のSDK Platformを手動でダウンロードしてください。
AndroidのSDKマネージャを実行する方法は、こちらを参照ください。
以下の図は、AndroidのSDKマネージャの画面です。
Android 29のSDK Platformを選択してダウンロードしてください。