adjust ad
This commit is contained in:
parent
7d2a6467db
commit
a06e45c303
|
@ -13,7 +13,8 @@ android {
|
|||
compileSdkVersion 28
|
||||
buildToolsVersion "28.0.3"
|
||||
defaultConfig {
|
||||
applicationId "com.qq.e.union.demo"
|
||||
// applicationId "com.qq.e.union.demo"
|
||||
applicationId "com.novelbook.android"
|
||||
minSdkVersion 19 //target 19 Android 4.4 以下版本仅占比4.1%
|
||||
targetSdkVersion 28
|
||||
versionCode 5
|
||||
|
@ -39,12 +40,12 @@ android {
|
|||
buildConfigField "boolean", "LOG_DEBUG", "true"
|
||||
buildConfigField "String", "MAIN_HOST", '"http://xiaoshuofenxiang.com/api/"'
|
||||
buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"'
|
||||
buildConfigField "String","AD_TOUTIAO_APP_ID",'"5019267"'
|
||||
/* buildConfigField "String","AD_TOUTIAO_APP_ID",'"5019267"'
|
||||
buildConfigField "String","AD_SLOT_TOUTIAO_FEEDAD_ID",'"919267464"'
|
||||
buildConfigField "String","AD_SLOT_TOUTIAO_SPLASH_ID",'"819267134"'
|
||||
buildConfigField "String","AD_SLOT_TOUTIAO_BANNER_ID",'"919267016"'
|
||||
buildConfigField "String","AD_SLOT_TOUTIAO_BANNER_NATIVE_ID",'"919267816"'
|
||||
buildConfigField "String","AD_SLOT_TOUTIAO_INTERACTION_ID",'"919267451"'
|
||||
buildConfigField "String","AD_SLOT_TOUTIAO_INTERACTION_ID",'"919267451"'*/
|
||||
// buildConfigField "String", "API_HOST", '""'
|
||||
versionNameSuffix "-debug"
|
||||
minifyEnabled false
|
||||
|
|
|
@ -66,10 +66,18 @@
|
|||
android:launchMode="singleTop"
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@style/ToolBarTheme.NoActionBar">
|
||||
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".AD.SplashActivity"
|
||||
android:configChanges="keyboard|orientation|screenSize"
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@style/Theme.Splash">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".FileActivity"
|
||||
|
@ -147,7 +155,7 @@
|
|||
</provider> <!-- qq ad end -->
|
||||
|
||||
<!-- chuanshanjia ad -->
|
||||
<activity
|
||||
<!--<activity
|
||||
android:name=".AD.toutiao.SplashActivity"
|
||||
android:configChanges="keyboard|orientation|screenSize"
|
||||
android:screenOrientation="portrait"
|
||||
|
@ -155,7 +163,7 @@
|
|||
|
||||
|
||||
</activity>
|
||||
|
||||
-->
|
||||
<uses-library
|
||||
android:name="org.apache.http.legacy"
|
||||
android:required="false" />
|
||||
|
|
|
@ -0,0 +1,487 @@
|
|||
package com.novelbook.android.AD;
|
||||
|
||||
import android.Manifest;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.provider.Settings;
|
||||
import android.support.annotation.MainThread;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.bytedance.sdk.openadsdk.AdSlot;
|
||||
import com.bytedance.sdk.openadsdk.TTAdNative;
|
||||
import com.bytedance.sdk.openadsdk.TTSplashAd;
|
||||
import com.novelbook.android.AD.toutiao.TTAdManagerHolder;
|
||||
import com.novelbook.android.AD.toutiao.WeakHandler;
|
||||
import com.novelbook.android.BuildConfig;
|
||||
import com.novelbook.android.Main2Activity;
|
||||
import com.novelbook.android.R;
|
||||
import com.novelbook.android.utils.Constants;
|
||||
import com.qq.e.ads.splash.SplashAD;
|
||||
import com.qq.e.ads.splash.SplashADListener;
|
||||
import com.qq.e.comm.util.AdError;
|
||||
|
||||
import org.litepal.util.Const;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
|
||||
import static com.novelbook.android.utils.AdUtil.getAppID;
|
||||
|
||||
|
||||
/**
|
||||
* 开屏广告Activity示例
|
||||
*/
|
||||
public class SplashActivity extends Activity implements WeakHandler.IHandler, SplashADListener {
|
||||
private static final String TAG = SplashActivity.class.getSimpleName();
|
||||
|
||||
@BindView(R.id.splash_container)
|
||||
ViewGroup mSplashContainer;
|
||||
|
||||
//--------tencent--->
|
||||
|
||||
private SplashAD splashAD;
|
||||
|
||||
@Nullable
|
||||
@BindView(R.id.skip_view)
|
||||
TextView skipView;
|
||||
//private ImageView splashHolder;
|
||||
@Nullable
|
||||
@BindView(R.id.splash_holder)
|
||||
TextView splashHolder;
|
||||
private static final String SKIP_TEXT = "点击跳过 %d";
|
||||
public boolean canJump = false;
|
||||
/**
|
||||
* 为防止无广告时造成视觉上类似于"闪退"的情况,设定无广告时页面跳转根据需要延迟一定时间,demo
|
||||
* 给出的延时逻辑是从拉取广告开始算开屏最少持续多久,仅供参考,开发者可自定义延时逻辑,如果开发者采用demo
|
||||
* 中给出的延时逻辑,也建议开发者考虑自定义minSplashTimeWhenNoAD的值(单位ms)
|
||||
**/
|
||||
private int minSplashTimeWhenNoAD = 2000;
|
||||
/**
|
||||
* 记录拉取广告的时间
|
||||
*/
|
||||
private long fetchSplashADTime = 0;
|
||||
private Handler handler = new Handler(Looper.getMainLooper());
|
||||
|
||||
//<-----tencent-----
|
||||
|
||||
|
||||
//------toutiao--->
|
||||
private TTAdNative mTTAdNative;
|
||||
|
||||
//是否强制跳转到主页面
|
||||
private boolean mForceGoMain;
|
||||
public static final String EXTR_LUNCHER="luncher";
|
||||
|
||||
//开屏广告加载发生超时但是SDK没有及时回调结果的时候,做的一层保护。
|
||||
private final WeakHandler mHandler = new WeakHandler(this);
|
||||
//开屏广告加载超时时间,建议大于1000,这里为了冷启动第一次加载到广告并且展示,示例设置了2000ms
|
||||
private static final int AD_TIME_OUT = 2000;
|
||||
private static final int MSG_GO_MAIN = 1;
|
||||
//开屏广告是否已经加载
|
||||
private boolean mHasLoaded;
|
||||
|
||||
//-toutiao---<---
|
||||
|
||||
|
||||
@BindView(R.id.textTile)
|
||||
TextView tvTitle;
|
||||
|
||||
@SuppressWarnings("RedundantCast")
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
if(!Constants.AD_SETTING.isShowAdsense() ||!Constants.AD_SETTING.getSplash().isShow() ){
|
||||
goToMainActivity();
|
||||
return;
|
||||
}
|
||||
|
||||
int rid =R.layout.ad_toutiao_activity_splash;
|
||||
if(Constants.AD_SETTING.getSplash().getSource() == Constants.AD_TENCENT_QQ ){
|
||||
rid = R.layout.ad_qq_activity_splash;
|
||||
}else if(Constants.AD_SETTING.getSplash().getSource() == Constants.AD_TOUTIAO ){
|
||||
rid = R.layout.ad_toutiao_activity_splash;
|
||||
}
|
||||
|
||||
setContentView(rid);
|
||||
ButterKnife.bind(this);
|
||||
|
||||
//在合适的时机申请权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题
|
||||
//在开屏时候申请不太合适,因为该页面倒计时结束或者请求超时会跳转,在该页面申请权限,体验不好
|
||||
// TTAdManagerHolder.getInstance(this).requestPermissionIfNecessary(this);
|
||||
//定时,AD_TIME_OUT时间到时执行,如果开屏广告没有加载则跳转到主页面
|
||||
|
||||
getWindow().getDecorView().setSystemUiVisibility(
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
|
||||
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
|
||||
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
||||
// | View.SYSTEM_UI_FLAG_IMMERSIVE
|
||||
);
|
||||
tvTitle.setText(R.string.app_name);
|
||||
//加载开屏广告
|
||||
if(Constants.AD_SETTING.getSplash().getSource() == Constants.AD_TOUTIAO ) {
|
||||
mHandler.sendEmptyMessageDelayed(MSG_GO_MAIN, AD_TIME_OUT);
|
||||
//step2:创建TTAdNative对象
|
||||
try {
|
||||
mTTAdNative = TTAdManagerHolder.get().createAdNative(this);
|
||||
} catch (Exception e) {
|
||||
goToMainActivity();
|
||||
return;
|
||||
}
|
||||
loadSplashAd();
|
||||
}else if(Constants.AD_SETTING.getSplash().getSource() == Constants.AD_TENCENT_QQ ){
|
||||
if (Build.VERSION.SDK_INT >= 23) {
|
||||
checkAndRequestPermission();
|
||||
} else {
|
||||
// 如果是Android6.0以下的机器,默认在安装时获得了所有权限,可以直接调用SDK
|
||||
fetchSplashAD(this, mSplashContainer, skipView, getAppID(Constants.AD_TENCENT_QQ), getPosId(), this, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 跳转到主页面
|
||||
*/
|
||||
private void goToMainActivity() {
|
||||
|
||||
boolean isGoToMain= getIntent().getBooleanExtra(EXTR_LUNCHER,true);
|
||||
if(isGoToMain) {
|
||||
Intent intent = new Intent(SplashActivity.this, Main2Activity.class);
|
||||
startActivity(intent);
|
||||
}
|
||||
if(mSplashContainer!=null) {
|
||||
mSplashContainer.removeAllViews();
|
||||
}
|
||||
|
||||
SplashAdManager.clearPages();
|
||||
|
||||
this.finish();
|
||||
}
|
||||
@Override
|
||||
protected void onResume() {
|
||||
//判断是否该跳转到主页面
|
||||
if (mForceGoMain) {
|
||||
mHandler.removeCallbacksAndMessages(null);
|
||||
goToMainActivity();
|
||||
}
|
||||
super.onResume();
|
||||
if (canJump) {
|
||||
next();
|
||||
}
|
||||
canJump = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
mForceGoMain = true;
|
||||
}
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
canJump = false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
handler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
/**
|
||||
* 加载开屏广告
|
||||
*/
|
||||
private void loadSplashAd() {
|
||||
//step3:创建开屏广告请求参数AdSlot,具体参数含义参考文档
|
||||
AdSlot adSlot = new AdSlot.Builder()
|
||||
.setCodeId(Constants.AD_SETTING.getSplash().getSlotId(Constants.AD_TOUTIAO) )
|
||||
.setSupportDeepLink(true)
|
||||
.setImageAcceptedSize(Constants.SCREEN_WIDTH_PIX, Constants.SCREEN_HEIGHT_PIX)
|
||||
.build();
|
||||
//step4:请求广告,调用开屏广告异步请求接口,对请求回调的广告作渲染处理
|
||||
mTTAdNative.loadSplashAd(adSlot, new TTAdNative.SplashAdListener() {
|
||||
@Override
|
||||
@MainThread
|
||||
public void onError(int code, String message) {
|
||||
Log.d(TAG, message);
|
||||
mHasLoaded = true;
|
||||
showToast(message);
|
||||
goToMainActivity();
|
||||
}
|
||||
|
||||
@Override
|
||||
@MainThread
|
||||
public void onTimeout() {
|
||||
mHasLoaded = true;
|
||||
showToast("开屏广告加载超时");
|
||||
goToMainActivity();
|
||||
}
|
||||
|
||||
@Override
|
||||
@MainThread
|
||||
public void onSplashAdLoad(TTSplashAd ad) {
|
||||
Log.d(TAG, "开屏广告请求成功");
|
||||
SplashAdManager.setSplashTime();
|
||||
mHasLoaded = true;
|
||||
mHandler.removeCallbacksAndMessages(null);
|
||||
if (ad == null) {
|
||||
return;
|
||||
}
|
||||
//获取SplashView
|
||||
View view = ad.getSplashView();
|
||||
mSplashContainer.removeAllViews();
|
||||
//把SplashView 添加到ViewGroup中,注意开屏广告view:width >=70%屏幕宽;height >=50%屏幕宽
|
||||
mSplashContainer.addView(view);
|
||||
//设置不开启开屏广告倒计时功能以及不显示跳过按钮,如果这么设置,您需要自定义倒计时逻辑
|
||||
//ad.setNotAllowSdkCountdown();
|
||||
|
||||
//设置SplashView的交互监听器
|
||||
ad.setSplashInteractionListener(new TTSplashAd.AdInteractionListener() {
|
||||
@Override
|
||||
public void onAdClicked(View view, int type) {
|
||||
Log.d(TAG, "onAdClicked");
|
||||
showToast("开屏广告点击");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdShow(View view, int type) {
|
||||
Log.d(TAG, "onAdShow");
|
||||
showToast("开屏广告展示");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdSkip() {
|
||||
Log.d(TAG, "onAdSkip");
|
||||
showToast("开屏广告跳过");
|
||||
goToMainActivity();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdTimeOver() {
|
||||
Log.d(TAG, "onAdTimeOver");
|
||||
showToast("开屏广告倒计时结束");
|
||||
goToMainActivity();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, AD_TIME_OUT);
|
||||
}
|
||||
|
||||
|
||||
private void showToast(String msg) {
|
||||
//TToast.show(this, msg);
|
||||
Log.d(TAG, "loadBannerAd: " + msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMsg(Message msg) {
|
||||
if (msg.what == MSG_GO_MAIN) {
|
||||
if (!mHasLoaded) {
|
||||
showToast("广告已超时,跳到主页面");
|
||||
goToMainActivity();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||
|
||||
if (keyCode == KeyEvent.KEYCODE_BACK|| keyCode == KeyEvent.KEYCODE_HOME) {
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
return super.onKeyUp(keyCode,event);
|
||||
}
|
||||
|
||||
|
||||
//-----qq ad begin------>
|
||||
/**
|
||||
*
|
||||
* ----------非常重要----------
|
||||
*
|
||||
* Android6.0以上的权限适配简单示例:
|
||||
*
|
||||
* 如果targetSDKVersion >= 23,那么必须要申请到所需要的权限,再调用广点通SDK,否则广点通SDK不会工作。
|
||||
*
|
||||
* Demo代码里是一个基本的权限申请示例,请开发者根据自己的场景合理地编写这部分代码来实现权限申请。
|
||||
* 注意:下面的`checkSelfPermission`和`requestPermissions`方法都是在Android6.0的SDK中增加的API,如果您的App还没有适配到Android6.0以上,则不需要调用这些方法,直接调用广点通SDK即可。
|
||||
*/
|
||||
@TargetApi(Build.VERSION_CODES.M)
|
||||
private void checkAndRequestPermission() {
|
||||
List<String> lackedPermission = new ArrayList<String>();
|
||||
if (!(checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)) {
|
||||
lackedPermission.add(Manifest.permission.READ_PHONE_STATE);
|
||||
}
|
||||
|
||||
if (!(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
|
||||
lackedPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||
}
|
||||
|
||||
if (!(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
|
||||
lackedPermission.add(Manifest.permission.ACCESS_FINE_LOCATION);
|
||||
}
|
||||
|
||||
// 权限都已经有了,那么直接调用SDK
|
||||
if (lackedPermission.size() == 0) {
|
||||
fetchSplashAD(this, mSplashContainer, skipView, getAppID(Constants.AD_TENCENT_QQ), getPosId(), this, 0);
|
||||
} else {
|
||||
// 请求所缺少的权限,在onRequestPermissionsResult中再看是否获得权限,如果获得权限就可以调用SDK,否则不要调用SDK。
|
||||
String[] requestPermissions = new String[lackedPermission.size()];
|
||||
lackedPermission.toArray(requestPermissions);
|
||||
requestPermissions(requestPermissions, 1024);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasAllPermissionsGranted(int[] grantResults) {
|
||||
for (int grantResult : grantResults) {
|
||||
if (grantResult == PackageManager.PERMISSION_DENIED) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
if (requestCode == 1024 && hasAllPermissionsGranted(grantResults)) {
|
||||
fetchSplashAD(this, mSplashContainer, skipView, getAppID(Constants.AD_TENCENT_QQ), getPosId(), this, 0);
|
||||
} else {
|
||||
// 如果用户没有授权,那么应该说明意图,引导用户去设置里面授权。
|
||||
Toast.makeText(this, "应用缺少必要的权限!请点击\"权限\",打开所需要的权限。", Toast.LENGTH_LONG).show();
|
||||
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
||||
intent.setData(Uri.parse("package:" + getPackageName()));
|
||||
startActivity(intent);
|
||||
finish();
|
||||
goToMainActivity();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 拉取开屏广告,开屏广告的构造方法有3种,详细说明请参考开发者文档。
|
||||
*
|
||||
* @param activity 展示广告的activity
|
||||
* @param adContainer 展示广告的大容器
|
||||
* @param skipContainer 自定义的跳过按钮:传入该view给SDK后,SDK会自动给它绑定点击跳过事件。SkipView的样式可以由开发者自由定制,其尺寸限制请参考activity_splash.xml或者接入文档中的说明。
|
||||
* @param appId 应用ID
|
||||
* @param posId 广告位ID
|
||||
* @param adListener 广告状态监听器
|
||||
* @param fetchDelay 拉取广告的超时时长:取值范围[3000, 5000],设为0表示使用广点通SDK默认的超时时长。
|
||||
*/
|
||||
private void fetchSplashAD(Activity activity, ViewGroup adContainer, View skipContainer,
|
||||
String appId, String posId, SplashADListener adListener, int fetchDelay) {
|
||||
fetchSplashADTime = System.currentTimeMillis();
|
||||
Map<String, String> tags = new HashMap<>();
|
||||
tags.put("tag_s1", "value_s1");
|
||||
tags.put("tag_s2", "value_s2");
|
||||
|
||||
splashAD = new SplashAD(activity, adContainer, skipContainer, appId, posId, adListener,
|
||||
fetchDelay, tags);
|
||||
// 如果不需要传tag,使用如下构造函数
|
||||
// splashAD = new SplashAD(activity, adContainer, skipContainer, appId, posId, adListener, fetchDelay);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onADPresent() {
|
||||
Log.i("AD_DEMO", "SplashADPresent");
|
||||
SplashAdManager.setSplashTime();
|
||||
splashHolder.setVisibility(View.INVISIBLE); // 广告展示后一定要把预设的开屏图片隐藏起来
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onADClicked() {
|
||||
Log.i("AD_DEMO", "SplashADClicked clickUrl: "
|
||||
+ (splashAD.getExt() != null ? splashAD.getExt().get("clickUrl") : ""));
|
||||
}
|
||||
|
||||
/**
|
||||
* 倒计时回调,返回广告还将被展示的剩余时间。
|
||||
* 通过这个接口,开发者可以自行决定是否显示倒计时提示,或者还剩几秒的时候显示倒计时
|
||||
*
|
||||
* @param millisUntilFinished 剩余毫秒数
|
||||
*/
|
||||
@Override
|
||||
public void onADTick(long millisUntilFinished) {
|
||||
Log.i("AD_DEMO", "SplashADTick " + millisUntilFinished + "ms");
|
||||
skipView.setText(String.format(SKIP_TEXT, Math.round(millisUntilFinished / 1000f)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onADExposure() {
|
||||
Log.i("AD_DEMO", "SplashADExposure");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onADDismissed() {
|
||||
Log.i("AD_DEMO", "SplashADDismissed");
|
||||
next();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNoAD(AdError error) {
|
||||
Log.i(
|
||||
"AD_DEMO",
|
||||
String.format("LoadSplashADFail, eCode=%d, errorMsg=%s", error.getErrorCode(),
|
||||
error.getErrorMsg()));
|
||||
/**
|
||||
* 为防止无广告时造成视觉上类似于"闪退"的情况,设定无广告时页面跳转根据需要延迟一定时间,demo
|
||||
* 给出的延时逻辑是从拉取广告开始算开屏最少持续多久,仅供参考,开发者可自定义延时逻辑,如果开发者采用demo
|
||||
* 中给出的延时逻辑,也建议开发者考虑自定义minSplashTimeWhenNoAD的值
|
||||
**/
|
||||
long alreadyDelayMills = System.currentTimeMillis() - fetchSplashADTime;//从拉广告开始到onNoAD已经消耗了多少时间
|
||||
long shouldDelayMills = alreadyDelayMills > minSplashTimeWhenNoAD ? 0 : minSplashTimeWhenNoAD
|
||||
- alreadyDelayMills;//为防止加载广告失败后立刻跳离开屏可能造成的视觉上类似于"闪退"的情况,根据设置的minSplashTimeWhenNoAD
|
||||
// 计算出还需要延时多久
|
||||
handler.postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
SplashActivity.this.finish();
|
||||
goToMainActivity();
|
||||
}
|
||||
}, shouldDelayMills);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置一个变量来控制当前开屏页面是否可以跳转,当开屏广告为普链类广告时,点击会打开一个广告落地页,此时开发者还不能打开自己的App主页。当从广告落地页返回以后,
|
||||
* 才可以跳转到开发者自己的App主页;当开屏广告是App类广告时只会下载App。
|
||||
*/
|
||||
private void next() {
|
||||
if (canJump) {
|
||||
goToMainActivity();
|
||||
this.finish();
|
||||
|
||||
} else {
|
||||
canJump = true;
|
||||
}
|
||||
}
|
||||
private String getPosId() {
|
||||
return Constants.AD_SETTING.getSplash().getSlotId(Constants.AD_TENCENT_QQ);
|
||||
}
|
||||
|
||||
//----qq ad end <---
|
||||
}
|
|
@ -9,7 +9,7 @@ import android.os.Build;
|
|||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
|
||||
import com.novelbook.android.AD.toutiao.SplashActivity;
|
||||
|
||||
import com.novelbook.android.Main2Activity;
|
||||
import com.novelbook.android.utils.Constants;
|
||||
|
||||
|
@ -21,7 +21,7 @@ import static com.novelbook.android.utils.Constants.AD_TOUTIAO;
|
|||
public class SplashAdManager implements Application.ActivityLifecycleCallbacks, ComponentCallbacks2 {
|
||||
private boolean mIsBackground;
|
||||
private static long lastAd =0;
|
||||
private static long interVal = Constants.AD_SPLASH_INVTERVAL;
|
||||
//private static long interVal = 5000;//Constants.AD_SPLASH_INVTERVAL;
|
||||
private static int pages =0;
|
||||
|
||||
|
||||
|
@ -51,7 +51,7 @@ public class SplashAdManager implements Application.ActivityLifecycleCallbacks,
|
|||
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
|
||||
if(activity instanceof Main2Activity){
|
||||
|
||||
showAd(activity);
|
||||
//showAd(activity);
|
||||
Log.d("zzr", " 启动应用");
|
||||
}
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ public class SplashAdManager implements Application.ActivityLifecycleCallbacks,
|
|||
if (mIsBackground) {
|
||||
mIsBackground = false;
|
||||
|
||||
// showAd(activity);
|
||||
showSplashAd(activity);
|
||||
|
||||
Log.d("zzr", "从广告页回到前台");
|
||||
}
|
||||
|
@ -112,26 +112,30 @@ public class SplashAdManager implements Application.ActivityLifecycleCallbacks,
|
|||
|
||||
}
|
||||
static void showInterAd(Activity activity){
|
||||
|
||||
clearPages();
|
||||
}
|
||||
static void showAd(Activity activity){
|
||||
static void showSplashAd(Activity activity){
|
||||
if(canShowAd()) {
|
||||
lastAd = new Date().getTime();
|
||||
Intent intent =null;
|
||||
if(Constants.AD_SPLASH_SOURCE ==AD_TENCENT_QQ) {
|
||||
Intent intent = new Intent(activity, SplashActivity.class);
|
||||
intent.putExtra(SplashActivity.EXTR_LUNCHER, false);
|
||||
|
||||
|
||||
/* if(Constants.AD_SPLASH_SOURCE ==AD_TENCENT_QQ) {
|
||||
intent = new Intent(activity, com.novelbook.android.AD.qq.SplashActivity.class);
|
||||
}else if(Constants.AD_SPLASH_SOURCE ==AD_TOUTIAO){
|
||||
intent = new Intent(activity, SplashActivity.class);
|
||||
intent.putExtra(SplashActivity.EXTR_LUNCHER, false);
|
||||
}
|
||||
}*/
|
||||
activity.startActivity(intent);
|
||||
}
|
||||
}
|
||||
static boolean canShowAd(){
|
||||
if(!Constants.SHOWAD){
|
||||
if(!Constants.AD_SETTING.isShowAdsense()){
|
||||
return false;
|
||||
}
|
||||
long in = new Date().getTime() -lastAd;
|
||||
int interVal =60000;//Constants.AD_SETTING.getSplash2().getInterval4Display()*1000;
|
||||
Log.d("zzr", "canShowAd: interval is, " +in + ", canshow? "+ (in >interVal));
|
||||
return in >interVal;
|
||||
}
|
||||
|
@ -141,7 +145,7 @@ public class SplashAdManager implements Application.ActivityLifecycleCallbacks,
|
|||
}
|
||||
public static void plusPage(Activity activity){
|
||||
pages++;
|
||||
if(pages >Constants.AD_SPLASH_PAGES){
|
||||
if(pages >Constants.AD_SETTING.getSplash2().getPageCount4Display()){
|
||||
showInterAd(activity);
|
||||
|
||||
}
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
package com.novelbook.android.AD.qq;
|
||||
|
||||
public class Constants {
|
||||
public static final String APPID = "1101152570";
|
||||
public static final String BannerPosID = "9079537218417626401";
|
||||
public static final String InterteristalPosID = "8575134060152130849";
|
||||
public static final String SplashPosID = "8863364436303842593";
|
||||
public static final String NativePosID = "5010320697302671";
|
||||
public static final String NativeVideoPosID = "5090421627704602";
|
||||
public static final String NativeExpressPosID = "7030020348049331"; //如果选择支持视频的模版样式,请使用NativeExpressSupportVideoPosID测试广告位拉取
|
||||
public static final String NativeUnifiedPosID = "6040749702835933";
|
||||
public static final String NativeExpressSupportVideoPosID = "2000629911207832"; //支持视频模版样式的广告位
|
||||
public static final String ContentADPosID = "5060323935699523";
|
||||
public static final String RewardVideoADPosIDSupportH = "2090845242931421";//支持竖版出横版视频
|
||||
public static final String RewardVideoADPosIDUnsupportH = "5040942242835423";//不支持竖版出横版视频
|
||||
public static final String IEGRewardVideoADPosID = "6000625736289442";//内广激励视频广告位id
|
||||
public static final String UNIFIED_BANNER_POS_ID = "4080052898050840";
|
||||
public static final String UNIFIED_INTERSTITIAL_ID_LARGE_SMALL = "3040652898151811";// 大小规格
|
||||
public static final String UNIFIED_INTERSTITIAL_ID_ONLY_SMALL = "8020259898964453";// 只小规格
|
||||
|
||||
public static final String POS_ID = "pos_id";
|
||||
public static final String MAX_VIDEO_DURATION = "maxVideoDuration";
|
||||
public static final int VIDEO_DURATION_SETTING_MIN = 5;
|
||||
public static final int VIDEO_DURATION_SETTING_MAX = 60;
|
||||
}
|
|
@ -22,6 +22,7 @@ import android.widget.Toast;
|
|||
|
||||
import com.novelbook.android.Main2Activity;
|
||||
import com.novelbook.android.R;
|
||||
import com.novelbook.android.utils.Constants;
|
||||
import com.qq.e.ads.splash.SplashAD;
|
||||
import com.qq.e.ads.splash.SplashADListener;
|
||||
import com.qq.e.comm.util.AdError;
|
||||
|
@ -31,6 +32,8 @@ import java.util.HashMap;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static com.novelbook.android.utils.AdUtil.getAppID;
|
||||
|
||||
/**
|
||||
* 这是demo工程的入口Activity,在这里会首次调用广点通的SDK。
|
||||
*
|
||||
|
@ -47,7 +50,7 @@ public class SplashActivity extends Activity implements SplashADListener {
|
|||
private static final String SKIP_TEXT = "点击跳过 %d";
|
||||
|
||||
public boolean canJump = false;
|
||||
private boolean needStartDemoList = true;
|
||||
|
||||
|
||||
/**
|
||||
* 为防止无广告时造成视觉上类似于"闪退"的情况,设定无广告时页面跳转根据需要延迟一定时间,demo
|
||||
|
@ -91,13 +94,12 @@ public class SplashActivity extends Activity implements SplashADListener {
|
|||
checkAndRequestPermission();
|
||||
} else {
|
||||
// 如果是Android6.0以下的机器,默认在安装时获得了所有权限,可以直接调用SDK
|
||||
fetchSplashAD(this, container, skipView, Constants.APPID, getPosId(), this, 0);
|
||||
fetchSplashAD(this, container, skipView, getAppID(Constants.AD_TENCENT_QQ), getPosId(), this, 0);
|
||||
}
|
||||
}
|
||||
|
||||
private String getPosId() {
|
||||
String posId = getIntent().getStringExtra("pos_id");
|
||||
return TextUtils.isEmpty(posId) ? Constants.SplashPosID : posId;
|
||||
return Constants.AD_SETTING.getSplash().getSlotId(Constants.AD_TENCENT_QQ);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -128,7 +130,7 @@ public class SplashActivity extends Activity implements SplashADListener {
|
|||
|
||||
// 权限都已经有了,那么直接调用SDK
|
||||
if (lackedPermission.size() == 0) {
|
||||
fetchSplashAD(this, container, skipView, Constants.APPID, getPosId(), this, 0);
|
||||
fetchSplashAD(this, container, skipView, getAppID(Constants.AD_TENCENT_QQ), getPosId(), this, 0);
|
||||
} else {
|
||||
// 请求所缺少的权限,在onRequestPermissionsResult中再看是否获得权限,如果获得权限就可以调用SDK,否则不要调用SDK。
|
||||
String[] requestPermissions = new String[lackedPermission.size()];
|
||||
|
@ -150,7 +152,7 @@ public class SplashActivity extends Activity implements SplashADListener {
|
|||
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
if (requestCode == 1024 && hasAllPermissionsGranted(grantResults)) {
|
||||
fetchSplashAD(this, container, skipView, Constants.APPID, getPosId(), this, 0);
|
||||
fetchSplashAD(this, container, skipView, getAppID(Constants.AD_TENCENT_QQ), getPosId(), this, 0);
|
||||
} else {
|
||||
// 如果用户没有授权,那么应该说明意图,引导用户去设置里面授权。
|
||||
Toast.makeText(this, "应用缺少必要的权限!请点击\"权限\",打开所需要的权限。", Toast.LENGTH_LONG).show();
|
||||
|
|
|
@ -1,220 +0,0 @@
|
|||
package com.novelbook.android.AD.toutiao;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Message;
|
||||
import android.support.annotation.MainThread;
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.bytedance.sdk.openadsdk.AdSlot;
|
||||
import com.bytedance.sdk.openadsdk.TTAdNative;
|
||||
import com.bytedance.sdk.openadsdk.TTSplashAd;
|
||||
import com.novelbook.android.AD.SplashAdManager;
|
||||
import com.novelbook.android.BuildConfig;
|
||||
import com.novelbook.android.Main2Activity;
|
||||
import com.novelbook.android.R;
|
||||
import com.novelbook.android.utils.Constants;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
|
||||
|
||||
/**
|
||||
* 开屏广告Activity示例
|
||||
*/
|
||||
public class SplashActivity extends Activity implements WeakHandler.IHandler {
|
||||
private static final String TAG = SplashActivity.class.getSimpleName();
|
||||
private TTAdNative mTTAdNative;
|
||||
private FrameLayout mSplashContainer;
|
||||
//是否强制跳转到主页面
|
||||
private boolean mForceGoMain;
|
||||
public static final String EXTR_LUNCHER="luncher";
|
||||
|
||||
//开屏广告加载发生超时但是SDK没有及时回调结果的时候,做的一层保护。
|
||||
private final WeakHandler mHandler = new WeakHandler(this);
|
||||
//开屏广告加载超时时间,建议大于1000,这里为了冷启动第一次加载到广告并且展示,示例设置了2000ms
|
||||
private static final int AD_TIME_OUT = 2000;
|
||||
private static final int MSG_GO_MAIN = 1;
|
||||
//开屏广告是否已经加载
|
||||
private boolean mHasLoaded;
|
||||
@BindView(R.id.textTile)
|
||||
TextView tvTitle;
|
||||
|
||||
@SuppressWarnings("RedundantCast")
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
if(!Constants.SHOWAD){
|
||||
goToMainActivity();
|
||||
return;
|
||||
}
|
||||
setContentView(R.layout.ad_toutiao_activity_splash);
|
||||
ButterKnife.bind(this);
|
||||
mSplashContainer = (FrameLayout) findViewById(R.id.splash_container);
|
||||
//step2:创建TTAdNative对象
|
||||
try {
|
||||
mTTAdNative = TTAdManagerHolder.get().createAdNative(this);
|
||||
}catch (Exception e){
|
||||
goToMainActivity();
|
||||
return;
|
||||
}
|
||||
//在合适的时机申请权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题
|
||||
//在开屏时候申请不太合适,因为该页面倒计时结束或者请求超时会跳转,在该页面申请权限,体验不好
|
||||
// TTAdManagerHolder.getInstance(this).requestPermissionIfNecessary(this);
|
||||
//定时,AD_TIME_OUT时间到时执行,如果开屏广告没有加载则跳转到主页面
|
||||
mHandler.sendEmptyMessageDelayed(MSG_GO_MAIN, AD_TIME_OUT);
|
||||
getWindow().getDecorView().setSystemUiVisibility(
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
|
||||
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
|
||||
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
||||
// | View.SYSTEM_UI_FLAG_IMMERSIVE
|
||||
);
|
||||
tvTitle.setText(R.string.app_name);
|
||||
//加载开屏广告
|
||||
loadSplashAd();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
//判断是否该跳转到主页面
|
||||
if (mForceGoMain) {
|
||||
mHandler.removeCallbacksAndMessages(null);
|
||||
goToMainActivity();
|
||||
}
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
mForceGoMain = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载开屏广告
|
||||
*/
|
||||
private void loadSplashAd() {
|
||||
//step3:创建开屏广告请求参数AdSlot,具体参数含义参考文档
|
||||
AdSlot adSlot = new AdSlot.Builder()
|
||||
.setCodeId(BuildConfig.AD_SLOT_TOUTIAO_SPLASH_ID)
|
||||
.setSupportDeepLink(true)
|
||||
.setImageAcceptedSize(Constants.SCREEN_WIDTH_PIX, Constants.SCREEN_HEIGHT_PIX)
|
||||
.build();
|
||||
//step4:请求广告,调用开屏广告异步请求接口,对请求回调的广告作渲染处理
|
||||
mTTAdNative.loadSplashAd(adSlot, new TTAdNative.SplashAdListener() {
|
||||
@Override
|
||||
@MainThread
|
||||
public void onError(int code, String message) {
|
||||
Log.d(TAG, message);
|
||||
mHasLoaded = true;
|
||||
showToast(message);
|
||||
goToMainActivity();
|
||||
}
|
||||
|
||||
@Override
|
||||
@MainThread
|
||||
public void onTimeout() {
|
||||
mHasLoaded = true;
|
||||
showToast("开屏广告加载超时");
|
||||
goToMainActivity();
|
||||
}
|
||||
|
||||
@Override
|
||||
@MainThread
|
||||
public void onSplashAdLoad(TTSplashAd ad) {
|
||||
Log.d(TAG, "开屏广告请求成功");
|
||||
SplashAdManager.setSplashTime();
|
||||
mHasLoaded = true;
|
||||
mHandler.removeCallbacksAndMessages(null);
|
||||
if (ad == null) {
|
||||
return;
|
||||
}
|
||||
//获取SplashView
|
||||
View view = ad.getSplashView();
|
||||
mSplashContainer.removeAllViews();
|
||||
//把SplashView 添加到ViewGroup中,注意开屏广告view:width >=70%屏幕宽;height >=50%屏幕宽
|
||||
mSplashContainer.addView(view);
|
||||
//设置不开启开屏广告倒计时功能以及不显示跳过按钮,如果这么设置,您需要自定义倒计时逻辑
|
||||
//ad.setNotAllowSdkCountdown();
|
||||
|
||||
//设置SplashView的交互监听器
|
||||
ad.setSplashInteractionListener(new TTSplashAd.AdInteractionListener() {
|
||||
@Override
|
||||
public void onAdClicked(View view, int type) {
|
||||
Log.d(TAG, "onAdClicked");
|
||||
showToast("开屏广告点击");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdShow(View view, int type) {
|
||||
Log.d(TAG, "onAdShow");
|
||||
showToast("开屏广告展示");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdSkip() {
|
||||
Log.d(TAG, "onAdSkip");
|
||||
showToast("开屏广告跳过");
|
||||
goToMainActivity();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdTimeOver() {
|
||||
Log.d(TAG, "onAdTimeOver");
|
||||
showToast("开屏广告倒计时结束");
|
||||
goToMainActivity();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, AD_TIME_OUT);
|
||||
}
|
||||
|
||||
/**
|
||||
* 跳转到主页面
|
||||
*/
|
||||
private void goToMainActivity() {
|
||||
|
||||
/* Intent intent = new Intent(SplashActivity.this, Main2Activity.class);
|
||||
startActivity(intent);*/
|
||||
if(mSplashContainer!=null) {
|
||||
mSplashContainer.removeAllViews();
|
||||
}
|
||||
SplashAdManager.clearPages();
|
||||
this.finish();
|
||||
}
|
||||
|
||||
private void showToast(String msg) {
|
||||
//TToast.show(this, msg);
|
||||
Log.d(TAG, "loadBannerAd: " + msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMsg(Message msg) {
|
||||
if (msg.what == MSG_GO_MAIN) {
|
||||
if (!mHasLoaded) {
|
||||
showToast("广告已超时,跳到主页面");
|
||||
goToMainActivity();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||
|
||||
if (keyCode == KeyEvent.KEYCODE_BACK|| keyCode == KeyEvent.KEYCODE_HOME) {
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
return super.onKeyUp(keyCode,event);
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
package com.novelbook.android.AD.toutiao;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.bytedance.sdk.openadsdk.TTAdConfig;
|
||||
|
@ -10,6 +11,8 @@ import com.bytedance.sdk.openadsdk.TTAdSdk;
|
|||
import com.novelbook.android.BuildConfig;
|
||||
import com.novelbook.android.utils.Constants;
|
||||
|
||||
import static com.novelbook.android.utils.AdUtil.getAppID;
|
||||
|
||||
/**
|
||||
* 可以用一个单例来保存TTAdManager实例,在需要初始化sdk的时候调用
|
||||
*/
|
||||
|
@ -25,7 +28,8 @@ public class TTAdManagerHolder {
|
|||
}
|
||||
|
||||
public static void init(Context context) {
|
||||
if( Constants.SHOWAD) {
|
||||
if( Constants.AD_SETTING.isShowAdsense() &&
|
||||
!TextUtils.isEmpty(getAppID(Constants.AD_TOUTIAO)) ) {
|
||||
doInit(context);
|
||||
}
|
||||
}
|
||||
|
@ -42,13 +46,13 @@ public class TTAdManagerHolder {
|
|||
|
||||
Log.d("adinit", "buildConfig:Constants.SEX= "+Constants.SEX );
|
||||
return new TTAdConfig.Builder()
|
||||
.appId(BuildConfig.AD_TOUTIAO_APP_ID)
|
||||
.appId(getAppID(Constants.AD_TOUTIAO))
|
||||
.useTextureView(false) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView
|
||||
.appName("如意小说")
|
||||
.titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK)
|
||||
.allowShowNotify(true) //是否允许sdk展示通知栏提示
|
||||
.allowShowPageWhenScreenLock(true) //是否在锁屏场景支持展示广告落地页
|
||||
.debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用
|
||||
// .debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用
|
||||
.directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_4G) //允许直接下载的网络状态集合
|
||||
.supportMultiProcess(false) //是否支持多进程,true支持
|
||||
.gender(Constants.SEX==1 ? TTAdConstant.GENDER_MALE : TTAdConstant.GENDER_FEMALE) // TTAdConstant.GENDER_UNKNOWN)
|
||||
|
|
|
@ -59,6 +59,7 @@ import com.novelbook.android.adapter.BookListAdapter;
|
|||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -83,6 +84,7 @@ import org.litepal.util.Const;
|
|||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
|
||||
import static com.novelbook.android.utils.AdUtil.getAppID;
|
||||
import static com.novelbook.android.utils.Constants.AD_TENCENT_QQ;
|
||||
import static com.novelbook.android.utils.Constants.AD_TOUTIAO;
|
||||
|
||||
|
@ -93,7 +95,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
private MyApp application;
|
||||
private Activity_base oContext;
|
||||
protected Gson gson = new Gson();
|
||||
|
||||
protected long mLastBannerTime =0;
|
||||
//---qq ad---->
|
||||
private NativeExpressAD nativeExpressAD;
|
||||
private NativeExpressADView nativeExpressADView;
|
||||
|
@ -177,7 +179,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
if(mBannerContainer==null){
|
||||
return;
|
||||
}
|
||||
if(Constants.SHOWAD){
|
||||
if(Constants.AD_SETTING.isShowAdsense()){
|
||||
loadNativeBannerAd();
|
||||
mBannerContainer.setVisibility(View.VISIBLE);
|
||||
}else{
|
||||
|
@ -410,14 +412,19 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
mBannerContainer.setVisibility(View.VISIBLE);
|
||||
}
|
||||
*/
|
||||
|
||||
if(!Constants.AD_SETTING.isShowAdsense() ){return;}
|
||||
|
||||
mLastBannerTime=0;//复位小banner请求时间戳,否则会在小banner位置显示nati banner 信息
|
||||
|
||||
if (mBannerContainer.getChildCount() > 0) {
|
||||
mBannerContainer.removeAllViews();
|
||||
}
|
||||
|
||||
if(!Constants.SHOWAD ){return;}
|
||||
if(Constants.AD_NATIVE_BANNER_SOURCE == AD_TENCENT_QQ) {
|
||||
|
||||
if(Constants.AD_SETTING.getChapterContentBanner().getSource() == AD_TENCENT_QQ) {
|
||||
loadNativeBanner_qq(-1, 388);
|
||||
}else if(Constants.AD_NATIVE_BANNER_SOURCE == AD_TOUTIAO) {
|
||||
}else if(Constants.AD_SETTING.getChapterContentBanner().getSource() == AD_TOUTIAO) {
|
||||
loadNativeBanner_toutiao(mBannerContainer ,690,388);
|
||||
}
|
||||
}
|
||||
|
@ -428,10 +435,17 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
}
|
||||
|
||||
private void loadBanner( int width, int height){
|
||||
if(Constants.AD_BANNER_SOURCE == AD_TENCENT_QQ) {
|
||||
|
||||
if(mBannerContainer.getChildCount()>0)
|
||||
if (new Date().getTime() - mLastBannerTime < Constants.AD_SETTING.getChapterBanner().getLifeCycleSecond()*1000){
|
||||
Log.d(TAG, String.format("loadBanner:mLastBannerTime %s ,timepassed %s",mLastBannerTime,(new Date().getTime() - mLastBannerTime)/1000));
|
||||
return;
|
||||
}
|
||||
|
||||
Log.d(TAG, "loadBanner:mLastBannerTime start new banner request");
|
||||
if(Constants.AD_SETTING.getChapterBanner().getSource()== AD_TENCENT_QQ) {
|
||||
getBanner_qq();
|
||||
// loadNativeBanner_qq(-1, 388);
|
||||
}else if(Constants.AD_BANNER_SOURCE == AD_TOUTIAO) {
|
||||
}else if(Constants.AD_SETTING.getChapterBanner().getSource()== AD_TOUTIAO) {
|
||||
loadBanner_toutiao(mBannerContainer, width,height);
|
||||
|
||||
}
|
||||
|
@ -444,7 +458,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
Button mCreativeButton;
|
||||
TTAdNative mTTAdNative;
|
||||
void initAD_TouTiao(){
|
||||
if(Constants.SHOWAD)
|
||||
if(Constants.AD_SETTING.isShowAdsense())
|
||||
try {
|
||||
mTTAdNative = TTAdManagerHolder.get().createAdNative(this);
|
||||
//step3:(可选,强烈建议在合适的时机调用):申请部分权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题。
|
||||
|
@ -457,7 +471,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
|
||||
TTAdNative getTTAdNative(){
|
||||
if(mTTAdNative== null){
|
||||
if(Constants.SHOWAD){
|
||||
if(Constants.AD_SETTING.isShowAdsense()){
|
||||
TTAdManagerHolder.init(MyApp.applicationContext);
|
||||
initAD_TouTiao();
|
||||
}
|
||||
|
@ -473,8 +487,8 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
// boolean mShowAd =false;
|
||||
void loadBanner_toutiao(FrameLayout bannerContainer,int width, int height) {
|
||||
//step4:创建广告请求参数AdSlot,具体参数含义参考文档
|
||||
if(!Constants.SHOWAD || getTTAdNative()==null ){return;}
|
||||
String codeId =BuildConfig.AD_SLOT_TOUTIAO_BANNER_ID;
|
||||
if(!Constants.AD_SETTING.isShowAdsense() || getTTAdNative()==null ){return;}
|
||||
String codeId = Constants.AD_SETTING.getChapterBanner().getSlotId(Constants.AD_TOUTIAO) ;
|
||||
/* if(height >390){
|
||||
width =(int)(height*1.78);
|
||||
if(width > Constants.SCREEN_WIDTH_PIX-50 ){
|
||||
|
@ -513,8 +527,9 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
if (bannerView == null) {
|
||||
return;
|
||||
}
|
||||
mLastBannerTime =new Date().getTime();
|
||||
//设置轮播的时间间隔 间隔在30s到120秒之间的值,不设置默认不轮播
|
||||
ad.setSlideIntervalTime(30 * 1000);
|
||||
// ad.setSlideIntervalTime(30 * 1000);
|
||||
bannerContainer.removeAllViews();
|
||||
bannerContainer.addView(bannerView);
|
||||
// bannerContainer.setVisibility(View.VISIBLE);
|
||||
|
@ -619,11 +634,11 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
void loadNativeBanner_toutiao(FrameLayout bannerContainer,int width,int height) {
|
||||
//step4:创建广告请求参数AdSlot,注意其中的setNativeAdtype方法,具体参数含义参考文档
|
||||
|
||||
if (!Constants.SHOWAD || getTTAdNative() == null) {
|
||||
if (!Constants.AD_SETTING.isShowAdsense()|| getTTAdNative() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
String codeId =BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID;
|
||||
String codeId =Constants.AD_SETTING.getChapterContentBanner().getSlotId(Constants.AD_TOUTIAO);
|
||||
|
||||
final String key =width+"_"+height;
|
||||
List<TTNativeAd> adCache =null;
|
||||
|
@ -651,7 +666,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
.setSupportDeepLink(true)
|
||||
.setImageAcceptedSize(width, height)
|
||||
.setNativeAdType(AdSlot.TYPE_BANNER) //请求原生广告时候,请务必调用该方法,设置参数为TYPE_BANNER或TYPE_INTERACTION_AD
|
||||
.setAdCount(3)
|
||||
.setAdCount(1)
|
||||
.build();
|
||||
|
||||
//step5:请求广告,对请求回调的广告作渲染处理
|
||||
|
@ -1010,7 +1025,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
public void loadListAd_toutiao(BookListAdapter adapter, int adCnt, boolean addFooter) {
|
||||
//feed广告请求类型参数
|
||||
AdSlot adSlot = new AdSlot.Builder()
|
||||
.setCodeId(BuildConfig.AD_SLOT_TOUTIAO_FEEDAD_ID)
|
||||
.setCodeId( Constants.AD_SETTING.getInformationFlow().getSlotId(Constants.AD_TOUTIAO) )
|
||||
.setSupportDeepLink(true)
|
||||
.setImageAcceptedSize(228, 150)
|
||||
.setAdCount(adCnt)
|
||||
|
@ -1047,6 +1062,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
|
||||
|
||||
|
||||
|
||||
BannerView bv;
|
||||
private void getBanner_qq() {
|
||||
|
||||
|
@ -1054,8 +1070,13 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
mBannerContainer.removeView(bv);
|
||||
bv.destroy();
|
||||
}
|
||||
if( mBannerContainer.getChildCount()>0){
|
||||
mBannerContainer.removeAllViews();
|
||||
}
|
||||
|
||||
this.bv = new BannerView(this, com.qq.e.ads.banner.ADSize.BANNER,com.novelbook.android.AD.qq.Constants. APPID,com.novelbook.android.AD.qq.Constants.BannerPosID);
|
||||
this.bv = new BannerView(this, com.qq.e.ads.banner.ADSize.BANNER,
|
||||
getAppID(Constants.AD_TENCENT_QQ),
|
||||
Constants.AD_SETTING.getChapterBanner().getSlotId(Constants.AD_TENCENT_QQ));
|
||||
// 注意:如果开发者的banner不是始终展示在屏幕中的话,请关闭自动刷新,否则将导致曝光率过低。
|
||||
// 并且应该自行处理:当banner广告区域出现在屏幕后,再手动loadAD。
|
||||
// bv.setRefresh(0);
|
||||
|
@ -1076,6 +1097,8 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
});
|
||||
mBannerContainer.addView(bv);
|
||||
this.bv.loadAD();
|
||||
|
||||
mLastBannerTime =new Date().getTime();
|
||||
}
|
||||
|
||||
|
||||
|
@ -1092,7 +1115,9 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
}*/
|
||||
|
||||
|
||||
nativeExpressAD = new NativeExpressAD(this, getMyADSize(adWidth, adHeight), com.novelbook.android.AD.qq.Constants.APPID, com.novelbook.android.AD.qq.Constants.NativeExpressPosID, this); // 这里的Context必须为Activity
|
||||
nativeExpressAD = new NativeExpressAD(this, getMyADSize(adWidth, adHeight),
|
||||
getAppID(Constants.AD_TENCENT_QQ),
|
||||
Constants.AD_SETTING.getChapterContentBanner().getSlotId(Constants.AD_TENCENT_QQ), this); // 这里的Context必须为Activity
|
||||
/* nativeExpressAD.setVideoOption(new VideoOption.Builder()
|
||||
.setAutoPlayPolicy(VideoOption.AutoPlayPolicy.WIFI) // 设置什么网络环境下可以自动播放视频
|
||||
.setAutoPlayMuted(true) // 设置自动播放视频时,是否静音
|
||||
|
@ -1171,6 +1196,7 @@ public abstract class Activity_base extends AppCompatActivity implements Native
|
|||
}*/
|
||||
bindAD(adList);
|
||||
|
||||
|
||||
}
|
||||
void bindAD(List<NativeExpressADView> adList){
|
||||
if (nativeExpressADView != null) {
|
||||
|
|
|
@ -85,6 +85,8 @@ import java.util.List;
|
|||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
|
||||
import static com.novelbook.android.utils.AdUtil.getAppID;
|
||||
|
||||
|
||||
/**
|
||||
* A simple {@link Fragment} subclass.
|
||||
|
@ -157,7 +159,7 @@ public abstract class BasicFragment extends Fragment implements NativeADUnifie
|
|||
initData();
|
||||
initViews();
|
||||
initSwipeRefreshLayout();
|
||||
if (mBannerContainer!=null && !Constants.SHOWAD) {
|
||||
if (mBannerContainer!=null && !Constants.AD_SETTING.isShowAdsense()) {
|
||||
if( mBannerContainer.getVisibility() !=View.GONE) {
|
||||
mBannerContainer.setVisibility(View.GONE);
|
||||
}
|
||||
|
@ -444,19 +446,6 @@ void initTabs(){
|
|||
initData();
|
||||
} //on tab changed
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
error_try=0;
|
||||
showBanner(mBannerContainer,(int) getResources().getDimension(R.dimen.topBannerHeight) );
|
||||
// MobclickAgent.onPageStart(TAG);
|
||||
}
|
||||
@Override
|
||||
public void onPause(){
|
||||
super.onPause();
|
||||
hideProgress();
|
||||
// MobclickAgent.onPageEnd(TAG);
|
||||
}
|
||||
|
||||
void retryErorr(int msg){
|
||||
if(error_try<error_try_max){
|
||||
|
@ -476,7 +465,7 @@ void initTabs(){
|
|||
return;
|
||||
}
|
||||
// bannerContainer.setVisibility(View.GONE);
|
||||
if (!Constants.SHOWAD) {
|
||||
if (!Constants.AD_SETTING.isShowAdsense()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -490,24 +479,28 @@ void initTabs(){
|
|||
private List<NativeUnifiedADData> mAds = new ArrayList<>();
|
||||
public void loadListAd_qq(BookListAdapter adapter, int adCnt, boolean addFooter) {
|
||||
if(mAdManager==null) {
|
||||
mAdManager = new NativeUnifiedAD(activity, com.novelbook.android.AD.qq.Constants.APPID,
|
||||
com.novelbook.android.AD.qq.Constants.UNIFIED_INTERSTITIAL_ID_ONLY_SMALL, this);
|
||||
mAdManager = new NativeUnifiedAD(activity,
|
||||
getAppID(Constants.AD_TENCENT_QQ),
|
||||
Constants.AD_SETTING.getInformationFlow().getSlotId(Constants.AD_TENCENT_QQ),
|
||||
this);
|
||||
}
|
||||
mAdManager.loadData(adCnt);
|
||||
qqAdapter =adapter;
|
||||
qqAddFooter=addFooter;
|
||||
|
||||
Log.d(TAG, "loadListAd_qq: ad requested");
|
||||
}
|
||||
|
||||
private boolean qqAddFooter;
|
||||
private BookListAdapter qqAdapter;
|
||||
@Override
|
||||
public void onADLoaded(List<NativeUnifiedADData> ads) {
|
||||
Log.d(TAG, "loadListAd_qq: ad onADLoaded,qqAddFooter? "+qqAddFooter);
|
||||
// mIsLoading = false;
|
||||
// 防止在onDestory后网络回包
|
||||
if(qqAdapter==null){
|
||||
return;
|
||||
}
|
||||
|
||||
if(qqAddFooter) {
|
||||
qqAdapter.AddFooterItem(ads);
|
||||
}else{
|
||||
|
@ -516,6 +509,7 @@ void initTabs(){
|
|||
}
|
||||
@Override
|
||||
public void onNoAD(AdError adError) {
|
||||
Log.d(TAG, "loadListAd_qq: ad onNoAD " );
|
||||
Log.i(
|
||||
TAG,
|
||||
String.format("onNoAD, error code: %d, error msg: %s", adError.getErrorCode(),
|
||||
|
@ -528,11 +522,26 @@ void initTabs(){
|
|||
* 加载 toutiao feed广告
|
||||
*/
|
||||
void loadListAd( BookListAdapter adapter, int adCnt, boolean addFooter) {
|
||||
if(Constants.AD_UNIFIED_RECYCLE_SOURCE==1) {
|
||||
if(Constants.AD_SETTING.getInformationFlow().getSource()==Constants.AD_TENCENT_QQ) {
|
||||
loadListAd_qq(adapter, adCnt, addFooter);
|
||||
}else if(Constants.AD_UNIFIED_RECYCLE_SOURCE==2){
|
||||
}else if(Constants.AD_SETTING.getInformationFlow().getSource()==Constants.AD_TOUTIAO){
|
||||
activity.loadListAd_toutiao(adapter, adCnt, addFooter);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
error_try=0;
|
||||
showBanner(mBannerContainer,(int) getResources().getDimension(R.dimen.topBannerHeight) );
|
||||
// MobclickAgent.onPageStart(TAG);
|
||||
}
|
||||
@Override
|
||||
public void onPause(){
|
||||
super.onPause();
|
||||
hideProgress();
|
||||
// MobclickAgent.onPageEnd(TAG);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -467,7 +467,22 @@ public class Fragment_Shelf extends BasicFragment {
|
|||
isSelectAll = !isSelectAll;
|
||||
mChkAdapter.notifyDataSetChanged();
|
||||
} else if (view.getId() == R.id.btnDelete) {
|
||||
List<Integer> toRemove = new ArrayList<Integer>();
|
||||
|
||||
|
||||
new AlertDialog.Builder(activity)
|
||||
.setTitle(this.getString(R.string.app_name))
|
||||
.setMessage( "您将从书架移除选中的书籍,是否继续?")
|
||||
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
return;
|
||||
|
||||
|
||||
}
|
||||
})
|
||||
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
for (int i = 0; i < bookLists.size(); i++) {
|
||||
if (flag[i]) {
|
||||
Novel nv = bookLists.get(i);
|
||||
|
@ -485,12 +500,24 @@ public class Fragment_Shelf extends BasicFragment {
|
|||
nv.update(nv.getId());
|
||||
// nv.update(nv.getId()); //not work,,,If you set a default value to a field, the corresponding column won't be updated.
|
||||
}
|
||||
|
||||
bookLists = Novel.getNovelsOnShelf();
|
||||
flag = new boolean[bookLists.size()];
|
||||
zhengliShelf();
|
||||
initData();
|
||||
// flag = new boolean[bookLists.size()];
|
||||
// bookLists.remove(i);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
.setCancelable(false).show();
|
||||
|
||||
|
||||
|
||||
// List<Integer> toRemove = new ArrayList<Integer>();
|
||||
|
||||
|
||||
/*for (int i = 0; i < bookLists.size(); i++) {
|
||||
if (flag[i]) {
|
||||
bookLists.remove(i);
|
||||
|
@ -498,10 +525,7 @@ public class Fragment_Shelf extends BasicFragment {
|
|||
}
|
||||
}
|
||||
*/
|
||||
bookLists = Novel.getNovelsOnShelf();
|
||||
flag = new boolean[bookLists.size()];
|
||||
zhengliShelf();
|
||||
initData();
|
||||
|
||||
// mChkAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
|
|
|
@ -9,7 +9,9 @@ import android.util.Log;
|
|||
import com.bytedance.sdk.openadsdk.TTAdConfig;
|
||||
import com.bytedance.sdk.openadsdk.TTAdConstant;
|
||||
import com.bytedance.sdk.openadsdk.TTAdSdk;
|
||||
import com.google.gson.Gson;
|
||||
import com.novelbook.android.AD.toutiao.TTAdManagerHolder;
|
||||
import com.novelbook.android.bean.AdSetting;
|
||||
import com.novelbook.android.netutils.HttpMethods;
|
||||
import com.novelbook.android.netutils.NetUtil;
|
||||
import com.novelbook.android.utils.Config;
|
||||
|
@ -48,16 +50,20 @@ public class MyApp extends Application {
|
|||
private void initialConstants(){
|
||||
Config config= Config.createConfig(this);
|
||||
Constants.SEX = config.getSexOption();
|
||||
Constants.SHOWAD =config.isShowAd();
|
||||
Constants.PRE_LOAD_CHAPT =config.isPreLoadChapter();
|
||||
Gson gson = new Gson();
|
||||
Constants.AD_SETTING = gson.fromJson(config.getAdSetting(), AdSetting.class);
|
||||
if(Constants.AD_SETTING==null){
|
||||
Constants.AD_SETTING = new AdSetting();
|
||||
}
|
||||
|
||||
/* Constants.SHOWAD =config.isShowAd();
|
||||
Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT = config.getAdTopBannerRate();
|
||||
Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT= config.getAdNativeBannerInLinesRate() ;
|
||||
|
||||
Constants.AD_SPLASH_SOURCE=config.getAdSplashSource();
|
||||
Constants.AD_UNIFIED_RECYCLE_SOURCE=config.getAdUnifiedRecycleSource();
|
||||
Constants.AD_NATIVE_BANNER_SOURCE=config.getAdNativeBannerSource();
|
||||
Constants.AD_BANNER_SOURCE=config.getAdBannerSource();
|
||||
Constants.AD_BANNER_SOURCE=2;//config.getAdBannerSource();*/
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1100,14 +1100,9 @@ public class ReadActivity extends Activity_base implements AdInterface {
|
|||
}
|
||||
private void hideAdSlot(ViewGroup view){
|
||||
|
||||
if(view.getChildCount()>0) {
|
||||
view.removeAllViews();
|
||||
Log.d(TAG, "loadBannerAd: hideAdSlot()");
|
||||
}
|
||||
|
||||
/* if(view.getVisibility() ==View.VISIBLE) {
|
||||
if(view.getVisibility() ==View.VISIBLE) {
|
||||
view.setVisibility(View.GONE);
|
||||
}*/
|
||||
}
|
||||
/* FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams();
|
||||
params.width =0;
|
||||
view.setLayoutParams(params);*/
|
||||
|
@ -1143,8 +1138,13 @@ public class ReadActivity extends Activity_base implements AdInterface {
|
|||
if( adY >390*Constants.ONE_DP_SIZE){
|
||||
return;
|
||||
}
|
||||
tmpFrame =mBannerContainer;
|
||||
|
||||
if(mBannerContainer.getChildCount()>0) {
|
||||
mBannerContainer.removeAllViews();
|
||||
Log.d(TAG, "loadBannerAd: hideAdSlot()");
|
||||
}
|
||||
tmpFrame =mBannerContainer;
|
||||
mLastBannerTime=0;
|
||||
Log.d(TAG, String.format("loadBannerAd:showNativeBannerInLines width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,height,adY));
|
||||
loadNativeBannerAd(mBannerContainer);
|
||||
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mBannerContainer.getLayoutParams();
|
||||
|
@ -1162,17 +1162,18 @@ public class ReadActivity extends Activity_base implements AdInterface {
|
|||
// hideSystemUI();
|
||||
// mTopBannerContainer.setVisibility(View.INVISIBLE);//翻页引起抖动
|
||||
//mTopBannerContainer.removeAllViews();
|
||||
Log.d(TAG, String.format("loadBannerAd:showTopBanner width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY));
|
||||
// Log.d(TAG, String.format("loadBannerAd:showTopBanner width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY));
|
||||
tmpFrame =mBannerContainer;
|
||||
hideAdSlot(mBannerContainer);
|
||||
// hideAdSlot(mBannerContainer);
|
||||
if(adHeight<=0){
|
||||
return;
|
||||
}
|
||||
int topMargin = adY >200*Constants.ONE_DP_SIZE ? adY -15*Constants.ONE_DP_SIZE :adY -5*Constants.ONE_DP_SIZE;
|
||||
Log.d(TAG, String.format("loadBannerAd:showTopBanner width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY));
|
||||
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mBannerContainer.getLayoutParams();
|
||||
loadBanner(mBannerContainer, Constants.SCREEN_WIDTH_PIX-50,adHeight);
|
||||
// loadNativeBannerAd(mTopBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID, 304,200);
|
||||
params.setMargins(10*Constants.ONE_DP_SIZE, adY -5*Constants.ONE_DP_SIZE, 10*Constants.ONE_DP_SIZE, 0);
|
||||
params.setMargins(10*Constants.ONE_DP_SIZE, topMargin, 10*Constants.ONE_DP_SIZE, 0 );
|
||||
params.width =-1;
|
||||
params.height = (int) getResources().getDimension(R.dimen.topBannerHeight);
|
||||
mBannerContainer.setLayoutParams(params);
|
||||
|
@ -1191,7 +1192,7 @@ public class ReadActivity extends Activity_base implements AdInterface {
|
|||
|
||||
|
||||
|
||||
if(!Constants.SHOWAD){
|
||||
if(!Constants.AD_SETTING.isShowAdsense()){
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1223,12 +1224,6 @@ public class ReadActivity extends Activity_base implements AdInterface {
|
|||
showAdSlot(mNative_status_banner_container);
|
||||
// mNative_banner_container.setVisibility(View.VISIBLE);
|
||||
// showTopBanner(0,0);
|
||||
}else
|
||||
{
|
||||
/* loadBannerAd(mBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_ID, Constants.SCREEN_WIDTH_PIX-50,adHeight);
|
||||
params.setMargins(20, adY-10, 20, 15);
|
||||
mBannerContainer.setLayoutParams(params);
|
||||
mBannerContainer.setVisibility(View.VISIBLE);*/
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,22 +1,129 @@
|
|||
package com.novelbook.android.bean;
|
||||
|
||||
public class AdSetting {
|
||||
private int splashInterval;
|
||||
private int splashPageCount;
|
||||
private String[] appIds={};
|
||||
private slot splash = new slot();
|
||||
private slot splash2 = new slot();
|
||||
private slot informationFlow = new slot();
|
||||
private slot chapterBanner = new slot();
|
||||
private slot chapterContentBanner = new slot();
|
||||
private slot chapterEndBanner = new slot();
|
||||
private slot pop = new slot();
|
||||
private boolean showAdsense;
|
||||
|
||||
public int getSplashInterval() {
|
||||
return splashInterval;
|
||||
public boolean isShowAdsense() {
|
||||
return true;//showAdsense;
|
||||
}
|
||||
|
||||
public void setSplashInterval(int splashInterval) {
|
||||
this.splashInterval = splashInterval;
|
||||
public void setShowAdsense(boolean showAdsense) {
|
||||
this.showAdsense = showAdsense;
|
||||
}
|
||||
|
||||
public int getSplashPageCount() {
|
||||
return splashPageCount;
|
||||
public String[] getAppIds() {
|
||||
return appIds;
|
||||
}
|
||||
|
||||
public void setSplashPageCount(int splashPageCount) {
|
||||
this.splashPageCount = splashPageCount;
|
||||
public slot getSplash() {
|
||||
return splash;
|
||||
}
|
||||
|
||||
public slot getSplash2() {
|
||||
return splash2;
|
||||
}
|
||||
|
||||
public slot getInformationFlow() {
|
||||
return informationFlow;
|
||||
}
|
||||
|
||||
public slot getChapterBanner() {
|
||||
return chapterBanner;
|
||||
}
|
||||
|
||||
public slot getChapterContentBanner() {
|
||||
return chapterContentBanner;
|
||||
}
|
||||
|
||||
public slot getChapterEndBanner() {
|
||||
return chapterEndBanner;
|
||||
}
|
||||
|
||||
public slot getPop() {
|
||||
return pop;
|
||||
}
|
||||
|
||||
|
||||
public class slot{
|
||||
private boolean show;
|
||||
private int source;
|
||||
private int interval4Display;
|
||||
private int pageCount4Display;
|
||||
private String[] slotIds={};
|
||||
private int lifeCycleSecond;
|
||||
private int displayPosition;
|
||||
|
||||
public int getDisplayPosition() {
|
||||
//return 2;
|
||||
return displayPosition;
|
||||
}
|
||||
|
||||
public void setDisplayPosition(int displayPosition) {
|
||||
this.displayPosition = displayPosition;
|
||||
}
|
||||
|
||||
public boolean isShow() {
|
||||
return show;
|
||||
}
|
||||
|
||||
public void setShow(boolean show) {
|
||||
this.show = show;
|
||||
}
|
||||
|
||||
public int getSource() {
|
||||
// return source;
|
||||
return 1;
|
||||
}
|
||||
|
||||
public void setSource(int source) {
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
public int getInterval4Display() {
|
||||
return interval4Display;
|
||||
}
|
||||
|
||||
public void setInterval4Display(int interval4Display) {
|
||||
this.interval4Display = interval4Display;
|
||||
}
|
||||
|
||||
public int getPageCount4Display() {
|
||||
return pageCount4Display;
|
||||
}
|
||||
|
||||
public void setPageCount4Display(int pageCount4Display) {
|
||||
this.pageCount4Display = pageCount4Display;
|
||||
}
|
||||
|
||||
public String[] getSlotIds() {
|
||||
return slotIds;
|
||||
}
|
||||
|
||||
public void setSlotIds(String[] slotIds) {
|
||||
this.slotIds = slotIds;
|
||||
}
|
||||
|
||||
public int getLifeCycleSecond() {
|
||||
return lifeCycleSecond;
|
||||
}
|
||||
|
||||
public void setLifeCycleSecond(int lifeCycleSecond) {
|
||||
this.lifeCycleSecond = lifeCycleSecond;
|
||||
}
|
||||
|
||||
public String getSlotId(int sourceType){
|
||||
if(sourceType>0 && slotIds!=null && slotIds.length >sourceType-1){
|
||||
return slotIds[sourceType-1];
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -323,10 +323,12 @@ public void testUpdate(){
|
|||
/* if(lastUpdateTime > nv.lastVisit && lastUpdateTime > nv.lastUpdateTime){
|
||||
isUpdated =true;
|
||||
}*/
|
||||
isUpdated =lastUpdateTime > nv.lastVisit && lastUpdateTime > nv.lastUpdateTime;
|
||||
isUpdated =lastUpdateTime > nv.lastVisit || lastUpdateTime > nv.lastUpdateTime;
|
||||
Log.d("Novel", String.format("book %s server lastUpdateTime %s, local lastupdatetime %s, local lastvist %s" +
|
||||
"is updated %s,diff1 %s,diff2 %s"
|
||||
,name ,lastUpdateTime,nv.lastUpdateTime,nv.lastVisit,isUpdated,lastUpdateTime - nv.lastVisit,lastUpdateTime - nv.lastUpdateTime) );
|
||||
,name ,lastUpdateTime,nv.lastUpdateTime,nv.lastVisit,isUpdated,
|
||||
lastUpdateTime - nv.lastVisit,
|
||||
lastUpdateTime - nv.lastUpdateTime) );
|
||||
|
||||
if(!isUpdated){
|
||||
setToDefault("isUpdated");
|
||||
|
|
|
@ -21,6 +21,7 @@ import com.novelbook.android.upgrade.UpdateManager;
|
|||
import com.novelbook.android.utils.CommonUtil;
|
||||
import com.novelbook.android.utils.Config;
|
||||
import com.novelbook.android.utils.Constants;
|
||||
import com.novelbook.android.utils.GsonUtil;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
@ -338,7 +339,17 @@ public class NetUtil {
|
|||
//config.setBaseUrl(resultstr);
|
||||
hosts="";
|
||||
Constants.LAST_G = new Date().getTime();
|
||||
String ads = jsonObject.getString("adsenseSetting");
|
||||
config.setAdSetting(ads);
|
||||
Gson gson = new Gson();
|
||||
Constants.AD_SETTING = gson.fromJson(ads, AdSetting.class);
|
||||
|
||||
if (Constants.AD_SETTING.isShowAdsense() ) {
|
||||
TTAdManagerHolder.init(MyApp.applicationContext);
|
||||
}
|
||||
initHostConstants(jsonObject);
|
||||
Constants.PRE_LOAD_CHAPT = jsonObject.getBoolean("preLoadChapter");
|
||||
config.setPreLoadChapter(Constants.PRE_LOAD_CHAPT);
|
||||
// Constants.minVersion =
|
||||
// config.setRootUrl( jsonObject.getString("masterDomains"));
|
||||
isRequestHosts =false;
|
||||
|
@ -366,50 +377,49 @@ public class NetUtil {
|
|||
Constants.updateUrl = TextUtils.isEmpty(tmp) ? Constants.updateUrl : tmp;
|
||||
Constants.minVersion = jsonObject.getInt("minVersion");
|
||||
|
||||
JSONObject ads = jsonObject.getJSONObject("adsenseSetting");
|
||||
// Gson gson = new Gson();
|
||||
// AdSetting ads = gson.fromJson(adStr, AdSetting.class);
|
||||
|
||||
Constants.AD_SPLASH_INVTERVAL = (long) 1000 * ads.getInt("splashInterval");
|
||||
Constants.AD_SPLASH_PAGES = ads.getInt("splashPageCount");
|
||||
Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT = ads.getInt("times4ChapterTopBanner");
|
||||
Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT = ads.getInt("times4ChapterContentBanner");
|
||||
|
||||
/* Constants.AD_SPLASH_SOURCE = ads.getInt("splashSource");
|
||||
Constants.AD_UNIFIED_RECYCLE_SOURCE = ads.getInt("unifiedReceycleSource");
|
||||
Constants.AD_NATIVE_BANNER_SOURCE = ads.getInt("nativeBannerSource");
|
||||
Constants.AD_BANNER_SOURCE = ads.getInt("bannerSource");*/
|
||||
|
||||
if (Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT > 1 && Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT == Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT) {
|
||||
Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT--; //顶部广告和页内广告要错开
|
||||
}
|
||||
|
||||
Log.d(TAG, String.format("initHostConstants: Constants.AD_SPLASH_INVTERVAL %s,AD_SPLASH_PAGES %s", Constants.AD_SPLASH_INVTERVAL, Constants.AD_SPLASH_PAGES));
|
||||
// try {
|
||||
Constants.version = CommonUtil.getVersionCode(MyApp.applicationContext);
|
||||
if (lastUpgradCheck == 0 || Constants.version < Constants.minVersion) {
|
||||
lastUpgradCheck = new Date().getTime();
|
||||
checkUpdate(true);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Gson gson = new Gson();
|
||||
// AdSetting ads = gson.fromJson(adStr, AdSetting.class);
|
||||
|
||||
/* Constants.AD_SPLASH_INVTERVAL = (long) 1000 * ads.getInt("splashInterval");
|
||||
Constants.AD_SPLASH_PAGES = ads.getInt("splashPageCount");
|
||||
Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT = ads.getInt("times4ChapterTopBanner");
|
||||
Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT = ads.getInt("times4ChapterContentBanner");
|
||||
|
||||
Constants.AD_SPLASH_SOURCE = ads.getInt("splashSource");
|
||||
Constants.AD_UNIFIED_RECYCLE_SOURCE = ads.getInt("unifiedReceycleSource");
|
||||
Constants.AD_NATIVE_BANNER_SOURCE = ads.getInt("nativeBannerSource");
|
||||
Constants.AD_BANNER_SOURCE = ads.getInt("bannerSource");
|
||||
|
||||
if (Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT > 1 && Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT == Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT) {
|
||||
Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT--; //顶部广告和页内广告要错开
|
||||
}
|
||||
|
||||
Log.d(TAG, String.format("initHostConstants: Constants.AD_SPLASH_INVTERVAL %s,AD_SPLASH_PAGES %s", Constants.AD_SPLASH_INVTERVAL, Constants.AD_SPLASH_PAGES));
|
||||
*/
|
||||
|
||||
// try {
|
||||
|
||||
// }catch (Exception er){
|
||||
// Log.e(TAG, "initHostConstants: update error ",er );
|
||||
// }
|
||||
|
||||
if (ads.getBoolean("showAdsense")) {
|
||||
if (!Constants.SHOWAD) {
|
||||
Constants.SHOWAD = ads.getBoolean("showAdsense");
|
||||
TTAdManagerHolder.init(MyApp.applicationContext);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Config config = Config.getInstance();
|
||||
Constants.SHOWAD = ads.getBoolean("showAdsense");
|
||||
Constants.PRE_LOAD_CHAPT = jsonObject.getBoolean("preLoadChapter");
|
||||
|
||||
|
||||
config.setShowAd(Constants.SHOWAD);
|
||||
config.setPreLoadChapter(Constants.PRE_LOAD_CHAPT);
|
||||
config.setAdTopBannerRate(Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT);
|
||||
config.setAdNativeBannerInLinesRate(Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT);
|
||||
|
||||
config.setAdSplashSource(Constants.AD_SPLASH_SOURCE);
|
||||
config.setAdUnifiedRecycleSource(Constants.AD_UNIFIED_RECYCLE_SOURCE);
|
||||
config.setAdNativeBannerSource(Constants.AD_NATIVE_BANNER_SOURCE);
|
||||
|
@ -417,7 +427,7 @@ public class NetUtil {
|
|||
|
||||
Log.d(TAG, String.format("initHostConstants: Constants.AD_SPLASH_INVTERVAL %s,AD_SPLASH_PAGES %s, Constants.SHOWAD %s,Constants.AD_PRE_LOAD_CHAPT %s "
|
||||
, Constants.AD_SPLASH_INVTERVAL, Constants.AD_SPLASH_PAGES, Constants.SHOWAD, Constants.PRE_LOAD_CHAPT));
|
||||
|
||||
*/
|
||||
|
||||
}
|
||||
public static void checkUpdate(boolean isSilence){
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
package com.novelbook.android.utils;
|
||||
|
||||
public class AdUtil {
|
||||
public static String getAppID(int sourceType){
|
||||
if( Constants.AD_SETTING==null || Constants.AD_SETTING.getAppIds()==null){
|
||||
return "";
|
||||
}
|
||||
return Constants.AD_SETTING.getAppIds().length> sourceType-1 ? Constants.AD_SETTING.getAppIds()[sourceType-1] :"";
|
||||
}
|
||||
}
|
|
@ -46,7 +46,7 @@ public class Config {
|
|||
private static final String AD_TOP_BANNER_SEEDS_KEY ="topbannerseeds" ;
|
||||
private static final String AD_NATVIE_BANNER_IN_LINES_SEEDS_KEY ="nativebannerinlinesseeds" ;
|
||||
|
||||
|
||||
private final static String AD_KEY = "adkey";
|
||||
|
||||
|
||||
private Context mContext;
|
||||
|
@ -218,18 +218,30 @@ public class Config {
|
|||
sp.edit().putString(KEY_ROOT_URL,baseUrl).commit();
|
||||
}
|
||||
|
||||
public Boolean isShowAd(){
|
||||
return sp.getBoolean(SHOW_AD_KEY,true);
|
||||
}
|
||||
public void setShowAd(boolean isShowAd){
|
||||
sp.edit().putBoolean(SHOW_AD_KEY,isShowAd).commit();
|
||||
}
|
||||
|
||||
public Boolean isPreLoadChapter(){
|
||||
return sp.getBoolean(PRE_LOAD_CHAPT_KEY,false);
|
||||
}
|
||||
public void setPreLoadChapter(boolean isPreloadChapt){
|
||||
sp.edit().putBoolean(PRE_LOAD_CHAPT_KEY,isPreloadChapt).commit();
|
||||
}
|
||||
|
||||
|
||||
public String getAdSetting(){
|
||||
return sp.getString(AD_KEY,"" );
|
||||
}
|
||||
|
||||
public void setAdSetting(String adSetting){
|
||||
sp.edit().putString (AD_KEY,adSetting).commit();
|
||||
}
|
||||
|
||||
/*
|
||||
public Boolean isShowAd(){
|
||||
return sp.getBoolean(SHOW_AD_KEY,true);
|
||||
}
|
||||
public void setShowAd(boolean isShowAd){
|
||||
sp.edit().putBoolean(SHOW_AD_KEY,isShowAd).commit();
|
||||
}
|
||||
public int getAdTopBannerRate(){
|
||||
return sp.getInt(AD_TOP_BANNER_SEEDS_KEY,0);
|
||||
}
|
||||
|
@ -237,10 +249,6 @@ public class Config {
|
|||
public void setAdTopBannerRate(int pageCnt){
|
||||
sp.edit().putInt(AD_TOP_BANNER_SEEDS_KEY,pageCnt).commit();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private final static String AD_NATIVE_BANNER_SOURCE_KEY = "AD_NATIVE_BANNER_SOURCE_KEY";
|
||||
private final static String AD_BANNER_SOURCE_KEY = "AD_BANNER_SOURCE_KEY";
|
||||
private final static String AD_UNIFIED_RECYCLE_SOURCE_KEY = "AD_UNIFIED_RECYCLE_SOURCE_KEY";
|
||||
|
@ -287,5 +295,9 @@ public class Config {
|
|||
public void setAdNativeBannerInLinesRate(int pageCnt){
|
||||
sp.edit().putInt(AD_NATVIE_BANNER_IN_LINES_SEEDS_KEY,pageCnt).commit();
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.novelbook.android.utils;
|
|||
|
||||
|
||||
import com.novelbook.android.R;
|
||||
import com.novelbook.android.bean.AdSetting;
|
||||
import com.novelbook.android.bean.ProgressType;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -15,24 +16,32 @@ public class Constants {
|
|||
public static final int MAXAGE_MULU = 60*60*24*7*2; //2周;;
|
||||
public static final String VERSION_ADDRESS ="version.xml";
|
||||
|
||||
public static AdSetting AD_SETTING;
|
||||
public static final int AD_TENCENT_QQ =1;
|
||||
public static final int AD_TOUTIAO =2;
|
||||
public static final int AD_BANNER_TOP =1;
|
||||
public static final int AD_BANNER_BOTTOM =2;
|
||||
|
||||
public static boolean AD_BACKGROUND_TRANSPARENT =true ;
|
||||
public static boolean SHOWAD =false ;
|
||||
public static int AD_NATIVE_BANNER_SOURCE = 2 ; //1:tencent,2:toutiao
|
||||
public static int AD_BANNER_SOURCE = 1 ; //1:tencent,2:toutiao
|
||||
public static boolean PRE_LOAD_CHAPT = false;
|
||||
public static int SCREEN_HEIGHT_PIX =1920 ;
|
||||
public static int SCREEN_WIDTH_PIX = 1080;
|
||||
|
||||
/* public static boolean SHOWAD =false ;
|
||||
public static int AD_NATIVE_BANNER_SOURCE = 1 ; //1:tencent,2:toutiao
|
||||
public static int AD_BANNER_SOURCE = 2 ; //1:tencent,2:toutiao
|
||||
public static int AD_UNIFIED_RECYCLE_SOURCE = 2 ; //1:tencent,2:toutiao
|
||||
public static int AD_SPLASH_SOURCE = 1 ; //1:tencent,2:toutiao
|
||||
public static int AD_SOURCE =1 ; //1:tencent,2:toutiao
|
||||
public static boolean PRE_LOAD_CHAPT = false;
|
||||
public static long AD_SPLASH_INVTERVAL = 5*60*1000;//间隔5分钟
|
||||
public static int AD_SPLASH_PAGES = 15;
|
||||
public static int SCREEN_HEIGHT_PIX =1920 ;
|
||||
public static int SCREEN_WIDTH_PIX = 1080;
|
||||
public static int AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT=0; //每几页show topbanner
|
||||
public static int AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT=0; //每几页show nativebanner
|
||||
public static int ONE_DP_SIZE =1;
|
||||
public static int AD_CHAPTER_BANNER_POSITION =1;//1 top 2 bottom
|
||||
public static int AD_CHAPTER_BANNER_KEEP_PAGES =20;//1 top 2 bottom
|
||||
public static boolean AD_SHOW_CHAPT_END_BANNER =true;*/
|
||||
|
||||
public static int ONE_DP_SIZE =1;
|
||||
public static long LAST_G = 0;//主目录API上次访问时间
|
||||
public static long MAXAGE_G = 3600;//主目录API上次访问时间
|
||||
public static String[] HOT_KEYS_VALUE = {};
|
||||
|
@ -59,4 +68,5 @@ public class Constants {
|
|||
|
||||
public final static int MAX_PAGE_CNT =10;//最多加载的页数
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -39,6 +39,7 @@ import com.novelbook.android.view.PageWidget;
|
|||
import com.umeng.analytics.MobclickAgent;
|
||||
|
||||
import org.litepal.LitePal;
|
||||
import org.litepal.util.Const;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
@ -52,6 +53,8 @@ import java.util.Map;
|
|||
import java.util.Random;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import static com.novelbook.android.utils.Constants.AD_BANNER_TOP;
|
||||
|
||||
//import static com.baidu.tts.loopj.AsyncHttpClient.log;
|
||||
|
||||
|
||||
|
@ -191,17 +194,20 @@ public class PageFactory implements ChangeSource{
|
|||
private final int MSG_NEXTPAGE_FAIL=4;
|
||||
private final int MSG_HID_AD=5;
|
||||
private final int MSG_SHOW_LOADING=5;
|
||||
private static int totalPageCnt =0;
|
||||
|
||||
public AdInterface getmAd() {
|
||||
return mAd;
|
||||
}
|
||||
|
||||
private static int mNavtiveBannerPlusCnt =0;
|
||||
private int mSmallBannerPlusCnt =0;
|
||||
private int mSmallBannerMinusCnt =0;
|
||||
//页面宽
|
||||
private int mAdHeight;
|
||||
//页面高
|
||||
private int mAdY;
|
||||
private enum AdTpye {TOPBANNER,NATIVEINLINES,CHAPTEREND;};
|
||||
private AdTpye mAdType = AdTpye.TOPBANNER;
|
||||
private enum AdTpye {BANNER,NATIVEINLINES,CHAPTEREND;};
|
||||
private AdTpye mAdType = AdTpye.BANNER;
|
||||
public void setAd(AdInterface ad){
|
||||
mAd =ad;
|
||||
}
|
||||
|
@ -494,9 +500,9 @@ public class PageFactory implements ChangeSource{
|
|||
page.setFirstPage(pageNo==1);
|
||||
page.setPageNo(pageNo);
|
||||
|
||||
if(length >=chars.length){
|
||||
if(Constants.AD_SETTING.getChapterEndBanner().isShow() && length >=chars.length ){
|
||||
if(page.getLines().size()< mLineCount/2)
|
||||
page.setTopBannerHeight(0);
|
||||
page.setBannerHeight(0);
|
||||
}
|
||||
|
||||
chaptPages.add(page);
|
||||
|
@ -513,30 +519,50 @@ public class PageFactory implements ChangeSource{
|
|||
mBookUtil.setPostition(chaptId, position);
|
||||
|
||||
TRPage trPage = new TRPage();
|
||||
totalPageCnt++;
|
||||
|
||||
// Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT = 4;
|
||||
if (Constants.SHOWAD && pageNo > 1) {
|
||||
// Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT = 20;
|
||||
if (Constants.AD_SETTING.isShowAdsense() && pageNo > 1) {
|
||||
mNavtiveBannerPlusCnt++;
|
||||
// Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT = 1;
|
||||
|
||||
if (Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT > 0 && totalPageCnt % Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT == 0) {
|
||||
|
||||
int bannerPagecnt =-20;// Constants.AD_SETTING.getChapterBanner().getPageCount4Display();
|
||||
int nativeBannerPageCnt =20;// Constants.AD_SETTING.getChapterContentBanner().getPageCount4Display();
|
||||
if (Constants.AD_SETTING.getChapterContentBanner().isShow() &&
|
||||
nativeBannerPageCnt > 0 &&
|
||||
mNavtiveBannerPlusCnt >= nativeBannerPageCnt) {
|
||||
mNavtiveBannerPlusCnt = 0;
|
||||
calculateLineCount();
|
||||
int adLines = (int) (mBannerNaviHeight / ((m_fontSize + lineSpace)));
|
||||
if(mLineCount - adLines - 1>0) {
|
||||
|
||||
|
||||
int adLine = new Random().nextInt(mLineCount - adLines - 1);
|
||||
|
||||
adLine = adLine < mLineCount ? adLine : mLineCount - 2;
|
||||
if (adLine > 0) {
|
||||
trPage.setNativeBannerStartLine(adLine);
|
||||
//trPage.setNativeBannerHeight(Constants.AD_CHAPT_NATIVE_BANNER_HEIGHT);
|
||||
trPage.setNativeBannerHeight((int) mBannerNaviHeight);
|
||||
}
|
||||
Log.d(TAG, String.format("getNextChapterPage: pageNo %s, topBannerHeight %s, adLines %s,adLine %s, nativeBannerHeight %s",
|
||||
pageNo, trPage.getTopBannerHeight(), adLines, adLine, trPage.getNativeBannerHeight()));
|
||||
} else if (Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT > 0 && totalPageCnt % Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT == 0) {
|
||||
|
||||
trPage.setTopBannerHeight((int) mBannerTopHeight);
|
||||
Log.d(TAG, String.format("getNextChapterPage: pageNo %s, adLines %s,adLine %s, nativeBannerHeight %s",
|
||||
pageNo, adLines, adLine, trPage.getNativeBannerHeight()));
|
||||
}
|
||||
} else if (Constants.AD_SETTING.getChapterBanner().isShow()) {
|
||||
if (bannerPagecnt <=0 || mSmallBannerPlusCnt < bannerPagecnt) {
|
||||
mSmallBannerPlusCnt++;
|
||||
trPage.setBannerHeight((int) mBannerTopHeight);
|
||||
|
||||
} else {
|
||||
mSmallBannerMinusCnt--;
|
||||
if (mSmallBannerMinusCnt <= 0) {
|
||||
mSmallBannerMinusCnt = bannerPagecnt;
|
||||
mSmallBannerPlusCnt = 0;
|
||||
}
|
||||
}
|
||||
Log.d(TAG, String.format("getNextChapterPage: pageNo %s, topBannerHeight %s,bannerPagecnt %s,mSmallBannerPlusCnt %s,mSmallBannerMinusCnt %s ", pageNo, trPage.getBannerHeight()
|
||||
, bannerPagecnt ,mSmallBannerPlusCnt ,mSmallBannerMinusCnt ));
|
||||
}
|
||||
|
||||
}
|
||||
trPage.setPageNo(pageNo);
|
||||
trPage.setBegin(position + 1);
|
||||
|
@ -1056,9 +1082,9 @@ private void hideSysUI(){
|
|||
paragraphSpace = prate * lineSpace;
|
||||
|
||||
// if(showAd && mAd!=null){
|
||||
mAdHeight=trPage.getTopBannerHeight();
|
||||
mAdHeight= Constants.AD_SETTING.getChapterBanner().getDisplayPosition() ==AD_BANNER_TOP ? trPage.getBannerHeight() :0;
|
||||
mAdY=(int)marginHeight;
|
||||
mAdType =AdTpye.TOPBANNER;
|
||||
mAdType =AdTpye.BANNER;
|
||||
|
||||
// mAd.showTopBanner(trPage.getTopBannerHeight(),(int)(marginHeight));
|
||||
// mAd.showNativeBannerInLines(0,0);
|
||||
|
@ -1132,11 +1158,18 @@ private void hideSysUI(){
|
|||
float adY =y ;//+space;
|
||||
adY= lastLine.length()==0 ?adY-m_fontSize - lineSpace :adY;
|
||||
if(mAdHeight ==0 && showAd ) {
|
||||
|
||||
if(trPage.getBannerHeight()>0){
|
||||
mAdY=(int) (mHeight - statusMarginBottom - trPage.getBannerHeight());
|
||||
mAdHeight = trPage.getBannerHeight();
|
||||
mAdType =AdTpye.BANNER;
|
||||
}else {
|
||||
mAdY=(int)adY;
|
||||
mAdHeight = (int) adHeight;
|
||||
mAdType = AdTpye.CHAPTEREND;
|
||||
}
|
||||
// showAd((int) adHeight, (int) adY);
|
||||
Log.d(TAG, "loadBannerAd: AD is requested, adHeight "+adHeight);
|
||||
Log.d(TAG, String.format("loadBannerAd: AD is requested, adtype %s, adHeight %s",mAdType,adHeight));
|
||||
}
|
||||
// Log.d(TAG,String.format("ad + statusMarginBottom %s ",200+ statusMarginBottom));
|
||||
// Log.d(TAG,String.format("adHeight %s, adY %s",adHeight,adY));
|
||||
|
@ -1230,7 +1263,7 @@ private void hideSysUI(){
|
|||
return;
|
||||
}
|
||||
Log.d(TAG, String.format("loadBannerAd showAd: mAdType %s",mAdType));
|
||||
if(mAdType ==AdTpye.TOPBANNER){
|
||||
if(mAdType ==AdTpye.BANNER){
|
||||
mAd.showTopBanner(mAdHeight,mAdY);
|
||||
}else if(mAdType == AdTpye.NATIVEINLINES){
|
||||
mAd.showNativeBannerInLines(mAdHeight,mAdY);
|
||||
|
@ -1632,14 +1665,14 @@ private void hideSysUI(){
|
|||
if(mBookUtil.getPosition(chaptId)==0) {
|
||||
lines.add("\n");//lines.add("\n");
|
||||
}
|
||||
int adHeight = trpage.getNativeBannerHeight()+trpage.getTopBannerHeight();
|
||||
int adHeight = trpage.getNativeBannerHeight()+trpage.getBannerHeight();
|
||||
calculateLineCount(adHeight );
|
||||
Log.d(TAG, String.format("getNextChapterPage getNextLines: pageNo %s, adHeight %s, totalLines %s",trpage.getPageNo(),adHeight,mLineCount));
|
||||
while (mBookUtil.next(true,chaptId) != -1){
|
||||
char word = (char) mBookUtil.next(false,chaptId);
|
||||
// Log.d(TAG, String.format(" loadchapt getNextLines(), chaptId %s, word '%s'", chaptId,word ));
|
||||
if((word+"").equals(Constants.BAD_CHAR)){
|
||||
continue;
|
||||
// continue;
|
||||
}
|
||||
//判断是否换行
|
||||
if ((word + "" ).equals("\n") ){// if ((word + "" ).equals("\r") && (((char) mBookUtil.next(true)) + "").equals("\n")){
|
||||
|
@ -2074,7 +2107,9 @@ private void hideSysUI(){
|
|||
currentChaptPages =null;
|
||||
preChaptPages=null;
|
||||
nextChaptPages=null;
|
||||
totalPageCnt=0;
|
||||
mNavtiveBannerPlusCnt=0;
|
||||
mSmallBannerMinusCnt =0;
|
||||
mSmallBannerPlusCnt=0;
|
||||
}
|
||||
|
||||
public static Status getStatus(){
|
||||
|
|
|
@ -12,7 +12,7 @@ public class TRPage {
|
|||
private boolean isLastPage;
|
||||
private boolean isFirstPage;
|
||||
private List<String> lines = new ArrayList<>();
|
||||
private int topBannerHeight=0;
|
||||
private int bannerHeight=0;
|
||||
private int nativeBannerStartLine=0;
|
||||
private int nativeBannerHeight=0;
|
||||
public TRPage( ){
|
||||
|
@ -22,12 +22,12 @@ public class TRPage {
|
|||
lines.add(line);
|
||||
}
|
||||
|
||||
public int getTopBannerHeight() {
|
||||
return topBannerHeight;
|
||||
public int getBannerHeight() {
|
||||
return bannerHeight;
|
||||
}
|
||||
|
||||
public void setTopBannerHeight(int topBannerHeight) {
|
||||
this.topBannerHeight = topBannerHeight;
|
||||
public void setBannerHeight(int bannerHeight) {
|
||||
this.bannerHeight = bannerHeight;
|
||||
}
|
||||
|
||||
public int getChapterNo() {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<resources>
|
||||
<string name="app_name">qqAd网书助手</string>
|
||||
<string name="app_name">网书助手</string>
|
||||
<string name="title_home">书架</string>
|
||||
<string name="title_dashboard">书城</string>
|
||||
<string name="title_notifications">排行榜</string>
|
||||
|
|
|
@ -104,7 +104,6 @@
|
|||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javac" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/legacy_multidex_aapt_derived_proguard_rules" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/legacy_multidex_main_dex_list" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifest-checker" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_assets" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_manifests" />
|
||||
|
|
Loading…
Reference in New Issue