【问题标题】:Admob rewarded video ads on KIVY - Java. AndroidKIVY - Java 上的 Admob 奖励视频广告。安卓
【发布时间】:2017-11-03 00:33:26
【问题描述】:

我正在尝试在我的第一个游戏中显示 google admob 奖励视频,但我似乎无法让它发挥作用。这是我到目前为止所拥有的,我不了解 Java,所以这对我来说非常困难。任何帮助将不胜感激,我愿意学习。

RewardedVideoAd = autoclass('com.google.android.gms.ads.reward.RewardedVideoAd')
RewardedAds = autoclass('com.google.android.gms.ads.MobileAds')  

class AdmobAndroid(EventDispatcher):
    mRewardedVideoAd = ObjectProperty(None)
    mRewardedAds = ObjectProperty(None)

    def __init__(self,**kwargs):
        super(AdmobAndroid,self).__init__(**kwargs)

        self.mRewardedVideoAd = RewardedVideoAd(mactivity)
        self.mRewardedAds = RewardedAds(mactivity)
        self.mRewardedVideoAd = self.mRewardedAds.getRewardedVideoAdInstance()
        self.mRewardedVideoAd.setRewardedVideoAdListener()
        self.mRewardedVideoAd.setAdUnitId(settings.REWARDED_UNIT_ID)


    @run_on_ui_thread
    def request_Rewarded(self):
        if not self.mRewardedVideoAd.isLoaded():
            log('REQUESTING rewarded AD')
            adRequestBuilder = AdRequestBuilder()
            adRequest = adRequestBuilder.build()
            self.mRewardedVideoAd.loadAd(adRequest)
        else:
            log('NO NEED TO REQUEST rewarded AD,already loaded...')

    @run_on_ui_thread
    def show_Rewarded(self):
        if self.mRewardedVideoAd.isLoaded():
            self.mRewardedVideoAd.show()
            return True
        return False

这里以this 为指导。

编辑*:

11-15 04:41:39.858 19683 19701 I python  :    File "/home/kivy/Desktop/pong/.buildozer/android/app/main.py", line 58, in <module>
11-15 04:41:39.860 19683 19701 I python  :    File "/home/kivy/Desktop/pong/.buildozer/android/app/admob/__init__.py", line 6, in <module>
11-15 04:41:39.862 19683 19701 I python  :    File "/home/kivy/Desktop/pong/.buildozer/android/app/admob/admob4android.py", line 30, in <module>
11-15 04:41:39.863 19683 19701 I python  :    File "/home/kivy/Desktop/pong/.buildozer/android/platform/python-for-android/build/python-install/lib/python2.7/site-packages/jnius/reflect.py", line 150, in autoclass
11-15 04:41:39.865 19683 19701 I python  :    File "jnius/jnius_export_func.pxi", line 23, in jnius.jnius.find_javaclass (jnius/jnius.c:13171)
11-15 04:41:39.867 19683 19701 I python  :  jnius.jnius.JavaException: Class not found 'com/google/android/gms/ads/reward/RewardedVideoAd'
11-15 04:41:39.951 19683 19701 I python  : Python for android ended.
11-15 04:41:39.969 19683 19701 E AndroidRuntime: FATAL EXCEPTION: Thread-1501
11-15 04:41:39.969 19683 19701 E AndroidRuntime: Process: intellign.ultimatepong:python, PID: 19683
11-15 04:41:39.969 19683 19701 E AndroidRuntime: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.ads.reward.RewardedVideoAd" on path: DexPathList[[zip file "/data/app/intellign.ultimatepong-1/base.apk"],nativeLibraryDirectories=[/data/app/intellign.ultimatepong-1/lib/arm, /data/app/intellign.ultimatepong-1/base.apk!/lib/armeabi, /vendor/lib, /system/lib]]
11-15 04:41:39.969 19683 19701 E AndroidRuntime:        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
11-15 04:41:39.969 19683 19701 E AndroidRuntime:        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
11-15 04:41:39.969 19683 19701 E AndroidRuntime:        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)

编辑**:横幅测试有效,但我需要的是仍然无效的奖励广告。我的 main.py 中的第 59 行也是:ad_inst = Admob()

11-15 19:48:56.971   345  3908 D WifiService: acquireWifiLockLocked: WifiLock{NlpWifiLock type=2 binder=android.os.BinderProxy@4c670d8}
11-15 19:48:57.369 27702 27722 I Finsky  : [1841] com.google.android.finsky.l.c.a(23): Completed 0 account content syncs with 0 successful.
11-15 19:48:57.401 27702 27702 I Finsky  : [1] com.google.android.finsky.services.e.a(5): Installation state replication succeeded.
11-15 19:48:58.023  8254  8272 I python  :  Traceback (most recent call last):
11-15 19:48:58.025  8254  8272 I python  :    File "/home/kivy/Desktop/pong/.buildozer/android/app/main.py", line 59, in <module>
11-15 19:48:58.028  8254  8272 I python  :    File "/home/kivy/Desktop/pong/.buildozer/android/app/admob/admob4android.py", line 61, in __init__
11-15 19:48:58.031  8254  8272 I python  :    File "jnius/jnius_export_class.pxi", line 155, in jnius.jnius.JavaClass.__init__ (jnius/jnius.c:15030)
11-15 19:48:58.034  8254  8272 I python  :    File "jnius/jnius_export_class.pxi", line 180, in jnius.jnius.JavaClass.call_constructor (jnius/jnius.c:15322)
11-15 19:48:58.036  8254  8272 I python  :  jnius.jnius.JavaException: No constructor available
11-15 19:48:58.152  8254  8272 I python  : Python for android ended.

【问题讨论】:

  • 同时上传错误日志
  • @AmodGokhale 我用错误更新了帖子。谢谢
  • 您使用的是最新的 google-play-services_lib 吗?它没有在 lib 文件中找到奖励类定义。
  • 不,我认为这就是原因,我会更新它并让您知道,谢谢。请查看我的其他帖子:stackoverflow.com/questions/47305550/…
  • @AmodGokhale 感谢您的耐心等待。我更新了谷歌播放库,但我认为错误来自我编写的奖励广告代码。

标签: java android python admob kivy


【解决方案1】:

您的想法是正确的,但要使其发挥作用,您需要 RewardedVideoAdListener。您可以使用 PyJnius 中的 PythonJavaClassjava methods 来创建它:

from jnius import PythonJavaClass, java_method

from kivy.logger import Logger

from functools import partial

class RewardedVideoAdListener(PythonJavaClass):

    __javacontext__ = 'app'
    __javainterfaces__ = ["com.google.android.gms.ads.reward.RewardedVideoAdListener"]

    __INFO = True

    @java_method('()V')
    def onRewardedVideoAdLeftApplication(self):
        if self.__INFO:
            Logger.info("AdMob: onRewardedVideoAdLeftApplication")

    @java_method('()V')
    def onRewardedVideoAdClosed(self):
        if self.__INFO:
            Logger.info("AdMob: onRewardedVideoAdClosed")

    @java_method('(I)V')
    def onRewardedVideoAdFailedToLoad(self, errorCode):
        if self.__INFO:
            Logger.info("AdMob: onRewardedVideoAdFailedToLoad, errorCode is "+str(errorCode))

    @java_method('()V')
    def onRewardedVideoAdLoaded(self):
        if self.__INFO:
            Logger.info("AdMob: onRewardedVideoAdLoaded")

    @java_method('()V')
    def onRewardedVideoAdOpened(self):
        if self.__INFO:
            Logger.info("AdMob: onRewardedVideoAdOpened")

    @java_method('(Lcom/google/android/gms/ads/reward/RewardItem;)V')
    def onRewarded(self, reward):
        if self.__INFO:
            Logger.info("AdMob: onRewarded, type is "+str(reward.getType())+", amount is "+str(reward.getAmount()))

    @java_method('()V')
    def onRewardedVideoStarted(self):
        if self.__INFO:
            Logger.info("AdMob: onRewardedVideoStarted")

当然,你可以在这个方法中添加一些处理程序,例如:

from kivy.clock import Clock
from functools import partial

@java_method('(Lcom/google/android/gms/ads/reward/RewardItem;)V')
def onRewarded(self, reward):
    if self.__INFO:
        Logger.info("AdMob: onRewarded, type is "+str(reward.getType())+", amount is "+str(reward.getAmount()))
    self.__rewarded = True
    Clock.schedule_once(partial(on_reward, reward.getType(), reward.getAmount()))

而且你必须在你的 setRewardedVideoAdListener 方法中使用这个监听器:

mRewardedVideoAdListener = RewardedVideoAdListener()
mRewardedVideoAd.setRewardedVideoAdListener(mRewardedVideoAdListener)

【讨论】:

  • 我试过了,但我认为正如@amod 所说,“Mobile Ads SDK 不正式支持 Kivy” 不过非常感谢你,它帮助我理解了很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多