Xamarin.Forms Android端调用AdvertisingIdClient.GetAdvertisingIdInfo超时问题
Xamarin.Forms Android端获取AAID时触发TimeoutException
我正在开发一款支持Android和iOS的Xamarin.Forms跨平台应用,需要获取AAID与IDFA。在Android端开发中,调用AdvertisingIdClient.GetAdvertisingIdInfo方法时出现超时错误(约10秒后触发)。
我通过DependencyService从Forms层调用Android项目中的方法获取AAID,编译目标为Android 11.0。已完成以下配置操作,但问题依旧:
- 添加了兼容Android 11的NuGet包:Xamarin.GooglePlayServices.Ads(120.3.0.3)和Xamarin.GooglePlayServices.Basement(117.6.0.4)
- 创建了DependencyService的接口及Android端实现类
- 在Forms层通过Task.Run在后台调用服务方法(不这么做会直接报错),代码如下:
IDeviceAdIdentifier service = DependencyService.Get<IDeviceAdIdentifier>(); var tadid = Task.Run(() => { var t = service.GetAdvertisingIdentifier(); t.Wait(); return t.Result; }); tadid.Wait(); Idfa = tadid.Result;
- 在Android端保存了MainActivity的Context
- Android端服务实现代码:
[assembly: Dependency(typeof(TestAdId.Droid.Services.DeviceAdIdentifier))] namespace TestAdId.Droid.Services { public class DeviceAdIdentifier : TestAdId.Services.IDeviceAdIdentifier { public async Task<string> GetAdvertisingIdentifier() { if (MainActivity.Context == null) return ""; string id = ""; try { AdvertisingIdClient.SetShouldSkipGmsCoreVersionCheck(true); var adinfo = AdvertisingIdClient.GetAdvertisingIdInfo(MainActivity.Instance); // 也测试过初始化时保存的MainActivity.Context(Application context) if (adinfo != null) return adinfo.Id; } catch (IOException ioerr) { return ioerr.Message; } catch (Exception err) { return err.Message; } return ""; } } }
- AndroidManifest配置:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.testadid" android:installLocation="auto"> <uses-sdk android:minSdkVersion="25" android:targetSdkVersion="30" /> <application android:label="TestAdId.Android" android:theme="@style/MainTheme" android:icon="@drawable/xamarin_logo"> <meta-data android:name="com.google.android.gms.ads.AD_MANAGER_APP" android:value="true" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> </application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> </manifest>
在三星Galaxy A71设备上触发的错误信息:
Message: java.util.concurrent.TimeoutException: Timed out waiting for the service connection
StackTrace:
at Java.Interop.JniPeerMembers+JniStaticMethods.InvokeObjectMethod (System.String encodedMember, Java.Interop.JniArgumentValue* parameters) [0x00018] in <1921523bc22e407fa9a0855bdae29335>:0 at Google.Ads.Identifier.AdvertisingIdClient.GetAdvertisingIdInfo (Android.Content.Context context) [0x00027] in /Users/runner/work/1/s/generated/com.google.android.gms.play-services-ads-identifier/obj/Release/monoandroid90/generated/src/Google.Ads.Identifier.AdvertisingIdClient.cs:171 at TestAdId.Droid.Services.DeviceAdIdentifier.GetAdvertisingIdentifier () [0x00032] in C:\Working\Digital\Sources\TestAdId\TestAdId\TestAdId.Android\Services\DeviceAdIdentifier.cs:30 --- End of managed Java.IO.IOException stack trace --- java.io.IOException: java.util.concurrent.TimeoutException: Timed out waiting for the service connection at com.google.android.gms.ads.identifier.AdvertisingIdClient.zzb(com.google.android.gms:play-services-ads-identifier@@17.0.1:16) at com.google.android.gms.ads.identifier.AdvertisingIdClient.getAdvertisingIdInfo(com.google.android.gms:play-services-ads-identifier@@17.0.1:3) Caused by: java.util.concurrent.TimeoutException: Timed out waiting for the service connection at com.google.android.gms.common.BlockingServiceConnection.getServiceWithTimeout(com.google.android.gms:play-services-basement@@17.6.0:4) at com.google.android.gms.ads.identifier.AdvertisingIdClient.zzb(com.google.android.gms:play-services-ads-identifier@@17.0.1:14) ... 1 more
测试过其他可获取AAID的应用在该设备上可正常运行,希望得到排查帮助,若需更多信息或代码可告知。
内容的提问来源于stack exchange,提问作者Hervé Cyr
相关产品推荐
相关产品推荐

