Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


AdvertisingIdClient getAdvertisingIdInfo se bloquea para siempre

Estoy intentando obtener el ID de publicidad de la API de servicios de Google Play. Aquí hay un ejemplo de código:

... import com.google.android.gms.ads.identifier.AdvertisingIdClient; import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.common.GooglePlayServicesRepairableException; ... public class MyActivity extends Activity { @Override protected void onStart() { super.onStart(); Thread thr = new Thread(new Runnable() { @Override public void run() { try { Context ctx = MyActivity.this.getApplicationContext(); AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(ctx); } catch (IllegalStateException e) { e.printStackTrace(); } catch (GooglePlayServicesRepairableException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (GooglePlayServicesNotAvailableException e) { e.printStackTrace(); } }); thr.start(); synchronized (thr) { try { thr.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } } 

Cuando llamo método getAdvertisingIdInfo, la aplicación cuelga para siempre (no importa con el depurador o no).

Estoy utilizando Windows ADT 22.3, Android SDK API 19, Google Play SDK rev. 16, Android 4.4.2 Dispositivos Nexus. Estoy integrando API como se describe aquí: https://developer.android.com/google/play-services/id.html

¿Cuál podría ser una razón?

2 Solutions collect form web for “AdvertisingIdClient getAdvertisingIdInfo se bloquea para siempre”

Encontré la razón. No debe bloquear el controlador onStart () porque los bloques de contexto bloqueados reproducen API en la configuración de ID. El código fijo se parece a esto:

 @Override protected void onStart() { super.onStart(); Thread thr = new Thread(new Runnable() { @Override public void run() { try { Context ctx = MyActivity.this.getApplicationContext(); AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(ctx); finished(adInfo); } catch (...) { // All exceptions blocks } finished(null); } }); thr.start(); } private void finished(final AdvertisingIdClient.Info adInfo){ if(adInfo!=null){ // In case you need to use adInfo in UI thread runOnUiThread(new Runnable() { @Override public void run() { // Do some stuff with adInfo } }); } } 

Sería útil que las instrucciones oficiales tuvieran tales comentarios de uso.

Desafortunadamente la llamada de getAdvertisingIdInfo necesita ser hecha de un hilo de fondo, usted no debe bloquear el hilo principal mientras que lo invoca. Parece que no hay opción para obtener el AdId sincrónicamente.

—- EDIT —-

Podría lograr esto ejecutando en un nuevo hilo. Esto es lo que finalmente funciona para mí. No está colgando más (puede no ser un ideal)

 getGAIDSync(){ final CountDownLatch latch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { getGoogleAdsIDAsyncTask.execute().get(5000, TimeUnit.MilliSecond); latch.countDown(); }}).start(); try { latch.await(5000,TimeUnit.MILLISECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.