package com.novelbook.android; import android.Manifest; import android.annotation.TargetApi; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.graphics.Point; import android.location.LocationManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.androidquery.callback.ImageOptions; /*import com.androidquery.AQuery; import com.androidquery.callback.AQuery2; import com.bytedance.sdk.openadsdk.AdSlot; import com.bytedance.sdk.openadsdk.TTAdConstant; import com.bytedance.sdk.openadsdk.TTAdDislike; import com.bytedance.sdk.openadsdk.TTAdNative; import com.bytedance.sdk.openadsdk.TTAppDownloadListener; import com.bytedance.sdk.openadsdk.TTBannerAd; import com.bytedance.sdk.openadsdk.TTFeedAd; import com.bytedance.sdk.openadsdk.TTImage; import com.bytedance.sdk.openadsdk.TTInteractionAd; import com.bytedance.sdk.openadsdk.TTNativeAd;*/ import com.google.android.gms.ads.AdListener; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdSize; import com.google.android.gms.ads.AdView; import com.google.android.gms.ads.MobileAds; import com.google.gson.Gson; import com.novelbook.android.AD.toutiao.TTAdManagerHolder; import com.novelbook.android.bean.AdSetting; import com.novelbook.android.db.Novel; import com.novelbook.android.netutils.NetUtil; //import com.novelbook.android.permision.RuntimeRationale; import com.novelbook.android.upgrade.UpdateManager; import com.novelbook.android.utils.CommonUtil; import com.novelbook.android.utils.Constants; import com.novelbook.android.utils.ImageUtil; import com.novelbook.android.utils.OnItemClickListener; 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; import java.util.concurrent.ConcurrentHashMap; import com.qq.e.ads.banner.AbstractBannerADListener; import com.qq.e.ads.banner.BannerView; import com.qq.e.ads.banner2.UnifiedBannerADListener; import com.qq.e.ads.banner2.UnifiedBannerView; import com.qq.e.ads.cfg.VideoOption; import com.qq.e.ads.nativ.ADSize; import com.qq.e.ads.nativ.NativeADUnifiedListener; import com.qq.e.ads.nativ.NativeExpressAD; import com.qq.e.ads.nativ.NativeExpressADView; import com.qq.e.ads.nativ.NativeExpressMediaListener; import com.qq.e.ads.nativ.NativeUnifiedAD; import com.qq.e.ads.nativ.NativeUnifiedADData; import com.qq.e.comm.constants.AdPatternType; import com.qq.e.comm.pi.AdData; import com.qq.e.comm.util.AdError; /*import com.yanzhenjie.permission.Action; import com.yanzhenjie.permission.AndPermission; import com.yanzhenjie.permission.runtime.Permission;*/ import org.litepal.BuildConfig; import org.litepal.util.Const; import butterknife.BindView; import butterknife.ButterKnife; import static com.novelbook.android.FileActivity.EXTERNAL_STORAGE_REQ_CODE; import static com.novelbook.android.bean.AdSetting.getAppID; import static com.novelbook.android.utils.Constants.AD_MOB; import static com.novelbook.android.utils.Constants.AD_TENCENT_QQ; import static com.novelbook.android.utils.Constants.AD_TOUTIAO; public abstract class Activity_base extends AppCompatActivity implements NativeExpressAD.NativeExpressADListener,UnifiedBannerADListener { private final int REQUEST_CODE_SETTING=1; private static final int MSG_AD_LOAD =10 ; private static String TAG ="Activity_base"; private ProgressDialog mProgressDialog; MyApp application; private Activity_base oContext; protected Gson gson = new Gson(); protected long mLastBannerTime =0; //---qq ad----> private NativeExpressAD nativeExpressAD; private NativeExpressADView nativeExpressADView; private QqNadListiner qqNadListiner; //---qq ad end---- @Nullable @BindView(R.id.toolbar) Toolbar toolbar; @Nullable @BindView(R.id.banner_container) FrameLayout mBannerContainer; /* @Nullable @BindView(R.id.banner_native_container) FrameLayout mNativeBannerContainer;*/ @Nullable @BindView(R.id.recycleViewBookList) RecyclerView rvshudan; void showBook(String bookName) { //show paihangbang activity Intent intent = new Intent(this, BookActivity.class); intent.putExtra("BOOKNAME",bookName); startActivity(intent); } // protected MyImageLoader imgloader = new MyImageLoader(); /** * 初始化布局 */ public abstract int getLayoutRes(); protected abstract void initViews(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (application == null) { // 得到Application对象 application = (MyApp) getApplication(); } oContext = this;// 把当前的上下文对象赋值给BaseActivity addActivity();// 调用添加方法 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(getLayoutRes()); ButterKnife.bind(this); setupToolbar(); // 初始化View注入 // this.mAQuery = new AQuery2(this); initializeAd();//initAD_TouTiao(); setTitle(); initData(); initViews(); initNaviBanner(); if (Build.VERSION.SDK_INT >= 23) { checkAndRequestPermission(); } } void initNaviBanner(){ if(mBannerContainer==null){ return; } if(Constants.AD_SETTING.isShowAdsense() && Constants.AD_SETTING.getBigBanner().isShow() && NetUtil.isNetworkConnected()){ loadNativeBannerAd(); mBannerContainer.setVisibility(View.VISIBLE); }else{ mBannerContainer.setVisibility(View.GONE); } } protected void setupToolbar(){ // Toolbar toolbar = findViewById(R.id.toolbar); // setSupportActionBar(toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } protected abstract void setTitle(); protected abstract void initData() ; protected void closeCurrentActitivty(){ if( this instanceof BookActivity ) { // return; } finish(); } protected BookListAdapter getBookListAdapter(List mDatas,int itemResourceId){ BookListAdapter mAdapter = new BookListAdapter(this ,mDatas,itemResourceId,new OnItemClickListener() { @Override public void onItemClick(View view, int position) { // showBook("射雕" +position); showBookDetail(mDatas.get(position)); closeCurrentActitivty(); } @Override public void onItemLongClick(View view, int position) { // initDialog(position); // mAdapter.removeData(position); } @Override public void onLinearOutClick(View view, int bookId,int llId) { // Toast.makeText(activity, "book "+ bookId + " clicked", Toast.LENGTH_SHORT).show(); // showBookDetail( mData.get(bookId)); } }); return mAdapter; } void showBookDetail(Novel book) { List acts = application.getActivityList(); for(Activity activity :acts){ if(activity instanceof BookActivity){ activity.finish(); break; } } Intent intent = new Intent(this, BookActivity.class); intent.putExtra(BookActivity.EXTRA_BOOK,book); startActivity(intent); } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId()==android.R.id.home){ //拦截toolbar 返回事件 finish(); return true; } return super.onOptionsItemSelected(item); } protected List getFakeData(int max ){ List mDatas = new ArrayList(); for (int i = 0; i = Build.VERSION_CODES.M) { CommonUtil.checkPermission(thisActivity,permission,requestCode,errorText); } } @TargetApi(Build.VERSION_CODES.M) public void checkAndRequestPermission() { List lackedPermission = new ArrayList(); if (!(checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)) { lackedPermission.add(Manifest.permission.READ_PHONE_STATE); // CommonUtil.checkPermission(this,Manifest.permission.READ_PHONE_STATE,1024,"识别用户身份需要此权限,请允许"); // return; } if (!(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) { lackedPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); // CommonUtil.checkPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE,1024,"缓存小说内容需此权限,请允许"); // return; } if(com.novelbook.android.BuildConfig.LOG_DEBUG || Constants.AD_SETTING.isShowAdsense() && Constants.AD_SETTING.getSplash().getSource() == AD_TENCENT_QQ) if (!(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { lackedPermission.add(Manifest.permission.ACCESS_FINE_LOCATION); // CommonUtil.checkPermission(this,Manifest.permission.ACCESS_FINE_LOCATION,1024,"精确推送小说内容需此权限,请允许"); Log.e(TAG, "checkAndRequestPermission: ACCESS_FINE_LOCATION result " + checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) ); // return; } if(com.novelbook.android.BuildConfig. LOG_DEBUG || Constants.AD_SETTING.isShowAdsense() && Constants.AD_SETTING.getSplash().getSource() == AD_TENCENT_QQ) if (!(checkSelfPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES) == PackageManager.PERMISSION_GRANTED)) { // CommonUtil.checkPermission(this,Manifest.permission.REQUEST_INSTALL_PACKAGES,1024,"更新程序内容需此权限,请允许"); lackedPermission.add(Manifest.permission.REQUEST_INSTALL_PACKAGES); // return; } // 请求所缺少的权限,在onRequestPermissionsResult中再看是否获得权限,如果获得权限就可以调用SDK,否则不要调用SDK。 String[] requestPermissions = new String[lackedPermission.size()]; if(requestPermissions.length>0) { lackedPermission.toArray(requestPermissions); requestPermissions(requestPermissions, 1024); String p = ""; for(String s: requestPermissions) { p+="," +s; } if(requestPermissions.length>0){ p =p.substring(1); Log.e(TAG, "checkAndRequestPermission: 缺少权限 " + p); //requestPermission(this,p); } } } private boolean hasAllPermissionsGranted(int[] grantResults) { for (int grantResult : grantResults) { Log.e(TAG, "checkAndRequestPermission: grant result "+grantResult ); 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)) { } else { Log.d(TAG, String.format("checkAndRequestPermission: permision result requestCode %s,",requestCode )); // 如果用户没有授权,那么应该说明意图,引导用户去设置里面授权。 // Toast.makeText(this, "应用缺少必要的权限!请点击\"权限\",打开所需要的权限。", Toast.LENGTH_LONG).show(); // Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); // intent.setData(Uri.parse("package:" + getPackageName())); // startActivity(intent); } } /** * Request permissions. */ /* private void requestPermission(Context activity, String... permissions) { AndPermission.with(activity) .runtime() .permission(permissions) .rationale(new RuntimeRationale()) .onGranted(new Action>() { @Override public void onAction(List permissions) { toast(R.string.permision_successfully); } }) .onDenied(new Action>() { @Override public void onAction(@NonNull List permissions) { toast(R.string.permision_failure); if (AndPermission.hasAlwaysDeniedPermission( activity, permissions)) { showSettingDialog(activity, permissions); } } }) .start(); } *//** * Display setting dialog. *//* public void showSettingDialog(Context context, final List permissions) { List permissionNames = Permission.transformText(context, permissions); String message = context.getString(R.string.message_permission_always_failed, TextUtils.join("\n", permissionNames)); new AlertDialog.Builder(context).setCancelable(false) .setTitle(R.string.title_dialog) .setMessage(message) .setPositiveButton(R.string.setting, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { setPermission(); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .show(); } *//** * Set permissions. *//* private void setPermission() { AndPermission.with(this).runtime().setting().start(REQUEST_CODE_SETTING); } */ protected void toast(@StringRes int message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { switch (requestCode) { case REQUEST_CODE_SETTING: { Toast.makeText( this, R.string.message_setting_comeback, Toast.LENGTH_SHORT).show(); break; } } } protected void loadImageView(String url, ImageView imageView){ ImageUtil.loadImage( this, url , imageView); } public void checkUpdate(boolean isSilence){ UpdateManager manager = new UpdateManager(this); if(isSilence) manager.checkUpdateSilence(); else manager.checkUpdate(); } // 添加Activity方法 public void addActivity() { application.addActivity_(oContext);// 调用myApplication的添加Activity方法 } //销毁当个Activity方法 public void removeActivity() { application.removeActivity_(oContext);// 调用myApplication的销毁单个Activity方法 } //销毁所有Activity方法 public void removeALLActivity() { application.removeALLActivity_();// 调用myApplication的销毁所有Activity方法 } @Override public void finish() { removeActivity(); super.finish(); } public void loadNativeBannerAd(FrameLayout bannerContainer ) { mBannerContainer =bannerContainer; loadNativeBannerAd( ) ; } private void loadNativeBannerAd() { /* if (mBannerContainer .getVisibility() != View.VISIBLE) { mBannerContainer.setVisibility(View.VISIBLE); } */ if(!Constants.AD_SETTING.isShowAdsense() ){return;} mLastBannerTime=0;//复位小banner请求时间戳,否则会在小banner位置显示nati banner 信息 if (mBannerContainer.getChildCount() > 0) { mBannerContainer.removeAllViews(); } if(Constants.AD_SETTING.getChapterContentBanner().getSource() == AD_TENCENT_QQ) { loadNativeBanner_qq(-1, 388); }else if(Constants.AD_SETTING.getChapterContentBanner().getSource() == AD_TOUTIAO) { // loadNativeBanner_toutiao(mBannerContainer ,690,388); }else if(Constants.AD_SETTING.getChapterContentBanner().getSource() == AD_MOB) { loadBanner_Mob(mBannerContainer, 699,388); } } public void loadBanner(FrameLayout bannerContainer, int width, int height) { mBannerContainer =bannerContainer; loadBanner( width, height); } private void loadBanner( int width, int height){ 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; } mLastBannerTime =new Date().getTime(); Log.d(TAG, "loadBanner:mLastBannerTime start new banner request,mBannerContainer.getChildCount(): "+mBannerContainer.getChildCount()); if(Constants.AD_SETTING.getChapterBanner().getSource()== AD_TENCENT_QQ) { getBanner_qq(); }else if(Constants.AD_SETTING.getChapterBanner().getSource()== AD_TOUTIAO) { // loadBanner_toutiao(mBannerContainer, width,height); }else if(Constants.AD_SETTING.getChapterBanner().getSource()== AD_MOB){ loadBanner_Mob(mBannerContainer, width,height); } } void initializeAd(){ if(Constants.AD_SETTING.isShowAdsense()) { // initAD_TouTiao(); qqNadListiner = new QqNadListiner() ; // initialMobileAd(); } } //------ 头条 ad ----- /*AQuery2 mAQuery; Button mCreativeButton; TTAdNative mTTAdNative; void initAD_TouTiao(){ if(Constants.AD_SETTING.isShowAdsense()) try { mTTAdNative = TTAdManagerHolder.get().createAdNative(this); //step3:(可选,强烈建议在合适的时机调用):申请部分权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题。 TTAdManagerHolder.get().requestPermissionIfNecessary(this); //this.mAQuery = new AQuery2(this); }catch (Exception er){ Log.e(TAG, "initAD_TouTiao: ", er); } } TTAdNative getTTAdNative(){ if(mTTAdNative== null){ if(Constants.AD_SETTING.isShowAdsense()){ TTAdManagerHolder.init(MyApp.applicationContext); initAD_TouTiao(); } } return mTTAdNative; } */ /* //----toutiao ad ---- // boolean mShowAd =false; void loadBanner_toutiao(FrameLayout bannerContainer,int width, int height) { //step4:创建广告请求参数AdSlot,具体参数含义参考文档 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 ){ width= Constants.SCREEN_WIDTH_PIX-50; height =(int)(width/1.78); } }else if(height >150){ width =(int)(height*1.78); }*//* // width =690; //height=150; // height=height > 500 ? 500: height; Log.d(TAG, String.format("loadBannerAd:finial width %s, height %s ",width,height)); AdSlot adSlot = new AdSlot.Builder() .setCodeId(codeId) //广告位id .setSupportDeepLink(true) .setImageAcceptedSize(width, height) .build(); //step5:请求广告,对请求回调的广告作渲染处理 getTTAdNative().loadBannerAd(adSlot, new TTAdNative.BannerAdListener() { @Override public void onError(int code, String message) { // TToast.show(oContext, "load error : " + code + ", " + message); Log.e(TAG, String.format("loadBannerAd:code %s, message %s ", code,message)); bannerContainer.removeAllViews(); // bannerContainer.setVisibility(View.GONE); } @Override public void onBannerAdLoad(final TTBannerAd ad) { if (ad == null ) { return; } View bannerView = ad.getBannerView(); if (bannerView == null) { return; } mLastBannerTime =new Date().getTime(); //设置轮播的时间间隔 间隔在30s到120秒之间的值,不设置默认不轮播 // ad.setSlideIntervalTime(30 * 1000); bannerContainer.removeAllViews(); bannerContainer.addView(bannerView); // bannerContainer.setVisibility(View.VISIBLE); // Log.d(TAG, "loadBannerAd: set banner VISIBLE"); // mTTAdNative.loadBannerAd(adSlot,null); //设置广告互动监听回调 ad.setBannerInteractionListener(new TTBannerAd.AdInteractionListener() { @Override public void onAdClicked(View view, int type) { // TToast.show(oContext, "广告被点击"); } @Override public void onAdShow(View view, int type) { // TToast.show(oContext, "广告展示"); } }); //(可选)设置下载类广告的下载监听 bindDownloadListener(ad); //在banner中显示网盟提供的dislike icon,有助于广告投放精准度提升 ad.setShowDislikeIcon(new TTAdDislike.DislikeInteractionCallback() { @Override public void onSelected(int position, String value) { // TToast.show(oContext, "点击 " + value); //用户选择不喜欢原因后,移除广告展示 bannerContainer.removeAllViews(); } @Override public void onCancel() { // TToast.show(oContext, "点击取消 "); } }); } }); } private boolean mHasShowDownloadActive = false; private void bindDownloadListener(TTBannerAd ad) { ad.setDownloadListener(new TTAppDownloadListener() { @Override public void onIdle() { // TToast.show(oContext, "点击图片开始下载", Toast.LENGTH_LONG); } @Override public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) { if (!mHasShowDownloadActive) { mHasShowDownloadActive = true; // TToast.show(oContext, "下载中,点击图片暂停", Toast.LENGTH_LONG); } } @Override public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) { // TToast.show(oContext, "下载暂停,点击图片继续", Toast.LENGTH_LONG); } @Override public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) { // TToast.show(oContext, "下载失败,点击图片重新下载", Toast.LENGTH_LONG); } @Override public void onInstalled(String fileName, String appName) { // TToast.show(oContext, "安装完成,点击图片打开", Toast.LENGTH_LONG); } @Override public void onDownloadFinished(long totalBytes, String fileName, String appName) { // TToast.show(oContext, "点击图片安装", Toast.LENGTH_LONG); } }); } //-------------native toutiao ad // List toutiaoNati_Banner_AdCache = new ArrayList(); Map > toutiaoNati_Banner_AdCache = new ConcurrentHashMap>(); void loadNativeBanner_toutiao(FrameLayout bannerContainer,int width,int height) { //step4:创建广告请求参数AdSlot,注意其中的setNativeAdtype方法,具体参数含义参考文档 if (!Constants.AD_SETTING.isShowAdsense()|| getTTAdNative() == null) { return; } String codeId =Constants.AD_SETTING.getChapterContentBanner().getSlotId(Constants.AD_TOUTIAO); final String key =width+"_"+height; List adCache =null; if( toutiaoNati_Banner_AdCache.containsKey(key)){ adCache = toutiaoNati_Banner_AdCache.get(key); } final boolean isfillAd = adCache!=null &&adCache.size()>1; // final boolean isfillAd =!toutiaoNati_Banner_AdCache.containsKey(key); if(adCache!=null && isfillAd){ Log.d(TAG, "loadNativeBannerAd: set ad from cache, cache Size " + adCache.size()); setNativeBanner(bannerContainer, key); if(adCache.size()>0){ return; } } final AdSlot adSlot = new AdSlot.Builder() .setCodeId(codeId) .setSupportDeepLink(true) .setImageAcceptedSize(width, height) .setNativeAdType(AdSlot.TYPE_BANNER) //请求原生广告时候,请务必调用该方法,设置参数为TYPE_BANNER或TYPE_INTERACTION_AD .setAdCount(1) .build(); //step5:请求广告,对请求回调的广告作渲染处理 getTTAdNative().loadNativeAd(adSlot, new TTAdNative.NativeAdListener() { @Override public void onError(int code, String message) { // TToast.show(oContext, "load error : " + code + ", " + message); Log.e(TAG, "loadBannerAd: " + code + ", " + message); // bannerContainer.setBackgroundResource(R.color.transparent); } @Override public void onNativeAdLoad(List ads) { // bannerContainer.setBackgroundResource(R.color.transparent); List tmp = new ArrayList(); for (TTNativeAd ad : ads) { if (ad != null) { tmp.add(ad); } } if (!toutiaoNati_Banner_AdCache.containsKey(key)) { toutiaoNati_Banner_AdCache.put(key, tmp); } else { toutiaoNati_Banner_AdCache.get(key).addAll(tmp); } boolean isfillAd1 =toutiaoNati_Banner_AdCache.get(key).size()>1; Log.d(TAG, String.format("loadNativeBannerAd: ads count %s ,not null count %s,key %s,will fill ad %s", ads.size(), tmp.size(), key, isfillAd1)); if (isfillAd1) { setNativeBanner(bannerContainer, key); }else{ loadNativeBanner_toutiao(mBannerContainer, width, height); Log.d(TAG, String.format("loadNativeBannerAd: load again ... containsKey(key) ? %s,ads size %s",toutiaoNati_Banner_AdCache.containsKey(key), toutiaoNati_Banner_AdCache.containsKey(key)?toutiaoNati_Banner_AdCache.get(key).size() :0 )); } */ /* if (!toutiaoNati_Banner_AdCache.containsKey(key)){ loadNativeBannerAd(bannerContainer, codeId, width, height); Log.d(TAG, String.format("loadNativeBannerAd: load again ... containsKey(key) ? %s,ads size %s",toutiaoNati_Banner_AdCache.containsKey(key), toutiaoNati_Banner_AdCache.containsKey(key)?toutiaoNati_Banner_AdCache.get(key).size() :0 )); }*//* */ /* if (ads.get(0) == null || !mShowAd) { return; } View bannerView = LayoutInflater.from(oContext).inflate(R.layout.ad_toutiao_native_ad, bannerContainer, false); if (bannerView == null) { return; } if (mCreativeButton != null) { //防止内存泄漏 mCreativeButton = null; } bannerContainer.removeAllViews(); bannerContainer.addView(bannerView); bannerContainer.setVisibility(View.VISIBLE); if (!Constants.AD_BACKGROUND_TRANSPARENT) bannerContainer.setBackgroundResource(R.color.mintcream); // @color/mintcream Log.d(TAG, "loadBannerAd: set banner VISIBLE,mShowAd " + mShowAd); //绑定原生广告的数据 setAdData(bannerContainer, bannerView, ads.get(0));*//* // mTTAdNative.loadNativeAd(adSlot,null); } }); } void setNativeBanner(FrameLayout bannerContainer,String key ){ if(!toutiaoNati_Banner_AdCache.containsKey(key)){ return; } List adCache = toutiaoNati_Banner_AdCache.get(key); TTNativeAd nativeAd =null ; int i=0; for (TTNativeAd ad :adCache){ if(ad!=null){ nativeAd =ad; break; } i++; } if (nativeAd == null ) { return; } adCache.remove(i); if(adCache.size()>0) { toutiaoNati_Banner_AdCache.put(key, adCache); }else{ toutiaoNati_Banner_AdCache.remove(key); } View bannerView = LayoutInflater.from(oContext).inflate(R.layout.ad_toutiao_native_ad, bannerContainer, false); if (bannerView == null) { return; } if (mCreativeButton != null) { //防止内存泄漏 mCreativeButton = null; } bannerContainer.removeAllViews(); bannerContainer.addView(bannerView); //bannerContainer.setVisibility(View.VISIBLE); if (!Constants.AD_BACKGROUND_TRANSPARENT) bannerContainer.setBackgroundResource(R.color.mintcream); // @color/mintcream // Log.d(TAG, "loadBannerAd: set banner VISIBLE,mShowAd " + mShowAd); //绑定原生广告的数据 setAdData(bannerContainer, bannerView, nativeAd); handler.sendEmptyMessageDelayed( MSG_AD_LOAD,500); // mTTAdNative.loadNativeAd(adSlot,null); } @SuppressWarnings("RedundantCast") private void setAdData(FrameLayout bannerContainer,View nativeView, TTNativeAd nativeAd) { ((TextView) nativeView.findViewById(R.id.tv_native_ad_title)).setText(nativeAd.getTitle()); ((TextView) nativeView.findViewById(R.id.tv_native_ad_desc)).setText(nativeAd.getDescription()); ImageView imgDislike = nativeView.findViewById(R.id.img_native_dislike); bindDislikeAction( bannerContainer,nativeAd, imgDislike); if (nativeAd.getImageList() != null && !nativeAd.getImageList().isEmpty()) { TTImage image = nativeAd.getImageList().get(0); if (image != null && image.isValid()) { mAQuery.id(nativeView.findViewById(R.id.iv_native_image)).image(image.getImageUrl()); } } TTImage icon = nativeAd.getIcon(); if (icon != null && icon.isValid()) { ImageOptions options = new ImageOptions(); mAQuery.id((nativeView.findViewById(R.id.iv_native_icon))).image(icon.getImageUrl(), options); } mCreativeButton = (Button) nativeView.findViewById(R.id.btn_native_creative); //可根据广告类型,为交互区域设置不同提示信息 switch (nativeAd.getInteractionType()) { case TTAdConstant.INTERACTION_TYPE_DOWNLOAD: //如果初始化ttAdManager.createAdNative(getApplicationContext())没有传入activity 则需要在此传activity,否则影响使用Dislike逻辑 nativeAd.setActivityForDownloadApp(this); mCreativeButton.setVisibility(View.VISIBLE); nativeAd.setDownloadListener(mDownloadListener); // 注册下载监听器 break; case TTAdConstant.INTERACTION_TYPE_DIAL: mCreativeButton.setVisibility(View.VISIBLE); mCreativeButton.setText("立即拨打"); break; case TTAdConstant.INTERACTION_TYPE_LANDING_PAGE: case TTAdConstant.INTERACTION_TYPE_BROWSER: mCreativeButton.setVisibility(View.VISIBLE); mCreativeButton.setText("查看详情"); break; default: mCreativeButton.setVisibility(View.GONE); // TToast.show(oContext, "交互类型异常"); } //可以被点击的view, 也可以把nativeView放进来意味整个广告区域可被点击 List clickViewList = new ArrayList<>(); clickViewList.add(nativeView); //触发创意广告的view(点击下载或拨打电话) List creativeViewList = new ArrayList<>(); //如果需要点击图文区域也能进行下载或者拨打电话动作,请将图文区域的view传入 //creativeViewList.add(nativeView); creativeViewList.add(mCreativeButton); //重要! 这个涉及到广告计费,必须正确调用。convertView必须使用ViewGroup。 nativeAd.registerViewForInteraction((ViewGroup) nativeView, clickViewList, creativeViewList, imgDislike, new TTNativeAd.AdInteractionListener() { @Override public void onAdClicked(View view, TTNativeAd ad) { if (ad != null) { // TToast.show(oContext, "广告" + ad.getTitle() + "被点击"); } } @Override public void onAdCreativeClick(View view, TTNativeAd ad) { if (ad != null) { // TToast.show(oContext, "广告" + ad.getTitle() + "被创意按钮被点击"); } } @Override public void onAdShow(TTNativeAd ad) { if (ad != null) { // TToast.show(oContext, "广告" + ad.getTitle() + "展示"); } } }); } //接入网盟的dislike 逻辑,有助于提示广告精准投放度 private void bindDislikeAction(FrameLayout bannerContainer,TTNativeAd ad, View dislikeView) { final TTAdDislike ttAdDislike = ad.getDislikeDialog(this); if (ttAdDislike != null) { ttAdDislike.setDislikeInteractionCallback(new TTAdDislike.DislikeInteractionCallback() { @Override public void onSelected(int position, String value) { bannerContainer.removeAllViews(); } @Override public void onCancel() { } }); } dislikeView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ttAdDislike != null) ttAdDislike.showDislikeDialog(); } }); } private final TTAppDownloadListener mDownloadListener = new TTAppDownloadListener() { @Override public void onIdle() { if (mCreativeButton != null) { mCreativeButton.setText("开始下载"); } } @Override public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) { if (mCreativeButton != null) { if (totalBytes <= 0L) { mCreativeButton.setText("下载中 进度:0"); } else { mCreativeButton.setText("下载中 进度:" + (currBytes * 100 / totalBytes)); } } } @Override public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) { if (mCreativeButton != null) { mCreativeButton.setText("下载暂停 进度:" + (currBytes * 100 / totalBytes)); } } @Override public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) { if (mCreativeButton != null) { mCreativeButton.setText("重新下载"); } } @Override public void onInstalled(String fileName, String appName) { if (mCreativeButton != null) { mCreativeButton.setText("点击打开"); } } @Override public void onDownloadFinished(long totalBytes, String fileName, String appName) { if (mCreativeButton != null) { mCreativeButton.setText("点击安装"); } } }; public TTAdNative getAdNative(){ return getTTAdNative();//mTTAdNative; } void loadInteractionAd(String codeId) { //step4:创建插屏广告请求参数AdSlot,具体参数含义参考文档 if(getAdNative()==null){ return; } AdSlot adSlot = new AdSlot.Builder() .setCodeId(codeId) .setSupportDeepLink(true) .setImageAcceptedSize(600, 600) //根据广告平台选择的尺寸,传入同比例尺寸 .build(); //step5:请求广告,调用插屏广告异步请求接口 getAdNative().loadInteractionAd(adSlot, new TTAdNative.InteractionAdListener() { @Override public void onError(int code, String message) { Log.e(TAG, String.format("loadInteractionAd onError: code %s ,message %s",code,message) ); } @Override public void onInteractionAdLoad(TTInteractionAd ttInteractionAd) { // TToast.show(getApplicationContext(), "type: " + ttInteractionAd.getInteractionType()); ttInteractionAd.setAdInteractionListener(new TTInteractionAd.AdInteractionListener() { @Override public void onAdClicked() { Log.d(TAG, "被点击"); // TToast.show(mContext, "广告被点击"); } @Override public void onAdShow() { Log.d(TAG, "被展示"); // TToast.show(mContext, "广告被展示"); } @Override public void onAdDismiss() { Log.d(TAG, "插屏广告消失"); // TToast.show(mContext, "广告消失"); } }); //如果是下载类型的广告,可以注册下载状态回调监听 if (ttInteractionAd.getInteractionType() == TTAdConstant.INTERACTION_TYPE_DOWNLOAD) { ttInteractionAd.setDownloadListener(new TTAppDownloadListener() { @Override public void onIdle() { Log.d(TAG, "点击开始下载"); // TToast.show(mContext, "点击开始下载"); } @Override public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) { Log.d(TAG, "下载中"); // TToast.show(mContext, "下载中"); } @Override public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) { Log.d(TAG, "下载暂停"); // TToast.show(mContext, "下载暂停"); } @Override public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) { Log.d(TAG, "下载失败"); // TToast.show(mContext, "下载失败"); } @Override public void onDownloadFinished(long totalBytes, String fileName, String appName) { Log.d(TAG, "下载完成"); // TToast.show(mContext, "下载完成"); } @Override public void onInstalled(String fileName, String appName) { Log.d(TAG, "安装完成"); // TToast.show(mContext, "安装完成"); } }); } //弹出插屏广告 ttInteractionAd.showInteractionAd(oContext); } }); } */ /** * 加载 toutiao feed广告 *//* private void loadListAd_toutiao(BookListAdapter adapter, int adCnt, boolean addFooter) { //feed广告请求类型参数 AdSlot adSlot = new AdSlot.Builder() .setCodeId( Constants.AD_SETTING.getInformationFlow().getSlotId(Constants.AD_TOUTIAO) ) .setSupportDeepLink(true) .setImageAcceptedSize(228, 150) .setAdCount(adCnt) .build(); //调用feed广告异步请求接口 getAdNative().loadFeedAd(adSlot, new TTAdNative.FeedAdListener() { @Override public void onError(int code, String message) { Log.e(TAG, String.format("loadListAd onError: code %s,msg %s",code,message) ); } @Override public void onFeedAdLoad(List ads) { // myAdapter.changeMoreStatus(2); if (ads == null || ads.isEmpty()) { Log.e(TAG, "on FeedAdLoaded: ad is null!" ); return; } if(addFooter) { adapter.AddFooterItem(ads); }else{ adapter.AddHeaderItem(ads); } } }); } */ // qq ad ------------------------------begin //private AQuery mAQuery; /* BannerView bv; private void getBanner_qq() { if(this.bv != null){ mBannerContainer.removeView(bv); bv.destroy(); } if( mBannerContainer.getChildCount()>0){ mBannerContainer.removeAllViews(); } this.bv = new BannerView(this, com.qq.e.ads.banner.ADSize.BANNER, "1109247602" *//* AdSetting.getAppID(Constants.AD_TENCENT_QQ)*//*, "9000263914551986" *//* Constants.AD_SETTING.getChapterBanner().getSlotId(Constants.AD_TENCENT_QQ)*//*); // 注意:如果开发者的banner不是始终展示在屏幕中的话,请关闭自动刷新,否则将导致曝光率过低。 // 并且应该自行处理:当banner广告区域出现在屏幕后,再手动loadAD。 // bv.setRefresh(0); bv.setADListener(new AbstractBannerADListener() { @Override public void onNoAD(AdError error) { Log.d( TAG, String.format("loadListAd,eCode = %d, eMsg = %s", error.getErrorCode(), error.getErrorMsg())); } @Override public void onADReceiv() { Log.d(TAG, "loadListAd ONBannerReceive"); } }); mBannerContainer.addView(bv); this.bv.loadAD(); mLastBannerTime =new Date().getTime(); }*/ UnifiedBannerView bv; //banner2.0 private void getBanner_qq() { if(this.bv != null){ mBannerContainer.removeView(bv); bv.destroy(); } String posId =Constants.AD_SETTING.getChapterBanner().getSlotId(Constants.AD_TENCENT_QQ);//"9000263914551986"; Map tags = new HashMap<>(); tags.put("tag_b1", "value_b1"); tags.put("tag_b2", "value_b2"); this.bv = new UnifiedBannerView(this, AdSetting.getAppID(Constants.AD_TENCENT_QQ) , posId, this, tags); this.bv.setRefresh(0); // 不需要传递tags使用下面构造函数 // this.bv = new UnifiedBannerView(this, Constants.APPID, posId, this); mBannerContainer.addView(bv, getUnifiedBannerLayoutParams()); bv.loadAD(); mLastBannerTime =new Date().getTime(); // return this.bv; } @Override public void onADReceive() { Log.d(TAG, "loadListAd UnifiedBannerView ONBannerReceive"); } @Override public void onADExposure() { Log.d(TAG, "loadListAd UnifiedBannerView onADExposure"); } @Override public void onADClosed() { Log.d(TAG, "loadListAd UnifiedBannerView onADClosed"); } @Override public void onADClicked() { Log.d(TAG, "loadListAd UnifiedBannerView onADClicked"); } @Override public void onADLeftApplication() { Log.d(TAG, "loadListAd UnifiedBannerView onADLeftApplication"); } @Override public void onADOpenOverlay() { Log.d(TAG, "loadListAd UnifiedBannerView onADOpenOverlay"); } @Override public void onADCloseOverlay() { Log.d(TAG, "loadListAd onADCloseOverlay"); } private FrameLayout.LayoutParams getUnifiedBannerLayoutParams() { Point screenSize = new Point(); getWindowManager().getDefaultDisplay().getSize(screenSize); return new FrameLayout.LayoutParams(screenSize.x, Math.round(screenSize.x / 6.4F)); } //原生上图下文1280x720 8020766944969033 private void loadNativeBanner_qq(int adWidth,int adHeight) { try { /* if(mAdList!=null && mAdList.size()>1){ nativeExpressADView = mAdList.get(0); // bindAD(); Log.d(TAG, "loadNativeBanner_qq: mAdList.size()" +mAdList.size()); if(mAdList.size()>1){ return; } }*/ nativeExpressAD = new NativeExpressAD(this, getMyADSize(adWidth, adHeight), AdSetting.getAppID(Constants.AD_TENCENT_QQ) , /*原生上图下文1280x720*/ Constants.AD_SETTING.getChapterContentBanner().getSlotId(Constants.AD_TENCENT_QQ) , this); // 这里的Context必须为Activity /* nativeExpressAD.setVideoOption(new VideoOption.Builder() .setAutoPlayPolicy(VideoOption.AutoPlayPolicy.WIFI) // 设置什么网络环境下可以自动播放视频 .setAutoPlayMuted(true) // 设置自动播放视频时,是否静音 .build()); // setVideoOption是可选的,开发者可根据需要选择是否配置 nativeExpressAD.setMaxVideoDuration(com.novelbook.android.AD.qq.Constants.VIDEO_DURATION_SETTING_MAX);*/ nativeExpressAD.loadAD(1); } catch (NumberFormatException e) { Log.w(TAG, "ad size invalid."); Toast.makeText(this, "请输入合法的宽高数值", Toast.LENGTH_SHORT).show(); } } private ADSize getMyADSize(int adWidth,int adHeight) { return new ADSize(adWidth, adHeight); } /** * 获取广告数据 * * @param nativeExpressADView * @return */ private String getAdInfo(NativeExpressADView nativeExpressADView) { AdData adData = nativeExpressADView.getBoundData(); if (adData != null) { StringBuilder infoBuilder = new StringBuilder(); infoBuilder.append("title:").append(adData.getTitle()).append(",") .append("desc:").append(adData.getDesc()).append(",") .append("patternType:").append(adData.getAdPatternType()); if (adData.getAdPatternType() == AdPatternType.NATIVE_VIDEO) { infoBuilder.append(", video info: ").append(getVideoInfo(adData.getProperty(AdData.VideoPlayer.class))); } return infoBuilder.toString(); } return null; } /** * 获取播放器实例 * * 仅当视频回调{@link NativeExpressMediaListener#onVideoInit(NativeExpressADView)}调用后才会有返回值 * * @param videoPlayer * @return */ private String getVideoInfo(AdData.VideoPlayer videoPlayer) { if (videoPlayer != null) { StringBuilder videoBuilder = new StringBuilder(); videoBuilder.append("{state:").append(videoPlayer.getVideoState()).append(",") .append("duration:").append(videoPlayer.getDuration()).append(",") .append("position:").append(videoPlayer.getCurrentPosition()).append("}"); return videoBuilder.toString(); } return null; } FrameLayout getNativeContainer(){ return mBannerContainer; } List mAdList; @Override public void onADLoaded(List adList){ // 释放前一个展示的NativeExpressADView的资源 if(mAdList==null){ mAdList = new ArrayList(); } boolean toBind = mAdList.size()==0; mAdList.addAll(0,adList); for(NativeExpressADView ad :mAdList){ Log.d(TAG, "onADLoaded: ad is " +ad); } /* if(toBind ){ bindAD(adList); }*/ bindAD(adList); } void bindAD(List adList){ if (nativeExpressADView != null) { nativeExpressADView.destroy(); } FrameLayout bannerContainer = getNativeContainer(); if (bannerContainer .getVisibility() != View.VISIBLE) { return; // bannerContainer.setVisibility(View.VISIBLE); } if (bannerContainer.getChildCount() > 0) { bannerContainer.removeAllViews(); } nativeExpressADView = adList.get(0); /* Log.i(TAG, "onADLoaded, video info: " + getAdInfo(nativeExpressADView)); if (nativeExpressADView.getBoundData().getAdPatternType() == AdPatternType.NATIVE_VIDEO) { nativeExpressADView.setMediaListener(mediaListener); }*/ // 广告可见才会产生曝光,否则将无法产生收益。 bannerContainer.addView(nativeExpressADView); nativeExpressADView.render(); // mAdList.remove(0); } @Override public void onNoAD(AdError adError) { Log.i( TAG, String.format("onNoAD, error code: %d, error msg: %s", adError.getErrorCode(), adError.getErrorMsg())); } @Override public void onRenderFail(NativeExpressADView adView) { Log.i(TAG, "onRenderFail"); } @Override public void onRenderSuccess(NativeExpressADView adView) { Log.i(TAG, "onRenderSuccess"); } @Override public void onADExposure(NativeExpressADView adView) { Log.i(TAG, "onADExposure"); } @Override public void onADClicked(NativeExpressADView var1){ } @Override public void onADClosed(NativeExpressADView var1) { FrameLayout bannerContainer = getNativeContainer(); if (bannerContainer != null && bannerContainer.getChildCount() > 0) { bannerContainer.removeAllViews(); // bannerContainer.setVisibility(View.GONE); } } @Override public void onADLeftApplication(NativeExpressADView var1){ } @Override public void onADOpenOverlay(NativeExpressADView var1){ } @Override public void onADCloseOverlay(NativeExpressADView var1){ } private NativeExpressMediaListener mediaListener = new NativeExpressMediaListener() { @Override public void onVideoInit(NativeExpressADView nativeExpressADView) { Log.i(TAG, "onVideoInit: " + getVideoInfo(nativeExpressADView.getBoundData().getProperty(AdData.VideoPlayer.class))); } @Override public void onVideoLoading(NativeExpressADView nativeExpressADView) { Log.i(TAG, "onVideoLoading"); } @Override public void onVideoReady(NativeExpressADView nativeExpressADView, long l) { Log.i(TAG, "onVideoReady"); } @Override public void onVideoStart(NativeExpressADView nativeExpressADView) { Log.i(TAG, "onVideoStart: " + getVideoInfo(nativeExpressADView.getBoundData().getProperty(AdData.VideoPlayer.class))); } @Override public void onVideoPause(NativeExpressADView nativeExpressADView) { Log.i(TAG, "onVideoPause: " + getVideoInfo(nativeExpressADView.getBoundData().getProperty(AdData.VideoPlayer.class))); } @Override public void onVideoComplete(NativeExpressADView nativeExpressADView) { Log.i(TAG, "onVideoComplete: " + getVideoInfo(nativeExpressADView.getBoundData().getProperty(AdData.VideoPlayer.class))); } @Override public void onVideoError(NativeExpressADView nativeExpressADView, AdError adError) { Log.i(TAG, "onVideoError"); } @Override public void onVideoPageOpen(NativeExpressADView nativeExpressADView) { Log.i(TAG, "onVideoPageOpen"); } @Override public void onVideoPageClose(NativeExpressADView nativeExpressADView) { Log.i(TAG, "onVideoPageClose"); } }; //------------------------AD Google MobileAds--------------- // MobileAds.initialize(this, "YOUR_ADMOB_APP_ID"); boolean isMobleAdInitialize =false; //AdView mAdView; void initialMobileAd(){ // Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713 String appID = AdSetting.getAppID(Constants.AD_MOB); appID =AdSetting.getAppID(Constants.AD_MOB); MobileAds.initialize(this, appID); isMobleAdInitialize =true; Log.d(TAG, "onAdLoaded: initialMobileAd "); } AdView getAdView(){ // if(mAdView ==null){ AdView mAdView = new AdView(this); String codeId = Constants.AD_SETTING.getChapterBanner().getSlotId(Constants.AD_MOB);//Constants.AD_SETTING.getChapterBanner().getSlotId(Constants.AD_MOB) ; mAdView.setAdUnitId(codeId); mAdView.setAdListener(new AdListener() { @Override public void onAdLoaded() { // Code to be executed when an ad finishes loading. Log.d(TAG, "onAdLoaded: mobAd loaded"); mLastBannerTime =new Date().getTime(); } @Override public void onAdFailedToLoad(int errorCode) { // Code to be executed when an ad request fails. Log.d(TAG, "onAdLoaded: Code to be executed when an ad request fails." +errorCode); } @Override public void onAdOpened() { // Code to be executed when an ad opens an overlay that // covers the screen. Log.d(TAG, "onAdLoaded: ad opens an overlay."); } @Override public void onAdClicked() { // Code to be executed when the user clicks on an ad. Log.d(TAG, "onAdLoaded: user clicks on an ad."); } @Override public void onAdLeftApplication() { // Code to be executed when the user has left the app. Log.d(TAG, "onAdLoaded: Code to be executed when the user has left the app."); } @Override public void onAdClosed() { // Code to be executed when the user is about to return // to the app after tapping on an ad. Log.d(TAG, "onAdLoaded: Code to be executed when the user is about to return to the app after tapping on an ad."); } }); // } return mAdView; } private void loadBanner_Mob(FrameLayout bannerContainer, int width, int height) { Log.d(TAG, "onAdLoaded: 1 loadBanner_Mob "); if(!Constants.AD_SETTING.isShowAdsense()){return;} if(!isMobleAdInitialize){ initialMobileAd(); } Log.d(TAG, "onAdLoaded: 2 loadBanner_Mob height:" +height); AdSize adsize = new AdSize(width,height); AdView adView = getAdView(); if(height<250){ adView.setAdSize(AdSize.BANNER); }else { adView.setAdSize(AdSize.MEDIUM_RECTANGLE); } AdRequest adRequest = new AdRequest.Builder().build(); adView.loadAd(adRequest); bannerContainer.removeAllViews(); bannerContainer.addView( adView); } // qq ad ------------------------------begin private boolean qqAddFooter; private BookListAdapter qqAdapter; private NativeExpressAD mADManager; void loadListAd_qq(BookListAdapter adapter, int adCnt, boolean addFooter) { ADSize adSize = new ADSize(ADSize.FULL_WIDTH, ADSize.AUTO_HEIGHT); // 消息流中用AUTO_HEIGHT mADManager = new NativeExpressAD(this, adSize, getAppID(Constants.AD_TENCENT_QQ) , Constants.AD_SETTING.getInformationFlow().getSlotId(Constants.AD_TENCENT_QQ) , qqNadListiner); mADManager.setMaxVideoDuration(5); mADManager.loadAD(adCnt); qqAdapter =adapter; qqAddFooter=addFooter; Log.d(TAG, "loadListAd_qq: ad requested"); } class QqNadListiner implements NativeExpressAD.NativeExpressADListener{ @Override public void onADCloseOverlay(NativeExpressADView adView) { Log.i(TAG, "onADCloseOverlay"); } @Override public void onADLoaded(List adList) { Log.i(TAG, "onADLoaded: " + adList.size()); if(qqAdapter==null){ return; } if(qqAddFooter) { qqAdapter.AddFooterItem(adList); }else{ qqAdapter.AddHeaderItem(adList); } } @Override public void onRenderFail(NativeExpressADView adView) { Log.i(TAG, "onRenderFail: " + adView.toString()); } @Override public void onRenderSuccess(NativeExpressADView adView) { // Log.i(TAG, "onRenderSuccess: " + adView.toString() + ", adInfo: " + getAdInfo(adView)); } @Override public void onADExposure(NativeExpressADView adView) { Log.i(TAG, "onADExposure: " + adView.toString()); } @Override public void onADClicked(NativeExpressADView adView) { Log.i(TAG, "onADClicked: " + adView.toString()); } @Override public void onADClosed(NativeExpressADView adView) { Log.i(TAG, "onADClosed: " + adView.toString()); /* if (mAdapter != null) { int removedPosition = mAdViewPositionMap.get(adView); mAdapter.removeADView(removedPosition, adView); }*/ } @Override public void onADLeftApplication(NativeExpressADView adView) { Log.i(TAG, "onADLeftApplication: " + adView.toString()); } @Override public void onADOpenOverlay(NativeExpressADView adView) { Log.i(TAG, "onADOpenOverlay: " + adView.toString()); } @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(), adError.getErrorMsg())); } } //qq ad end<------------- /** * 加载 toutiao feed广告 */ public void loadListAd( BookListAdapter adapter, int adCnt, boolean addFooter) { if(!Constants.AD_SETTING.isShowAdsense() || !Constants.AD_SETTING.getInformationFlow().isShow()){ return; } if(Constants.AD_SETTING.getInformationFlow().getSource()==Constants.AD_TENCENT_QQ) { loadListAd_qq(adapter, adCnt, addFooter); }else if(Constants.AD_SETTING.getInformationFlow().getSource()==Constants.AD_TOUTIAO){ // loadListAd_toutiao(adapter, adCnt, addFooter); } } @Override protected void onResume() { super.onResume(); // MobclickAgent.onResume(this); } @Override protected void onPause(){ super.onPause(); hideProgress(); // MobclickAgent.onPause(this); } @Override protected void onDestroy() { super.onDestroy(); if (bv != null) { bv.destroy(); } } }