2014-11-29 4 views
14

Sto utilizzando AdMob nella mia app. Ho seguito le linee guida di implementazione e il banner mostra e carica correttamente gli annunci. My MainActivity è responsabile della creazione di riferimenti, della creazione di AdRequest e della visualizzazione del banner, nonché della pausa, della ripresa e della distruzione di AdView. Ogni volta che l'AdRequest è stata caricata, quando viene chiamata la propria attività onStop(), viene creata la seguente eccezione:AdMob: "l'attività ha interrotto ServiceConnection" e "AdvertisingIdClient unbindService non è riuscito."

6706-6706/com.rocca.controlloSpese E/ActivityThread﹕ Activity com.rocca.controlloSpese.MainActivity has leaked ServiceConnection [email protected] that was originally bound here 
android.app.ServiceConnectionLeaked: Activity com.rocca.controlloSpese.MainActivity has leaked ServiceConnection [email protected] that was originally bound here 
     at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:970) 
     at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:864) 
     at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1577) 
     at android.app.ContextImpl.bindService(ContextImpl.java:1560) 
     at android.content.ContextWrapper.bindService(ContextWrapper.java:517) 
     at com.google.android.gms.ads.identifier.a.b(SourceFile:330) 
     at com.google.android.gms.ads.identifier.a.a(SourceFile:187) 
     at com.google.android.gms.ads.identifier.a.b(SourceFile:239) 
     at com.google.android.a.t.f(SourceFile:132) 
     at com.google.android.a.t.b(SourceFile:182) 
     at com.google.android.a.q.a(SourceFile:258) 
     at com.google.android.a.q.a(SourceFile:195) 
     at com.google.android.gms.ads.internal.m.a(SourceFile:107) 
     at com.google.android.gms.ads.internal.request.c.a(SourceFile:99) 
     at com.google.android.gms.ads.internal.util.b.run(SourceFile:17) 
     at com.google.android.gms.ads.internal.util.d.call(SourceFile:29) 
     at com.google.android.gms.ads.internal.util.e.call(SourceFile:49) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:841) 

seguito da queste informazioni:

6706-6781/com.rocca.controlloSpese I/AdvertisingIdClient﹕ AdvertisingIdClient unbindService failed. 
java.lang.IllegalArgumentException: Service not registered: [email protected] 
     at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:922) 
     at android.app.ContextImpl.unbindService(ContextImpl.java:1611) 
     at android.content.ContextWrapper.unbindService(ContextWrapper.java:529) 
     at com.google.android.gms.ads.identifier.a.c(SourceFile:275) 
     at com.google.android.gms.ads.identifier.b.c(SourceFile:100) 
     at com.google.android.gms.ads.identifier.b.run(SourceFile:110) 

questo non avviene se l'AdRequest è non costruito e caricato. Ho impostato il mio IABHelper in onCreate() e, se l'utente non ha acquistato il mio sku "rimuovere gli annunci", vengono mostrati gli annunci. Questo è il codice che uso per caricare gli annunci:

private void showAds() { 
    int adresult = GooglePlayServicesUtil.isGooglePlayServicesAvailable(MainActivity.this); 
    if (adresult == ConnectionResult.SUCCESS) { 
     //if possible, show ads 
     AdRequest adRequest = new AdRequest.Builder() 
       .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
       .addTestDevice("C144E9DA02EA7B26F74ED2C231F31D38") 
       .addTestDevice("93BABD84466B8C1EF529D2FB39D1ACE8") 
       .addTestDevice("BEAA738068664AE9BBF673E37A782E03") 
       .addTestDevice("E51508081F77DF84C129EE471DE67141") 
       .build(); 
     adView.setVisibility(View.VISIBLE); 
     adView.loadAd(adRequest); 
    } else { 
     //if there's a problem, show error and close app 
     GooglePlayServicesUtil.getErrorDialog(adresult, MainActivity.this, 0, new DialogInterface.OnCancelListener() { 
      @Override 
      public void onCancel(DialogInterface dialogInterface) { 
       finish(); 
      } 
     }).show(); 
    } 
} 

di pause(), resume() e destroy() sono chiamati nei metodi del rispettivo attività ADView. In pratica, le prestazioni dell'app non sono influenzate, ma preferirei evitare perdite di memoria. Come evitare questa eccezione?

EDIT: il manifest.XML

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
package="com.rocca.controlloSpese" > 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="com.android.vending.BILLING" /> 
<uses-permission android:name="com.rocca.controlloSpese.BROADCAST_PERMISSION" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:finishOnCloseSystemDialogs="true" 
     android:label="@string/app_name" 
     android:launchMode="singleTop" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 
    <activity 
     android:name="com.google.android.gms.ads.AdActivity" 
     android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />   
</application> 

+0

puoi inserire qui il file manifest? –

+0

certo, ho tagliato altre dichiarazioni per renderlo breve e chiaro. Solo MainActivity carica gli annunci. – devrocca

+0

fai qualcosa di speciale nel metodo onStop()? – Michael

risposta

9

sto vedendo esattamente lo stesso comportamento semplicemente utilizzando il progetto di avvio rapido esempio dal sito web di AdMob here. Sto vedendo questo Lollipop in esecuzione su un Nexus 5.

Quindi questo mi sembra un bug AdMob.

È comunque necessario ottenere un riferimento al servizio AdMob e separare manualmente il servizio per vedere se questo arresta l'errore?

+0

Lo stesso qui. Ho pensato che questo fosse qualcosa a che fare con l'adattatore mopub ma sembra che non lo sia. hai già trovato una soluzione? – AndroidMechanic

+0

Ho lo stesso problema anche con la mia app che utilizza Google Play Service AdMob –

+0

Lo stesso qui. Avete qualche soluzione? –

2

Il codice seguente risolve il mio problema;

@Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     mAdView.destroy(); 
     super.onDestroy(); 
    } 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    mAdView.resume(); 

} 


@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 

    mAdView.pause(); 
} 
+0

Come ho affermato nell'OP, sto facendo quelle chiamate, tuttavia accade l'eccezione. Forse vuoi condividere anche tu il tuo onCreate()? – devrocca

+0

scusa per il mio post. ho fatto e non vedo alcun errore per una o due volte dopo poi vedo gli errori, come si vede in modo che il mio metodo non funziona im ancora cercando pls fatemi sapere se trovate qualche sollution grazie :) –

+0

Risolto il problema per me. – Lizozom

Problemi correlati