2014-04-30 3 views
9

Ich versuche, Werbe-ID von Google Play-Services-API zu erhalten. Hier ist ein Beispielcode:AdvertisingIdClient getAdvertisingIdInfo hängt immer

... 
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(); 
      } 
     } 
    } 
} 

Wenn ich getAdvertisingIdInfo Methode bin Aufruf Anwendung hängt für immer (egal mit Debugger oder nicht).

Ich verwende Windows ADT 22,3, API 19 Android SDK, Google SDK rev spielen. 16, Android 4.4.2 Nexus-Geräte. Ich Integration API wie hier beschrieben: https://developer.android.com/google/play-services/id.html

Was ein Grund sein könnte?

Antwort

10

Ich fand den Grund. Es sollte den onStart() - Handler nicht blockieren, da der blockierte Kontext die Play API in den ID-Einstellungen blockiert. Fester Code sieht so aus:

@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 
      } 
     }); 
    } 
} 

Es wäre hilfreich, wenn offizielle Anweisungen solche Gebrauchskommentare hätten.

+2

Ich stimme zu, Googles Beispielcode darauf ist piss arm! –

+0

und wenn ich ihrem Dokument folge, bekomme ich einen schönen Phat Flusen Fehler 'Unreachable Catch Block für GooglePlayServicesAvailabilityException. Diese Ausnahme wird niemals aus dem try-Anweisung body geworfen. In meinem ganzen Leben als Windows-Entwickler hat Microsoft zumindest ihre Sachen ordentlich dokumentiert - und erlaubt Rückmeldungen zu den Dokumenten! FFS –

+0

Oder besser, verwenden Sie eine AsyncTask. – RominaV

1

Leider ist der getAdvertisingIdInfo Anruf muss von einem Hintergrund-Thread ausgeführt werden, sollten Sie nicht den Haupt-Thread blockieren, während es aufgerufen wird. Es scheint, als gäbe es keine Möglichkeit, das AdId synchron zu bekommen.

---- ---- EDIT

ich dies, indem Sie auf einen neuen Thread erreichen könnte. Hier ist, was endlich für mich funktioniert. Es hängt nicht mehr (kann kein Ideal sein)

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(); 
    } 

}