Bug fastidioso, quello del modulo AdMob per Android: se integrato in una applicazione PhoneGap, tende ad ogni avvio a svuotare i dati salvati nel localStorage, quella funzionalità di HTML5 che io definisco (impropriamente) "cookies agli steroidi".

Sviluppando con PhoneGap il localStorage viene spesso utilizzato proprio per salvare informazioni riguardanti la configurazione dell'app, e trovarselo vuoto ad ogni avvio della stessa può risultare quantomeno sconvenitente. ;-)

Facendo alcune prove, ho verificato che il problema si manifesta solo quando il codice di AdMob viene richiamato prima che venga invocato l'evento 'onDeviceReady' (solitamente al termine dell'inizializzazione del phonegap).



Da qui la modifica è stata semplice: invece di creare il banner di admob subito dopo il caricamento dell'index.html:


package org.andreafortuna.admobdemo;

import android.os.Bundle;
import android.os.Handler;

import org.apache.cordova.*;
import android.widget.LinearLayout;
import com.google.ads.*;

public class ADMOBDEMO extends DroidGap
{
private static final String AdMob_Ad_Unit = "ADMOBID";
private AdView adView;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Set by in config.xml
super.loadUrl(Config.getStartUrl());
adView = new AdView(this, AdSize.SMART_BANNER, AdMob_Ad_Unit);
LinearLayout layout = super.root;
layout.addView(adView);
layout.setHorizontalGravity(android.view.Gravity.CENTER_HORIZONTAL);
AdRequest request = new AdRequest();
adView.loadAd(request);
}
}


ho ritardato l'operazione di 15 secondi:

package org.andreafortuna.admobdemo;

import android.os.Bundle;
import android.os.Handler;

import org.apache.cordova.*;
import android.widget.LinearLayout;
import com.google.ads.*;

public class ADMOBDEMO extends DroidGap
{
private static final String AdMob_Ad_Unit = "ADMOBID";
private AdView adView;
private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Set by in config.xml
super.loadUrl(Config.getStartUrl());
mHandler.postDelayed(new Runnable() {
public void run() {
doAdMob();
}
}, 15000);
}

private void doAdMob() {
adView = new AdView(this, AdSize.SMART_BANNER, AdMob_Ad_Unit);
LinearLayout layout = super.root;
layout.addView(adView);
layout.setHorizontalGravity(android.view.Gravity.CENTER_HORIZONTAL);
AdRequest request = new AdRequest();
adView.loadAd(request);
}
}

In questo modo il localStorage resta intatto.