首页 > 解决方案 > 添加了 Admob,现在收到 AudioManager 日志的垃圾邮件

问题描述

我在 Flutter 应用中添加了 admob 横幅和插页式广告。它看起来像它的工作,但我收到这些日志的垃圾邮件:

Instantiating com.google.android.gms.ads.ChimeraAdManagerCreatorImpl
I/Ads (15325): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("0C008B27375A350F4FEE8604765FC4E4")) to get test ads on this device.
I/DynamiteModule(15325): Considering local module com.google.android.gms.ads.dynamite:0 and remote module com.google.android.gms.ads.dynamite:212910700
I/DynamiteModule(15325): Selected remote version of com.google.android.gms.ads.dynamite, version >= 212910700
I/DynamiteModule(15325): Considering local module com.google.android.gms.ads.dynamite:0 and remote module com.google.android.gms.ads.dynamite:212910700
I/DynamiteModule(15325): Selected remote version of com.google.android.gms.ads.dynamite, version >= 212910700
V/AudioManager(15325): getMode...
V/AudioManager(15325): isMusicActive...
V/AudioManager(15325): isSpeakerphoneOn: false
V/AudioManager(15325): getStreamVolume streamType: 3 volume: 15
V/AudioManager(15325): getStreamVolume streamType: 2 volume: 7

正如您在此处看到的,应用程序的收听音量、音乐和扬声器活动,这种情况一次又一次地发生。该日志不断出现。我确实在不同手机上以发布模式尝试了我的应用程序的 apk,并得到了相同的结果。它再次坠毁。

这是我的Admob 类代码:

import 'package:google_mobile_ads/google_mobile_ads.dart';

class Reklam {
  static String get bannerUnit => "ca-app-pub-3940256099942544/6300978111";

  InterstitialAd _interstitialAd;
  int num_of_attempt_load = 0;

  static initialization() {
    if (MobileAds.instance == null) {
      MobileAds.instance.initialize();
    }
  }


  static BannerAd getBannerAd() {
    final BannerAd myBanner = BannerAd(
      adUnitId: 'ca-app-pub-MyAppBannerUnitId',
      size: AdSize.banner,
      request: AdRequest(),
      listener: BannerAdListener(
          onAdLoaded: (Ad ad) {
            print("Reklam yülendi");
          },
          onAdFailedToLoad: (Ad ad, LoadAdError error) {
            print("Reklam yüklenemedi.");
            ad.dispose();
          },
          onAdOpened: (Ad ad) {
            print("Reklam açıldı");
          }
      ),
    );

    return myBanner;
  }


  void createInterad() {
    InterstitialAd.load(
      adUnitId: 'ca-app-pub-MyAppInterstitialUnitId',
      request: AdRequest(),
      adLoadCallback: InterstitialAdLoadCallback(
          onAdLoaded: (InterstitialAd ad) {
            _interstitialAd = ad;
            num_of_attempt_load = 0;
          },
          onAdFailedToLoad: (LoadAdError error) {
            num_of_attempt_load + 1;
            _interstitialAd = null;

            if (num_of_attempt_load <= 2) {
              createInterad();
            }
          }),
    );
  }

  void showInterad() {
    if (_interstitialAd == null) {
      return;
    }

    _interstitialAd.fullScreenContentCallback = FullScreenContentCallback(

        onAdShowedFullScreenContent: (InterstitialAd ad) {
          print("ad onAdshowedFullscreen");
        },
        onAdDismissedFullScreenContent: (InterstitialAd ad) {
          print("ad Disposed");
          ad.dispose();
        },
        onAdFailedToShowFullScreenContent: (InterstitialAd ad,
            AdError aderror) {
          print('$ad OnAdFailed $aderror');
          ad.dispose();
          createInterad();
        }
    );

    _interstitialAd.show();

    _interstitialAd = null;
  }
}

这里是横幅和插页式广告集成代码块到页面:

...
class SinavlarKisilerPageState extends State<SinavlarKisilerPage> {
...
 Reklam _reklam = new Reklam();         //Admob Class' definiton as _reklam
 @override
 Widget build(BuildContext context) {

  return Scaffold(
   appbar:...,
   body: ListView(
   ...
     IconButton(
       onPressed: () {
         _reklam.createInterad();        //Interstitial Ads creats
      }),

   ...
      FloatingActionButton.extended(
       onPressed: () async {
        _reklam.showInterad();          //Interstitial Ads shows
     }),
   ...
    ),
  bottomNavigationBar: Container( height: 50, child: AdWidget(ad: 
   Reklam.getBannerAd()..load(), key: UniqueKey(),),),    //Banner Ads integration
  );
 }
}

这是我的android\build.gradle:

buildscript {
    ext.kotlin_version = '1.3.50'
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:4.3.8'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

这是我的android\app\build.gradle:

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdkVersion 30

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.sinavci"
        minSdkVersion 19
        targetSdkVersion 30
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        multiDexEnabled true
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation platform('com.google.firebase:firebase-bom:28.2.0')
    implementation 'com.google.firebase:firebase-analytics'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.google.android.gms:play-services-ads:20.4.0'
}

最后是AndroidManifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.MyApp">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />

   <application
        android:label="MyApp"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">

            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />

            <meta-data
              android:name="io.flutter.embedding.android.SplashScreenDrawable"
              android:resource="@drawable/launch_background"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
       <meta-data
           android:name="com.google.android.gms.ads.APPLICATION_ID"
           android:value="ca-app-pub-MyAppsAdmobId"/>
    </application>
</manifest>

这是发布前的最后一步。请帮忙!!

10月8日更新:

我确实为我的错误找到了一些原因。首先是声音活动,包括音量、音乐播放或扬声器,如果手机静音,Admob 一直在收听以消除完整的视频广告。所以这很正常。由于我的横幅广告加载不断失败,admob 会按照我的 Admob 类中的编码发送每次失败的请求,因此我一次又一次地收到该日志消息,就像垃圾邮件一样。

我的应用程序崩溃的原因完全是setState()方法。在setState()刷新页面并设置新状态时,admob 会发送一个新请求,之后不会出现新页面。我找不到它的解决方案,因为我必须使用setState()并且页面需要刷新到新状态。我该如何解决这个问题?请帮忙。

标签: androidflutteradmob

解决方案


当有人赞成我的问题时,我将我自己找到的解决方案放在这里。正如我在 10 月 8 日所说,原因setState()很简单。我使用Navigator.push...orNavigator.pushReplacement...代替了setState()我的应用程序中的所有功能,并修复了错误。但这在某个地方非常困难,因为我需要定义新的类的最终所需参数以正确刷新页面或定义其他一些参数以在刷新页面İnherited Widget Class后以我想要的方式使用它们。所以问题解决了。我发现有一些原因,比如provider但我没有足够的时间来学习如何使用它,所以选择我知道的这种方式。如果有人解释任何其他解决方案会更好,因为我觉得这个解决方案不好。必须有更好或更稳定的修复。


推荐阅读