无法通过带有Flutter项目的测试设备(模拟器)加载测试广告

时间:2019-02-18 19:44:00

标签: android flutter admob emulation

我是Flutter应用程序项目的新手。我根据https://firebase.google.com/docs/android/setup

配置了我的应用

输出控制台

Launching lib\main.dart on Android SDK built for x86 in debug mode...
Initializing gradle...
Resolving dependencies...
Running Gradle task 'assembleDebug'...
registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)
registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)
registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)
registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)
registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)
Built build\app\outputs\apk\debug\app-debug.apk.
D/NetworkSecurityConfig(17748): No Network Security Config specified, using platform default
I/WebViewFactory(17748): Loading com.android.chrome version 69.0.3497.100 (code 349710017)
I/jokes.jokespun(17748): The ClassLoaderContext is a special shared library.
I/jokes.jokespun(17748): The ClassLoaderContext is a special shared library.
Syncing files to device Android SDK built for x86...
I/jokes.jokespun(17748): Background concurrent copying GC freed 14545(2MB) AllocSpace objects, 9(176KB) LOS objects, 50% free, 1808KB/3MB, paused 5.468ms total 87.502ms
I/cr_LibraryLoader(17748): Time to load native libraries: 19 ms (timestamps 870-889)
I/chromium(17748): [INFO:library_loader_hooks.cc(36)] Chromium logging enabled: level = 0, default verbosity = 0
I/cr_LibraryLoader(17748): Expected native library version number "69.0.3497.100", actual native library version number "69.0.3497.100"
W/cr_ChildProcLH(17748): Create a new ChildConnectionAllocator with package name = com.android.chrome, sandboxed = true
I/cr_BrowserStartup(17748): Initializing chromium process, singleProcess=false
I/chromium(17748): [INFO:aw_field_trial_creator.cc(54)] First-WebView-Experiment not found
I/FA      (17748): Tag Manager is not found and thus will not be used
I/OpenGLRenderer(17748): Initialized EGL, version 1.4
D/OpenGLRenderer(17748): Swap behavior 1
D/        (17748): HostConnection::get() New Host Connection established 0xc27781c0, tid 17839
W/OpenGLRenderer(17748): Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
D/OpenGLRenderer(17748): Swap behavior 0
D/EGL_emulation(17748): eglCreateContext: 0xe06ee060: maj 3 min 0 rcv 3
W/jokes.jokespun(17748): Accessing hidden field Ljava/nio/Buffer;->address:J (light greylist, reflection)
D/EGL_emulation(17748): eglMakeCurrent: 0xe06ee060: ver 3 0 (tinfo 0xc2737970)
D/EGL_emulation(17748): eglCreateContext: 0xe06eed20: maj 3 min 0 rcv 3
D/EGL_emulation(17748): eglMakeCurrent: 0xe06eed20: ver 3 0 (tinfo 0xe076e4e0)
V/FA      (17748): Deferring to Google Analytics for Firebase for event data collection.
D/DynamitePackage(17748): Instantiating com.google.android.gms.ads.ChimeraMobileAdsSettingManagerCreatorImpl
I/DynamiteModule(17748): Considering local module com.google.android.gms.ads.dynamite:0 and remote module com.google.android.gms.ads.dynamite:11140
I/DynamiteModule(17748): Selected remote version of com.google.android.gms.ads.dynamite, version >= 11140
V/DynamiteModule(17748): Dynamite loader version >= 2, using loadModule2NoCrashUtils
D/DynamitePackage(17748): Instantiating com.google.android.gms.ads.ChimeraAdManagerCreatorImpl
I/Ads     (17748): Starting ad request.
I/Ads     (17748): SDK version: afma-sdk-a-v15090040.14300000.1
I/Ads     (17748): This request is sent from a test device.
W/Ads     (17748): Could not find com.google.android.gms.ads.AdActivity, please make sure it is declared in AndroidManifest.xml.
I/Choreographer(17748): Skipped 39 frames!  The application may be doing too much work on its main thread.
D/EGL_emulation(17748): eglMakeCurrent: 0xe06ee060: ver 3 0 (tinfo 0xc2737970)
I/OpenGLRenderer(17748): Davey! duration=826ms; Flags=1, IntendedVsync=15091144858940, Vsync=15091794858914, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=15091808987960, AnimationStart=15091809076260, PerformTraversalsStart=15091809263460, DrawStart=15091820381260, SyncQueued=15091822369660, SyncStart=15091827238560, IssueDrawCommandsStart=15091833671660, SwapBuffers=15091871677860, FrameCompleted=15091976321160, DequeueBufferDuration=59743000, QueueBufferDuration=370000, 
W/cr_CrashFileManager(17748): /data/user/0/puns.jokes.jokespuns/cache/WebView/Crash Reports does not exist or is not a directory
D/        (17748): HostConnection::get() New Host Connection established 0xdf4d9a00, tid 17773
D/EGL_emulation(17748): eglMakeCurrent: 0xe06eed20: ver 3 0 (tinfo 0xe076e710)
D/skia    (17748): Program linking failed.
I/chatty  (17748): uid=10086(puns.jokes.jokespuns) 1.gpu identical 7 lines
D/skia    (17748): Program linking failed.
D/skia    (17748): Program linking failed.

我正在尝试将AdMob纳入我的Android flutter项目中。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="puns.jokes.package.unique">

<!-- io.flutter.app.FlutterApplication is an android.app.Application that
     calls FlutterMain.startInitialization(this); in its onCreate method.
     In most cases you can leave this as-is, but you if you want to provide
     additional functionality it is fine to subclass or reimplement
     FlutterApplication and put your custom class here. -->
<application
    android:name="io.flutter.app.FlutterApplication"
    android:label="Jokes and Puns"
    android:icon="@mipmap/ic_launcher">

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">
        <!-- This keeps the window background of the activity showing
             until Flutter renders its first frame. It can be removed if
             there is no splash screen (such as the default splash screen
             defined in @style/LaunchTheme). -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-<appid>"/>
        <meta-data
            android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
            android:value="true" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

Build.gradle

buildscript {
ext.kotlin_version = '1.3.20'
repositories {
    google()
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:3.3.1'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    classpath 'com.google.gms:google-services:4.2.0'
}
}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}

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 = '2.0.0'
}

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

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

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
    compileSdkVersion 28

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

    lintOptions {
        disable 'InvalidPackage'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "puns.jokes.jokespuns"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

    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.release
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.google.firebase:firebase-core:16.0.7'
    implementation 'com.google.firebase:firebase-ads:17.1.3'
    implementation 'com.google.android.gms:play-services-ads:17.1.3'
//    testImplementation 'junit:junit:4.12'
//    androidTestImplementation 'com.android.support.test:runner:1.0.2'
//    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

apply plugin: 'com.google.gms.google-services'

main_screen.dart

@override
  void initState() {
    super.initState();
    FirebaseAdMob.instance.initialize(appId: FirebaseAdMob.testAppId);
  }
  @override
  Widget build(BuildContext context) {
    MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo(
      keywords: <String>['flutterio', 'beautiful apps'],
      testDevices: <String>[], // Android emulators are considered test devices
    );

    myInterstitial = InterstitialAd(
      // Replace the testAdUnitId with an ad unit id from the AdMob dash.
      // https://developers.google.com/admob/android/test-ads
      // https://developers.google.com/admob/ios/test-ads
      adUnitId: InterstitialAd.testAdUnitId,
      targetingInfo: targetingInfo,
      listener: (MobileAdEvent event) {
        print("InterstitialAd event is $event");
      },
    );
    myInterstitial..load()..show();
}

.....
.....
.....
.....
.....
@override
  void dispose() {
    myInterstitial.dispose();
    super.dispose();
  }

没有任何错误或警告的广告。

1 个答案:

答案 0 :(得分:1)

将这部分移到活动之外

<meta-data
    android:name="com.google.android.gms.ads.APPLICATION_ID"
    android:value="ca-app-pub-<appid>"/>