I uploaded .aab file of AR Masker to Google Play Developer Console in Internal Testing track, and it says me next:
This release will cause a significant drop in the number of devices your apps supports on the following form factors:
Phone > 125
Tablet > 0
However, I include Tablets in Player Settings.
In this list, there is no Galaxy A71 (my app works perfectly on it) as well as Galaxy S21, S22 etc.
How can I fix that?
I use Face Tracking only with AR Foundation 5.1.4 and Unity 2022.3.30.
I increased the Minimum Level API from 24 to 25 because it is required by one asset.
Player Settings:
Android Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
Device catalog says next for A71 and S24 Ultra: “Doesn’t support required feature: android.hardware.camera.ar”, but this is weird.
I found this on stack overflow (it doesn’t work):
I was facing this issue for weeks: my app was not considered compatible on my Galaxy A6 although I’ve always tested the app on it through direct apk build.
Contacted support but it didn’t help (at first they were convinced I was misspelling the app name in the search bar, only after many email they recognised a compatibility problem but without addressing me). I checked and rechecked my Player Settings without luck.
I was about to give up and then I came here and figured out that my “mistake” was to build the app bundle release directly from Unity. It seems that some Player Settings are not properly transferred on the App Bundle release (the aab file) when built directly from Unity. So, as suggested, I tried to export on Android Studio checking Export Project and Export for App Bundle in Build Settings. Then I opened the exported project with Android Studio changing the build type from debug to release (it is another “ghost setting” not transferred by Unity). So I built the project with Android Studio, uploaded on Play Store and volà , hundreds of devices now compatible.
I think Google and Unity Technology really need to syncronize the way they handle app bundle builds…
1 Like
Answer from Google Play Dev Support is provided below. How to fix the “conflict”?
I can’t set ARCore Requirement as “Optional” because my app doesn’t work without it.
"
I’ve looked into your issue and found that your app is not compatible with the Samsung Galaxy A71 due to a conflict in your app’s manifest with the feature android.hardware.camera.ar .
For more information, please visit our developer sites:
For help with technical questions related to app development, I recommend visiting our developer site . Here you can find links to developer support forums and IRC chat communities where developers help each other solve development-related issues.
"
I dont know what the conflict is because I can’t see your manifest. It should be here? where is the android manifest?
1 Like
Here the manifest from /Library/Bee/Android/Prj/IL2CPP/Gradle/unityLibrary/build/intermediates/merged_manifest/release/AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.unity3d.player" >
<uses-sdk
android:minSdkVersion="25"
android:targetSdkVersion="33" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:glEsVersion="0x00030000" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch.distinct"
android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
android:name="android.hardware.camera.ar"
android:required="true" />
<application android:extractNativeLibs="true" >
<meta-data
android:name="unity.splash-mode"
android:value="0" />
<meta-data
android:name="unity.splash-enable"
android:value="True" />
<meta-data
android:name="unity.launch-fullscreen"
android:value="True" />
<meta-data
android:name="unity.render-outside-safearea"
android:value="True" />
<meta-data
android:name="notch.config"
android:value="portrait|landscape" />
<meta-data
android:name="unity.auto-report-fully-drawn"
android:value="true" />
<activity
android:name="com.unity3d.player.UnityPlayerActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
android:exported="true"
android:hardwareAccelerated="false"
android:launchMode="singleTask"
android:resizeableActivity="false"
android:screenOrientation="portrait"
android:theme="@style/UnityThemeSelector" >
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.MAIN" />
</intent-filter>
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
<meta-data
android:name="notch_support"
android:value="true" />
</activity>
<meta-data
android:name="unityplayer.SkipPermissionsDialog"
android:value="true" />
<meta-data
android:name="com.google.ar.core"
android:value="required" />
</application>
</manifest>
And one more from Library/Bee/Android/Prj/IL2CPP/Gradle/launcher/build/intermediates/merged_manifests/release/AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.makaka.armasker"
android:installLocation="preferExternal"
android:versionCode="9"
android:versionName="3.1" >
<uses-sdk
android:minSdkVersion="25"
android:targetSdkVersion="33" />
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:xlargeScreens="true" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:glEsVersion="0x00030000" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch.distinct"
android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
android:name="android.hardware.camera.ar"
android:required="true" />
<uses-permission android:name="com.android.vending.BILLING" />
<queries>
<intent>
<action android:name="com.android.vending.billing.InAppBillingService.BIND" />
</intent>
<package android:name="com.google.ar.core" />
<package android:name="com.android.vending" />
<intent>
<action android:name="com.google.android.play.core.install.BIND_INSTALL_SERVICE" />
</intent>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="*/*" />
</intent>
<intent>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<data android:mimeType="*/*" />
</intent>
</queries>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.front"
android:required="false" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<permission
android:name="org.makaka.armasker.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"
android:protectionLevel="signature" />
<uses-permission android:name="org.makaka.armasker.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" />
<application
android:appComponentFactory="androidx.core.app.CoreComponentFactory"
android:extractNativeLibs="true"
android:icon="@mipmap/app_icon"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/app_icon_round" >
<meta-data
android:name="unity.splash-mode"
android:value="0" />
<meta-data
android:name="unity.splash-enable"
android:value="True" />
<meta-data
android:name="unity.launch-fullscreen"
android:value="True" />
<meta-data
android:name="unity.render-outside-safearea"
android:value="True" />
<meta-data
android:name="notch.config"
android:value="portrait|landscape" />
<meta-data
android:name="unity.auto-report-fully-drawn"
android:value="true" />
<activity
android:name="com.unity3d.player.UnityPlayerActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
android:exported="true"
android:hardwareAccelerated="false"
android:launchMode="singleTask"
android:resizeableActivity="false"
android:screenOrientation="portrait"
android:theme="@style/UnityThemeSelector" >
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.MAIN" />
</intent-filter>
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
<meta-data
android:name="notch_support"
android:value="true" />
</activity>
<meta-data
android:name="unityplayer.SkipPermissionsDialog"
android:value="true" />
<meta-data
android:name="com.google.ar.core"
android:value="required" />
<meta-data
android:name="com.google.android.play.billingclient.version"
android:value="6.2.1" />
<activity
android:name="com.android.billingclient.api.ProxyBillingActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:exported="false"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android:name="com.android.billingclient.api.ProxyBillingActivityV2"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:exported="false"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android:name="com.unity3d.services.ads.adunit.AdUnitActivity"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:exported="false"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
<activity
android:name="com.unity3d.services.ads.adunit.AdUnitTransparentActivity"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:exported="false"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<activity
android:name="com.unity3d.services.ads.adunit.AdUnitTransparentSoftwareActivity"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:exported="false"
android:hardwareAccelerated="false"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<activity
android:name="com.unity3d.services.ads.adunit.AdUnitSoftwareActivity"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:exported="false"
android:hardwareAccelerated="false"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
<activity
android:name="com.unity3d.ads.adplayer.FullScreenWebViewDisplay"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:exported="false"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="org.makaka.armasker.androidx-startup"
android:exported="false" >
<meta-data
android:name="androidx.lifecycle.ProcessLifecycleInitializer"
android:value="androidx.startup" />
<meta-data
android:name="com.unity3d.services.core.configuration.AdsSdkInitializer"
android:value="androidx.startup" />
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup" />
<meta-data
android:name="androidx.profileinstaller.ProfileInstallerInitializer"
android:value="androidx.startup" />
</provider>
<activity
android:name="com.google.android.gms.common.api.GoogleApiActivity"
android:exported="false"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name="com.ironsource.sdk.controller.ControllerActivity"
android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true" />
<activity
android:name="com.ironsource.sdk.controller.InterstitialActivity"
android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.Translucent" />
<activity
android:name="com.ironsource.sdk.controller.OpenUrlActivity"
android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.Translucent" />
<activity
android:name="com.ironsource.mediationsdk.testSuite.TestSuiteActivity"
android:configChanges="orientation|screenSize"
android:exported="false"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.NoTitleBar" >
<meta-data
android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
</activity>
<provider
android:name="com.ironsource.lifecycle.IronsourceLifecycleProvider"
android:authorities="org.makaka.armasker.IronsourceLifecycleProvider"
android:exported="false" /> <!-- The minimal version code of ARCore APK required for an app using this SDK. -->
<meta-data
android:name="com.google.ar.core.min_apk_version"
android:value="240220000" /> <!-- This activity is critical for installing ARCore when it is not already present. -->
<activity
android:name="com.google.ar.core.InstallActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:excludeFromRecents="true"
android:exported="false"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Material.Light.Dialog.Alert" />
<activity
android:name="com.yasirkula.unity.NativeShareCustomShareDialogActivity"
android:exported="false"
android:theme="@style/Theme.NativeShareTransparent" />
<receiver
android:name="com.yasirkula.unity.NativeShareBroadcastListener"
android:exported="false" />
<provider
android:name="com.yasirkula.unity.NativeShareContentProvider"
android:authorities="org.makaka.armasker.NativeShareContentProvider"
android:exported="false"
android:grantUriPermissions="true" />
<provider
android:name="com.yasirkula.unity.NativeCameraContentProvider"
android:authorities="org.makaka.armasker.NativeCameraContentProvider"
android:exported="false"
android:grantUriPermissions="true" />
<service
android:name="androidx.work.impl.background.systemalarm.SystemAlarmService"
android:directBootAware="false"
android:enabled="@bool/enable_system_alarm_service_default"
android:exported="false" />
<service
android:name="androidx.work.impl.background.systemjob.SystemJobService"
android:directBootAware="false"
android:enabled="@bool/enable_system_job_service_default"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:directBootAware="false"
android:enabled="@bool/enable_system_foreground_service_default"
android:exported="false" />
<receiver
android:name="androidx.work.impl.utils.ForceStopRunnable$BroadcastReceiver"
android:directBootAware="false"
android:enabled="true"
android:exported="false" />
<receiver
android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$BatteryChargingProxy"
android:directBootAware="false"
android:enabled="false"
android:exported="false" >
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$BatteryNotLowProxy"
android:directBootAware="false"
android:enabled="false"
android:exported="false" >
<intent-filter>
<action android:name="android.intent.action.BATTERY_OKAY" />
<action android:name="android.intent.action.BATTERY_LOW" />
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$StorageNotLowProxy"
android:directBootAware="false"
android:enabled="false"
android:exported="false" >
<intent-filter>
<action android:name="android.intent.action.DEVICE_STORAGE_LOW" />
<action android:name="android.intent.action.DEVICE_STORAGE_OK" />
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$NetworkStateProxy"
android:directBootAware="false"
android:enabled="false"
android:exported="false" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.background.systemalarm.RescheduleReceiver"
android:directBootAware="false"
android:enabled="false"
android:exported="false" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.TIME_SET" />
<action android:name="android.intent.action.TIMEZONE_CHANGED" />
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.background.systemalarm.ConstraintProxyUpdateReceiver"
android:directBootAware="false"
android:enabled="@bool/enable_system_alarm_service_default"
android:exported="false" >
<intent-filter>
<action android:name="androidx.work.impl.background.systemalarm.UpdateProxies" />
</intent-filter>
</receiver>
<receiver
android:name="androidx.work.impl.diagnostics.DiagnosticsReceiver"
android:directBootAware="false"
android:enabled="true"
android:exported="true"
android:permission="android.permission.DUMP" >
<intent-filter>
<action android:name="androidx.work.diagnostics.REQUEST_DIAGNOSTICS" />
</intent-filter>
</receiver>
<receiver
android:name="androidx.profileinstaller.ProfileInstallReceiver"
android:directBootAware="false"
android:enabled="true"
android:exported="true"
android:permission="android.permission.DUMP" >
<intent-filter>
<action android:name="androidx.profileinstaller.action.INSTALL_PROFILE" />
</intent-filter>
<intent-filter>
<action android:name="androidx.profileinstaller.action.SKIP_FILE" />
</intent-filter>
<intent-filter>
<action android:name="androidx.profileinstaller.action.SAVE_PROFILE" />
</intent-filter>
<intent-filter>
<action android:name="androidx.profileinstaller.action.BENCHMARK_OPERATION" />
</intent-filter>
</receiver>
<service
android:name="com.google.android.datatransport.runtime.backends.TransportBackendDiscovery"
android:exported="false" >
<meta-data
android:name="backend:com.google.android.datatransport.cct.CctBackendFactory"
android:value="cct" />
</service>
<service
android:name="com.google.android.datatransport.runtime.scheduling.jobscheduling.JobInfoSchedulerService"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" >
</service>
<receiver
android:name="com.google.android.datatransport.runtime.scheduling.jobscheduling.AlarmManagerSchedulerBroadcastReceiver"
android:exported="false" />
<service
android:name="androidx.room.MultiInstanceInvalidationService"
android:directBootAware="true"
android:exported="false" />
</application>
</manifest>
Hi @makaka-org ,
It is difficult to discern what the conflict is precisely, but in your manifest that you shared, it shows that the permission “android.hardware.camera.ar” is required. Google for some reason feels that those devices do not support that permission – which is rather confusing since those devices clearly support ARCore functionality.
How we might be able to help with this issue? Are you wanting us to sanity check the validity of your settings and/or manifest?
1 Like
mike-copley-unity:
Hi @makaka-org ,
It is difficult to discern what the conflict is precisely, but in your manifest that you shared, it shows that the permission “android.hardware.camera.ar” is required. Google for some reason feels that those devices do not support that permission – which is rather confusing since those devices clearly support ARCore functionality.
How we might be able to help with this issue? Are you wanting us to sanity check the validity of your settings and/or manifest?
I discovered that this is a common problem, not only with Unity. Google does with it nothing for years.
Please contact Google directly to resolve this issue.
I can set AR as optional in settings to solve it, but my app doesn’t work without AR.
Issue Examples: GitHub 1 , GitHub 2 .
I also noticed that in the latest manifest I provided that generated and merged automatically by Unity, there are some strings contradicting each other. Could be this a that problem, which you can resolve in manifest generating?
To be clear again: My app works only with face tracking, so only the front camera is used, no “Depth” needed.
<uses-feature
android:name="android.hardware.camera.ar"
android:required="true" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.front"
android:required="false" />
Yep, this is what we’re looking for. Can you please file a bug and attach this repro project? I’d like to see where these conflicting settings are coming from. Unity QA: Building quality with passion
Do you have any other packages in your project that you think might be setting android.hardware.camera requirement to false? It’s possible that this is an issue with Unity but it might be an issue with your project, I’m not sure.
1 Like
andyb-unity:
Yep, this is what we’re looking for. Can you please file a bug and attach this repro project? I’d like to see where these conflicting settings are coming from. https://unity3d.com/unity/qa/bug-reporting
Do you have any other packages in your project that you think might be setting android.hardware.camera requirement to false? It’s possible that this is an issue with Unity but it might be an issue with your project, I’m not sure.
Is there a way to determine which package generated a certain part of the manifest?
So, I set AR as Optional in the settings of ARCore for test. As you can see, the list of devices was increased significantly. @andyb-unity @mike-copley-unity , but this case is not suited for my app.
UPDATE
Google registered the issue here .
Contents of the link:
Thanks folks for reporting the issue. We are currently engaging with the Play Store team to address the situation.
We are under the impression that the issue is only affecting the list of devices shown on the Play Console and not app distribution itself (given our experiments with Depth Lab ). However it seems like there are apps like AR Masker are a counter-example as I can see it not being compatible with our test devices.
If your application is affected, would you mind sharing:
** Your application’s package name (or a link to your Play Store entry)*
** Whether your application is AR Required or AR Optional*
While we are working with the Play Store to get a fix deployed soon, the more data points that we can gather the easier it will be to expedite the process.
Thanks again for your patience and your support!
No, but I don’t know anything about your project at all, so I have to rely on you to either debug this issue yourself or file a bug.
This is not really a meaningful way of debugging this issue, but thanks for the information I suppose!
adammak
September 17, 2024, 8:06pm
14
Hello, why is this topic closed? Any update on this? Seems like google does nothing with it for many years. Im having exact same issue and im unable to solve it despite searching around whole internet
1 Like