首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AdvertisingIdClient.GetAdvertisingIdInfo超时

AdvertisingIdClient.GetAdvertisingIdInfo超时
EN

Stack Overflow用户
提问于 2022-08-10 08:07:46
回答 1查看 74关注 0票数 0

我正在开发一个Xamarin.Form应用程序(安卓和iOs),它需要获得AAID和IDFA。

我从Android部分开始,我实现了AdvertisingIdClient.GetAdvertisingIdInfo,但是这个函数返回超时错误(大约在10s之后)。

我使用Form的DependencyService从Android项目中获得AAID,我用Android11.0编译,我效仿互联网的例子来实现它,但我很确定我遗漏了什么或者做了什么错事,但是呢?

我所做的:

  • 添加了nuget Xamarin.GooglePlayServices.Ads (120.3.0.3)和Xamarin.GooglePlayServices.Basement (117.6.0.4),应该与Android11
  • 为依赖关系服务创建接口,并在Android项目
  • 中创建cs,形式为:我使用Task.Run调用Dependencyservice函数在后台运行i(不确定这是严格的方式,但函数运行,否则会导致错误)

代码语言:javascript
运行
复制
            IDeviceAdIdentifier service = DependencyService.Get<IDeviceAdIdentifier>();
            
            var tadid = Task.Run(() =>
            {
                var t = service.GetAdvertisingIdentifier();
                t.Wait();
                return t.Result;
            });

            tadid.Wait();
            Idfa = tadid.Result;

我从MainActivity

  • In 服务中保存上下文:

代码语言:javascript
运行
复制
[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); // Also tested with MainActivity.Context which is Application context saved during init
                if (adinfo != null)
                    return adinfo.Id;
            }
            catch (IOException ioerr)
            {
                return ioerr.Message;
            }
            catch (Exception err)
            {
                return err.Message;
            }
            return "";
        }
    }
}

我的清单中的

  • :

代码语言:javascript
运行
复制
<?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上引发的错误是:

消息:java.util.concurrent.TimeoutException:超时等待服务连接

StackTrace :

代码语言:javascript
运行
复制
  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的应用程序,它在我的手机上工作。

所以如果有人能帮我,那就太好了。如果你需要更多的信息/代码,请告诉我

谢谢

埃尔韦

EN

回答 1

Stack Overflow用户

发布于 2022-08-12 15:13:40

它只是一个POC,所以在MainActivity中没有什么特别之处。我创建了一个标准的xamarin.Forms项目,并将代码放在一个按钮中的“大约”页面中。

Android MainActivity.cs

代码语言:javascript
运行
复制
using System;

using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;
using Android.Content;

namespace TestAdId.Droid
{
    [Activity(Label = "TestAdId", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        public static Context Context =null;
        public static MainActivity Instance = null;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            Instance = this;
            base.OnCreate(savedInstanceState);


            Context = Android.App.Application.Context;
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

关于屏幕xaml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TestAdId.Views.AboutPage"
             xmlns:vm="clr-namespace:TestAdId.ViewModels"
             Title="{Binding Title}">
    
    <ContentPage.BindingContext>
        <vm:AboutViewModel />
    </ContentPage.BindingContext>
    
    <ContentPage.Resources>
        <ResourceDictionary>
            <Color x:Key="Accent">#96d1ff</Color>
        </ResourceDictionary>
    </ContentPage.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <StackLayout BackgroundColor="{StaticResource Accent}" VerticalOptions="FillAndExpand" HorizontalOptions="Fill">
            <StackLayout Orientation="Horizontal" HorizontalOptions="Center" VerticalOptions="Center">
                <ContentView Padding="0,40,0,40" VerticalOptions="FillAndExpand">
                    <Image Source="xamarin_logo.png" VerticalOptions="Center" HeightRequest="64" />
                </ContentView>
            </StackLayout>
        </StackLayout>
        <ScrollView Grid.Row="1">
            <StackLayout Orientation="Vertical" Padding="30,24,30,24" Spacing="10">
                <Label Text="Start developing now" FontSize="Title"/>
                <Label Text="Make changes to your XAML file and save to see your UI update in the running app with XAML Hot Reload. Give it a try!" FontSize="16" Padding="0,0,0,0"/>
                <Label FontSize="16" Padding="0,24,0,0">
                    <Label.FormattedText>
                        <FormattedString>
                            <FormattedString.Spans>
                                <Span Text="Learn more at "/>
                                <Span Text="https://aka.ms/xamarin-quickstart" FontAttributes="Bold"/>
                            </FormattedString.Spans>
                        </FormattedString>
                    </Label.FormattedText>
                </Label>
                <Label x:Name="IdfaLabel" Text="Unknown" TextColor="Black" FontSize="16" ></Label>
                <Button Margin="0,10,0,0" Text="Get IDFA"
                        Clicked="Button_Clicked"
                        BackgroundColor="{StaticResource Primary}"
                        TextColor="White" />
            </StackLayout>
        </ScrollView>
    </Grid>

</ContentPage>

关于表单代码

代码语言:javascript
运行
复制
using System;
using System.ComponentModel;
using System.Threading.Tasks;
using TestAdId.Services;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using System.Net;
namespace TestAdId.Views
{
    public partial class AboutPage : ContentPage
    {
        public string Idfa = "";
        public AboutPage()
        {
            InitializeComponent();
        }

        private void Button_Clicked(object sender, EventArgs e)
        {
            
            IdfaLabel.Text = "Getting IDFA...";
            IDeviceAdIdentifier service = DependencyService.Get<IDeviceAdIdentifier>();
            
            var tadid = Task.Run(() =>
            {
                var t = service.GetAdvertisingIdentifier();
                t.Wait();
                return t.Result;
            });

            tadid.Wait();
            Idfa = tadid.Result;
            IdfaLabel.Text = Idfa;
        }
    }
}```

Tell me if you need another thing. This is a really simple sample just to try to making AAID working

Thanks

Regards

Hervé
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73302835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档