AdMob dynamisch abschalten?

  • Antworten:9
  • Bentwortet
Tim Meißner
  • Forum-Beiträge: 238

19.12.2010, 12:02:21 via Website

Hallo,
kennt jemand einen Weg AdMob dynamisch im Code (je nach einer Variable) abzuschalten?
Ich will in meinem Programm die Möglichkeit haben Werbung an/abzuschalten.

Wie geht das?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

19.12.2010, 12:14:16 via Website

Viele Wege führen nach Rom, Ich hab von AdMob keine Ahnung aber wo ist das Problem eine Variable auszulesen ?

public static final boolean wantAdMob = true;

Wenn Admob also ein View ist könnte man das ganze irgendwo Kapseln:

public class AdmobAdapter extends View()
{
...
}


Je nach Status Adaptierst du das echte Admob oder aber lieferst eine Dummy View,mit 0,0 breite(höhe).

PS: Ich hasse Werbung.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Tim Meißner
  • Forum-Beiträge: 238

19.12.2010, 12:26:47 via Website

Mac Systems

PS: Ich hasse Werbung.

Dann dürfte es dich ja freuen das ich daran arbeite es auch abschaltbar zu machen :)

Das Variablen auslesen ist nicht das Problem.

Wenn ich dich jetzt richtig verstanden habe, implementiere ich in meinen XML Layouts dann den AdMobAdapter.
Wie jetzt die Class aufgebaut sein muss erschließt sich mir jedoch irgendwie nicht ... kannst du mir da noch mehr drüber sagen?
Die normale View für AdMob ist com.admob.android.ads.AdView

Edit: Oder muss ich einfach im Constructor eine If/else abfrage machen und dann je nach Resultat eine AdView/leere View erzeugen und diese dann mit return zurückgeben?

— geändert am 19.12.2010, 12:31:42

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

19.12.2010, 12:36:14 via Website

Das ist ein einfaches Software Pattern was Ich hier vorschlage, dazu gibt es eine Menge Infos im Netz:

http://de.wikipedia.org/wiki/Adapter_%28Entwurfsmuster%29

Nach zweimaligen überlegen ist aber ein Proxy die Richtige Definition für das was du hier benötigst:

http://de.wikipedia.org/wiki/Stellvertreter_%28Entwurfsmuster%29

Ein Proxy leitet weiter wenn er es für richtig hält,in diesem Fall also etwa so:

public class AdmobProxy
{
private boolean final allowAdmob;

private Admob delegate;


public AdmobProxy()
{
allowAdmob= getSharedPreferences().getBoolean(ADMO_LOOKUP_KEY,false):
}
}


Du musst jetzt im Falle das die Werbung erscheinen soll entsprechend den Aufruf delegieren:


public void onDraw(Canvas canvas)
{
if(allowAdmob)
{
delegate.onDraw();
}
//do something else!
}


Wichtig sind sicherlich Methoden zu überschreiben wie onMeasure etc...



HTH,
Mac

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Tim Meißner
  • Forum-Beiträge: 238

19.12.2010, 12:59:23 via Website

Habe es mal probiert, gab Fehlermeldungen ...
Habe noch eine Menge mehr delegate Methoden gemacht (eclipse hat sie automatisch für mich erstellt).
Dann habe ich im XML Layout einfach die AdView mit dem Proxy ersetzt, sollte doch so richtig sein? :*)


1public class AdMobProxy
2 {
3 private final boolean allowAdmob = true;
4
5 private com.admob.android.ads.AdView delegate;
6
7
8 public AdMobProxy()
9 {
10
11 }
12
13 public void onDraw(Canvas canvas)
14 {
15 if(allowAdmob)
16 {
17 delegate.draw(canvas);
18 }
19 }
20}



112-19 12:56:23.591: ERROR/AndroidRuntime(2161): FATAL EXCEPTION: main
212-19 12:56:23.591: ERROR/AndroidRuntime(2161): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.tm.android.allgemeinwissen/de.tm.android.allgemeinwissen.Hauptmenu}: android.view.InflateException: Binary XML file line #38: Error inflating class AdMobProxy
312-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787)
412-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
512-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.app.ActivityThread.access$2300(ActivityThread.java:135)
612-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
712-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.os.Handler.dispatchMessage(Handler.java:99)
812-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.os.Looper.loop(Looper.java:144)
912-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.app.ActivityThread.main(ActivityThread.java:4937)
1012-19 12:56:23.591: ERROR/AndroidRuntime(2161): at java.lang.reflect.Method.invokeNative(Native Method)
1112-19 12:56:23.591: ERROR/AndroidRuntime(2161): at java.lang.reflect.Method.invoke(Method.java:521)
1212-19 12:56:23.591: ERROR/AndroidRuntime(2161): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
1312-19 12:56:23.591: ERROR/AndroidRuntime(2161): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
1412-19 12:56:23.591: ERROR/AndroidRuntime(2161): at dalvik.system.NativeStart.main(Native Method)
1512-19 12:56:23.591: ERROR/AndroidRuntime(2161): Caused by: android.view.InflateException: Binary XML file line #38: Error inflating class AdMobProxy
1612-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:576)
1712-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
1812-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
1912-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
2012-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
2112-19 12:56:23.591: ERROR/AndroidRuntime(2161): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
2212-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.app.Activity.setContentView(Activity.java:1654)
2312-19 12:56:23.591: ERROR/AndroidRuntime(2161): at de.tm.android.allgemeinwissen.Hauptmenu.onCreate(Hauptmenu.java:82)
2412-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
2512-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
2612-19 12:56:23.591: ERROR/AndroidRuntime(2161): ... 11 more
2712-19 12:56:23.591: ERROR/AndroidRuntime(2161): Caused by: java.lang.ClassNotFoundException: android.view.AdMobProxy in loader dalvik.system.PathClassLoader[/mnt/asec/de.tm.android.allgemeinwissen-1/pkg.apk]
2812-19 12:56:23.591: ERROR/AndroidRuntime(2161): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
2912-19 12:56:23.591: ERROR/AndroidRuntime(2161): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
3012-19 12:56:23.591: ERROR/AndroidRuntime(2161): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
3112-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.createView(LayoutInflater.java:466)
3212-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:544)
3312-19 12:56:23.591: ERROR/AndroidRuntime(2161): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
3412-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
3512-19 12:56:23.591: ERROR/AndroidRuntime(2161): ... 20 more

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

19.12.2010, 13:03:04 via Website

Wieso erbst du nicht von View?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Tim Meißner
  • Forum-Beiträge: 238

19.12.2010, 13:04:07 via Website

Das hatte ich auch probiert, kam der gleiche Fehler.
1public class AdMobProxy extends View
2{
3 private final boolean allowAdmob = true;
4 private Context context = null;
5
6 private com.admob.android.ads.AdView delegate;
7
8 public AdMobProxy(Context context)
9 {
10 super(context);
11 this.context = context;
12 delegate = new AdView(context, null);
13 }
14[...]
15}

— geändert am 19.12.2010, 13:08:53

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

19.12.2010, 13:11:58 via Website

Du willst das doch auch als View einbinden, daher verstehe Ich nicht wieso du auf die Idee kommst das anders zu handhaben.

Caused by: java.lang.ClassNotFoundException: android.view.AdMobProxy in loader dalvik.system.PathClassLoader[/mnt/asec/de.tm.android.allgemeinwissen-1/pkg.apk]
2812-19 12:56:23.591: ERROR/AndroidRuntime(2161): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
2912-19 12:56:23.591: ERROR/AndroidRuntime(2161): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
3012-19 12:56:23.591: ERROR/AndroidRuntime(2161): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
3112-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.createView(LayoutInflater.java:466)
3212-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:544)
3312-19 12:56:23.591: ERROR/AndroidRuntime(2161): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
3412-19 12:56:23.591: ERROR/AndroidRuntime(2161): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
3512-19 12:56:23.591: ERROR/AndroidRuntime(2161): ... 20 more

Ich würde mal ein wenig weiter forschen, das sollte an sich klappen was Ich vorschlage.Wie gesagt Admob kenne Ich nicht, mag sein das die da irgendwelche dinge tun die das ganze absurdum führen,glaube ich aber persönlich nicht. Welche Klasse wird denn da jetzt nicht gefunden ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Tim Meißner
  • Forum-Beiträge: 238

19.12.2010, 13:22:30 via Website

Hast recht :P
Das Problem ist dneke ich, dass im XML Layout ich mein Package vergessen hatte.
Jetzt findet er die Klasse, aber ich muss noch die Konstruktoren einbauen, die noch fehlen. Melde mich dann wieder obs geht.

Edit: Crashen tut es nicht mehr, aber er zeigt kein Ad mehr an -.-

— geändert am 19.12.2010, 13:40:08

Antworten
Tobias Eckert
  • Forum-Beiträge: 155

20.12.2010, 08:00:47 via Website

Was genau meinst Du mit abschalten? Wenn Du einfach das Werbebanner verschwinden lassen möchtest, kannst Du das mit AdView.setVisibility anzeigen oder verschwinden lassen.

Auch wenn das Werbebanner nicht angezeigt wird holt es sich aber dennoch bei der Initialisierung eine Werbeanzeige. Um es komplett abschaltbar machen zu können würde ich die AdView im Code erzeugen:

1if (ichWillAds==true) {
2 adView = new AdView();
3 myLayout.addView(adView);
4}

Antworten