Commit 75ffd479 authored by bixing's avatar bixing

添加开屏广告添加买量统计

parent 7f7ea75e
......@@ -46,6 +46,9 @@ android {
applicationId "com.ads.cal.notes"
versionName "1.0.0.0"
signingConfig signingConfigs.toolsTest
//release
manifestPlaceholders = [google_ad_app_id: "ca-app-pub-4184965935607567~3208771202"]
// manifestPlaceholders = [google_ad_app_id: "ca-app-pub-3940256099942544~3347511713"]
}
}
}
......@@ -63,6 +66,11 @@ dependencies {
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'org.greenrobot:eventbus:3.3.1'
implementation 'com.google.android.gms:play-services-ads:22.6.0'
implementation 'androidx.lifecycle:lifecycle-process:2.6.2'
//facebook
implementation 'com.facebook.android:facebook-android-sdk:latest.release'
}
\ No newline at end of file
......@@ -50,6 +50,26 @@
android:configChanges="orientation|screenSize|keyboardHidden"
android:exported="true"
android:screenOrientation="portrait" />
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="${google_ad_app_id}" />
<!-- facebook -->
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/fb_id" />
<meta-data
android:name="com.facebook.sdk.ClientToken"
android:value="@string/fb_token" />
<meta-data
android:name="com.facebook.sdk.AutoLogAppEventsEnabled"
android:value="true" />
<meta-data
android:name="com.facebook.sdk.AutoInitEnabled"
android:value="true" />
<meta-data
android:name="com.facebook.sdk.AdvertiserIDCollectionEnabled"
android:value="true" />
</application>
</manifest>
\ No newline at end of file
package com.ads.cal.notes;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.lifecycle.ProcessLifecycleOwner;
import com.ads.cal.notes.db.DBManager;
import com.ads.cal.notes.manager.WelcomeAdManager;
public class BaseApplication extends Application {
public class BaseApplication extends Application implements Application.ActivityLifecycleCallbacks, LifecycleObserver {
private static DBManager dataBaseManager;
private static Application application;
@Override
public void onCreate() {
super.onCreate();
application = this;
this.registerActivityLifecycleCallbacks(this);
WelcomeAdManager.initAdMobile(this);
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
DBManager.init(this);
}
......@@ -25,5 +38,51 @@ public class BaseApplication extends Application {
return DBManager.init(application);
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
protected void onMoveToForeground() {
// Show the ad (if available) when the app moves to foreground.
WelcomeAdManager.getInstance().showAdIfAvailable(currentActivity);
}
private Activity currentActivity;
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
if (!WelcomeAdManager.getInstance().isShowing()) {
currentActivity = activity;
}
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
}
}
......@@ -8,6 +8,10 @@ import android.widget.ProgressBar;
import androidx.annotation.NonNull;
import com.ads.cal.notes.callback.OnLoadAdEndCallBack;
import com.ads.cal.notes.callback.OnShowAdEndCallBack;
import com.ads.cal.notes.manager.WelcomeAdManager;
import java.lang.ref.WeakReference;
public class WelcomeActivity extends BaseActivity {
......@@ -29,6 +33,11 @@ public class WelcomeActivity extends BaseActivity {
void intData() {
handler = new MyHandler(this);
handler.sendEmptyMessage(1);
if (WelcomeAdManager.getInstance().isAdAvailable()) {
showAdIfAvailable();
} else {
loadAd();
}
}
public void setProgressBarProgress(int i) {
......@@ -53,6 +62,41 @@ public class WelcomeActivity extends BaseActivity {
}
}
private void showAdIfAvailable() {
handler.removeCallbacksAndMessages(null);
WelcomeAdManager.getInstance().setOnShowAdCallBack(new OnShowAdEndCallBack() {
@Override
public void onShowAdComplete() {
Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
@Override
public void onShowAdFailed(String errorMsg) {
Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
WelcomeAdManager.getInstance().showAdIfAvailable(this);
}
private void loadAd() {
WelcomeAdManager.getInstance().setOnLoadAdCallBack(new OnLoadAdEndCallBack() {
@Override
public void onLoadAdComplete() {
showAdIfAvailable();
}
@Override
public void onLoadAdFailed(String errorMsg) {
}
});
WelcomeAdManager.getInstance().loadAd();
}
private static class MyHandler extends Handler {
private final WeakReference<Activity> weakReference;
private int i = 0;
......
package com.ads.cal.notes.callback;
public interface OnLoadAdEndCallBack {
void onLoadAdComplete();
void onLoadAdFailed(String errorMsg);
}
package com.ads.cal.notes.callback;
public interface OnShowAdEndCallBack {
void onShowAdComplete();
void onShowAdFailed(String errorMsg);
}
package com.ads.cal.notes.manager;
import android.app.Activity;
import android.content.Context;
import androidx.annotation.NonNull;
import com.ads.cal.notes.BaseApplication;
import com.ads.cal.notes.LLog;
import com.ads.cal.notes.callback.OnLoadAdEndCallBack;
import com.ads.cal.notes.callback.OnShowAdEndCallBack;
import com.google.android.gms.ads.AdError;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.FullScreenContentCallback;
import com.google.android.gms.ads.LoadAdError;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.appopen.AppOpenAd;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;
import java.util.Date;
public class WelcomeAdManager {
//
private static final String AD_UNIT_ID = "ca-app-pub-4184965935607567/5740399928";
// private static final String AD_UNIT_ID = "ca-app-pub-3940256099942544/9257395921";
private AppOpenAd appOpenAd = null;
private boolean isLoading = false;
private boolean isShowing = false;
private OnLoadAdEndCallBack onLoadAdEndCallBack;
private OnShowAdEndCallBack onShowAdEndCallBack;
public boolean isShowing() {
return isShowing;
}
/**
* Keep track of the time an app open ad is loaded to ensure you don't show an expired ad.
*/
private long loadTime = 0;
/**
* Constructor.
*/
public WelcomeAdManager() {
}
private static final class AppOpenAdManagerHolder {
static final WelcomeAdManager WELCOME_AD_MANAGER = new WelcomeAdManager();
}
public static WelcomeAdManager getInstance() {
return AppOpenAdManagerHolder.WELCOME_AD_MANAGER;
}
public static void initAdMobile(Context context) {
MobileAds.initialize(context, new OnInitializationCompleteListener() {
@Override
public void onInitializationComplete(@NonNull InitializationStatus initializationStatus) {
}
});
}
/**
* Check if ad was loaded more than n hours ago.
*/
private boolean wasLoadTimeLessThanNHoursAgo() {
long dateDifference = (new Date()).getTime() - loadTime;
long numMilliSecondsPerHour = 3600000;
return (dateDifference < (numMilliSecondsPerHour * (long) 4));
}
/**
* Check if ad exists and can be shown.
*/
public boolean isAdAvailable() {
// Ad references in the app open beta will time out after four hours, but this time limit
// may change in future beta versions. For details, see:
// https://support.google.com/admob/answer/9341964?hl=en
return appOpenAd != null && wasLoadTimeLessThanNHoursAgo();
}
/**
* Show the ad if one isn't already showing.
*
* @param activity the activity that shows the app open ad
*/
public boolean showAdIfAvailable(
@NonNull Activity activity) {
// If the app open ad is already showing, do not show the ad again.
if (isShowing) {
LLog.d("The app open ad is already showing.");
return false;
}
// If the app open ad is not available yet, invoke the callback then load the ad.
if (!isAdAvailable()) {
LLog.d("The app open ad is not ready yet.");
loadAd();
return false;
}
appOpenAd.setFullScreenContentCallback(
new FullScreenContentCallback() {
/** Called when full screen content is dismissed. */
@Override
public void onAdDismissedFullScreenContent() {
// Set the reference to null so isAdAvailable() returns false.
appOpenAd = null;
isShowing = false;
LLog.d("onAdDismissedFullScreenContent.");
if (null != onShowAdEndCallBack) {
onShowAdEndCallBack.onShowAdComplete();
onShowAdEndCallBack = null;
}
loadAd();
// FireBaseAnalyticsUtils.init().send(AD_OPEN_CLOSE);
}
/** Called when fullscreen content failed to show. */
@Override
public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
appOpenAd = null;
isShowing = false;
LLog.d("onAdFailedToShowFullScreenContent: " + adError.getMessage());
if (null != onShowAdEndCallBack) {
onShowAdEndCallBack.onShowAdFailed(adError.getMessage());
onShowAdEndCallBack = null;
}
loadAd();
// FireBaseAnalyticsUtils.init().send(AD_OPEN_SHOW_FAILED);
}
/** Called when fullscreen content is shown. */
@Override
public void onAdShowedFullScreenContent() {
LLog.d("onAdShowedFullScreenContent.");
}
@Override
public void onAdImpression() {
super.onAdImpression();
LLog.d("onAdImpression.");
// FireBaseAnalyticsUtils.init().send(AD_OPEN_EXP);
}
@Override
public void onAdClicked() {
super.onAdClicked();
// FireBaseAnalyticsUtils.init().send(AD_OPEN_CLK);
}
});
isShowing = true;
appOpenAd.show(activity);
return true;
}
public void setOnLoadAdCallBack(OnLoadAdEndCallBack onLoadAdEndCallBack) {
this.onLoadAdEndCallBack = onLoadAdEndCallBack;
}
public void setOnShowAdCallBack(OnShowAdEndCallBack onShowAdEndCallBack) {
this.onShowAdEndCallBack = onShowAdEndCallBack;
}
/**
* Load an ad.
*
*/
public void loadAd() {
// Do not load ad if there is an unused ad or one is already loading.
if (isLoading || isAdAvailable()) {
return;
}
isLoading = true;
AdRequest request = new AdRequest.Builder().build();
AppOpenAd.load(
BaseApplication.getApplication(),
AD_UNIT_ID,
request,
new AppOpenAd.AppOpenAdLoadCallback() {
/**
* Called when an app open ad has loaded.
*
* @param ad the loaded app open ad.
*/
@Override
public void onAdLoaded(AppOpenAd ad) {
appOpenAd = ad;
isLoading = false;
loadTime = (new Date()).getTime();
if (onLoadAdEndCallBack != null) {
onLoadAdEndCallBack.onLoadAdComplete();
onLoadAdEndCallBack = null;
}
LLog.d("onAdLoaded.");
// FireBaseAnalyticsUtils.init().send(AD_OPEN_LOAD_SUCCESS);
}
/**
* Called when an app open ad has failed to load.
*
* @param loadAdError the error.
*/
@Override
public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
isLoading = false;
if (onLoadAdEndCallBack != null) {
onLoadAdEndCallBack.onLoadAdFailed(loadAdError.getMessage());
onLoadAdEndCallBack = null;
}
LLog.d("onAdFailedToLoad: " + loadAdError.getMessage());
// FireBaseAnalyticsUtils.init().send(AD_OPEN_LOAD_FAILED);
}
});
// FireBaseAnalyticsUtils.init().send(AD_OPEN_START_LOAD);
}
// {
// "Code": 0,
// "Message": "Error while connecting to ad server: SSL handshake aborted: ssl=0x7f75486ac0: I\/O error during system call, Connection reset by peer",
// "Domain": "com.google.android.gms.ads",
// "Cause": "null",
// "Response Info": {
// "Response ID": "null",
// "Mediation Adapter Class Name": "",
// "Adapter Responses": [],
// "Response Extras": {}
// }
// }
{
// "Code": 0,
// "Message": "Received error HTTP response code: 403",
// "Domain": "com.google.android.gms.ads",
// "Cause": "null",
// "Response Info": {
// "Response ID": "null",
// "Mediation Adapter Class Name": "",
// "Adapter Responses": [],
// "Response Extras": {}
// }
// {
// "Code": 0,
// "Message": "Error while connecting to ad server: SSL handshake aborted: ssl=0x7f6dc9f100: I\/O error during system call, Connection reset by peer",
// "Domain": "com.google.android.gms.ads",
// "Cause": "null",
// "Response Info": {
// "Response ID": "null",
// "Mediation Adapter Class Name": "",
// "Adapter Responses": [],
// "Response Extras": {}
// }
// }
}
}
......@@ -9,4 +9,8 @@
<string name="clear">Clear</string>
<string name="privacy_policy">Privacy Policy</string>
<string name="about_us">About Us</string>
<string name="fb_id">222231504258065</string>
<string name="fb_token">25dfa51eb411179f76070ff073bd4948</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment