@@ -47,6 +47,7 @@ import java.util.ArrayList;
import java.util.List ;
import java.util.Map ;
import cc.winboll.studio.powerbell.activities.WinBoLLActivity ;
import cc.winboll.studio.libaes.views.ADsBannerView ;
/**
* 主活动类( 修复小米广告SDK空Context崩溃问题)
@@ -60,23 +61,23 @@ public class MainActivity extends WinBoLLActivity {
public static final String TAG = " MainActivity " ;
private static final String PRIVACY_FILE = " privacy_pfs" ;
private static final String PRIVACY_VALUE = " privacy_value" ; //0: 拒绝, 1: 赞同
// private static final String PRIVACY_FILE = " privacy_pfs" ;
// private static final String PRIVACY_VALUE = " privacy_value"; //0: 拒绝, 1: 赞同
//
// private SharedPreferences mSharedPreferences;
//
// private String BANNER_POS_ID = "802e356f1726f9ff39c69308bfd6f06a";
// private String BANNER_POS_ID_WINBOLL_BETA = "d129ee5a263911f981a6dc7a9802e3e7";
// private String BANNER_POS_ID_WINBOLL = "4ec30efdb32271765b9a4efac902828b";
private SharedPreferences mSharedPreferences ;
private String BANNER_POS_ID = " 802e356f1726f9ff39c69308bfd6f06a " ;
private String BANNER_POS_ID_WINBOLL_BETA = " d129ee5a263911f981a6dc7a9802e3e7 " ;
private String BANNER_POS_ID_WINBOLL = " 4ec30efdb32271765b9a4efac902828b " ;
private BannerAd mBannerAd ;
private List < BannerAd > mAllBanners = new ArrayList < > ( ) ;
private ViewGroup mContainer ;
private boolean mIsBiddingWin = true ;
public static final int BACKGROUND_PICTURE_REQUEST_CODE = 0 ;
// private BannerAd mBannerAd ;
// private List<BannerAd> mAllBanners = new ArrayList<>();
//
// private ViewGroup mContainer ;
//
// private boolean mIsBiddingWin = true;
//
// public static final int BACKGROUND_PICTURE_REQUEST_CODE = 0 ;
public static MainActivity _mMainActivity ;
private App mApplication ;
@@ -85,7 +86,8 @@ public class MainActivity extends WinBoLLActivity {
private MainViewFragment mMainViewFragment ;
private Toolbar mToolbar ;
// 新增: 主线程Handler, 确保广告操作在主线程执行
private Handler mMainHandler ;
// private Handler mMainHandler;
ADsBannerView mADsBannerView ;
@Override
public Activity getActivity ( ) {
@@ -102,13 +104,15 @@ public class MainActivity extends WinBoLLActivity {
LogUtils . d ( TAG , " onCreate(...) " ) ;
super . onCreate ( savedInstanceState ) ;
setContentView ( R . layout . activity_main ) ;
mContainer = findViewById ( R . id . ads_contai ner ) ;
// 初始化主线程Handler( 关键: 确保广告操作在主线程执行)
mMainHandler = new Handler ( Looper . getMainLooper ( ) ) ;
// 米盟模块:隐私协议弹窗
showPrivacy ( ) ;
mADsBannerView = findViewById ( R . id . adsban ner ) ;
// mContainer = findViewById(R.id.ads_container);
//
// // 初始化主线程Handler( 关键: 确保广告操作在主线程执行)
// mMainHandler = new Handler(Looper.getMainLooper());
//
// // 米盟模块:隐私协议弹窗
// showPrivacy();
_mMainActivity = this ;
mApplication = ( App ) getApplication ( ) ;
@@ -131,37 +135,40 @@ public class MainActivity extends WinBoLLActivity {
@Override
protected void onDestroy ( ) {
super . onDestroy ( ) ;
// 修复:释放广告资源,避免内存泄漏
releaseAdResources( ) ;
// // 修复:释放广告资源,避免内存泄漏
// releaseAdResources() ;
// 置空静态引用,避免内存泄漏
_mMainActivity = null ;
// 移除Handler回调
if ( mMainHandler ! = null ) {
mMainHandler. removeCallbacksAndMessages( null ) ;
}
}
/**
* 释放广告资源( 关键: 避免内存泄漏和空Context调用)
*/
private void releaseAdResources ( ) {
LogUtils . d ( TAG , " releaseAdResources() " ) ;
// 销毁所有广告实例
if ( mAllBanners ! = null & & ! mAllBanners . isEmpty ( ) ) {
for ( BannerAd ad : mAllBanners ) {
if ( ad ! = null ) {
ad . destroy ( ) ;
}
}
mAllBanners . clear ( ) ;
}
// 置空当前广告引用
mBannerAd = null ;
// 移除广告容器中的视图
if ( mContainer ! = null ) {
mContainer . removeAllViews ( ) ;
}
// // 移除Handler回调
// if (mMainHandler != null) {
// mMainHandler. removeCallbacksAndMessages(null) ;
// }
if ( mADsBannerView ! = null ) {
mADsBannerView . releaseAdResources ( ) ;
}
}
//
// /**
// * 释放广告资源( 关键: 避免内存泄漏和空Context调用)
// */
// private void releaseAdResources() {
// LogUtils.d(TAG, "releaseAdResources()");
// // 销毁所有广告实例
// if (mAllBanners != null && !mAllBanners.isEmpty()) {
// for (BannerAd ad : mAllBanners) {
// if (ad != null) {
// ad.destroy();
// }
// }
// mAllBanners.clear();
// }
// // 置空当前广告引用
// mBannerAd = null;
// // 移除广告容器中的视图
// if (mContainer != null) {
// mContainer.removeAllViews();
// }
// }
void showFragment ( Fragment fragment ) {
FragmentTransaction tx = getFragmentManager ( ) . beginTransaction ( ) ;
@@ -211,24 +218,27 @@ public class MainActivity extends WinBoLLActivity {
super . onResume ( ) ;
reloadBackground ( ) ;
setBackgroundColor ( ) ;
if ( mADsBannerView ! = null ) {
mADsBannerView . resumeADs ( ) ;
}
// 修复:优化广告请求逻辑(添加生命周期判断 + 主线程执行)
if ( ! isFinishing ( ) & & ! isDestroyed ( ) ) {
String privacyAgreeValue = getSharedPreferences( ) . getString( PRIVACY_VALUE, null ) ;
if ( TextUtils. equals( privacyAgreeValue, String. valueOf( 1 ) ) ) {
LogUtils. i ( TAG , " 已同意隐私协议,开始播放米盟广告..." ) ;
mMainHandler. postDelayed( new Runnable ( ) {
@Override
public void run ( ) {
// 再次校验生命周期, 避免延迟执行时Activity已销毁
if ( ! isFinishing ( ) & & ! isDestroyed ( ) ) {
fetchAd( ) ;
}
}
} , 1000 ) ; // 延迟1秒请求广告, 提升页面加载体验
}
}
// // 修复:优化广告请求逻辑(添加生命周期判断 + 主线程执行)
// if (!isFinishing() && !isDestroyed()) {
// String privacyAgreeValue = getSharedPreferences(). getString( PRIVACY_VALUE, null) ;
// if ( TextUtils. equals( privacyAgreeValue, String. valueOf(1))) {
// LogUtils.i(TAG, " 已同意隐私协议,开始播放米盟广告...") ;
// mMainHandler. postDelayed(new Runnable() {
// @Override
// public void run() {
// // 再次校验生命周期, 避免延迟执行时Activity已销毁
// if (!isFinishing() && !isDestroyed()) {
// fetchAd() ;
// }
// }
// }, 1000); // 延迟1秒请求广告, 提升页面加载体验
// }
//
// }
}
@Override
@@ -259,15 +269,15 @@ public class MainActivity extends WinBoLLActivity {
@Override
protected void onActivityResult ( int requestCode , int resultCode , Intent data ) {
super . onActivityResult ( requestCode , resultCode , data ) ;
if ( requestCode = = BACKGROUND_PICTURE_REQUEST_CODE) {
if ( resultCode = = RESULT_OK) {
Toast. makeText( getApplicationContext( ) , " OK " , Toast . LENGTH_SHORT ) . show ( ) ;
}
} else {
String sz = " Unsolved requestCode = " + Integer. toString( requestCode) ;
Toast. makeText( getApplicationContext( ) , sz , Toast . LENGTH_SHORT ) . show ( ) ;
LogUtils. d ( TAG , sz ) ;
}
// if (requestCode == BACKGROUND_PICTURE_REQUEST_CODE) {
// if (resultCode == RESULT_OK) {
// Toast. makeText( getApplicationContext(), "OK", Toast.LENGTH_SHORT).show() ;
// }
// } else {
// String sz = " Unsolved requestCode = " + Integer. toString( requestCode) ;
// Toast. makeText( getApplicationContext(), sz, Toast.LENGTH_SHORT).show() ;
// LogUtils.d(TAG, sz) ;
// }
}
@Override
@@ -292,306 +302,306 @@ public class MainActivity extends WinBoLLActivity {
mainLayout . setBackgroundColor ( nPixelColor ) ;
}
}
/**
* 显示广告( 核心修复: 传递安全的Context + 生命周期校验)
*/
private void showAd ( ) {
LogUtils. d ( TAG , " showAd() " ) ;
// 1. 生命周期校验: 避免Activity已销毁时操作UI
if ( isFinishing ( ) | | isDestroyed ( ) ) {
LogUtils. e ( TAG , " showAd: Activity is finishing or destroyed" ) ;
return ;
}
// 2. 非空校验:广告实例和容器
if ( mBannerAd = = null | | mContainer = = null ) {
LogUtils. e ( TAG , " showAd: BannerAd or Container is null" ) ;
return ;
}
// 3. 创建广告容器( 使用ApplicationContext避免内存泄漏)
final FrameLayout container = new FrameLayout( getApplicationContext( ) ) ;
container. setPadding( 0 , 0 , 0 , MimoUtils. dpToPx( this , 10 ) ) ;
mContainer. addView( container, new FrameLayout. LayoutParams (
FrameLayout. LayoutParams. MATCH_PARENT ,
FrameLayout. LayoutParams. WRAP_CONTENT
) ) ;
if ( mIsBiddingWin) {
mBannerAd. setPrice( getPrice( ) ) ;
}
// 4. 显示广告: 传递ApplicationContext, 避免Activity Context失效
mBannerAd. showAd( MainActivity. this , container , new BannerAd. BannerInteractionListener( ) {
@Override
public void onAdClick ( ) {
LogUtils. d ( TAG , " onAdClick" ) ;
}
@Override
public void onAdShow ( ) {
LogUtils. d ( TAG , " onAdShow " ) ;
}
@Override
public void onAdDismiss ( ) {
LogUtils. d ( TAG , " onAdDismiss" ) ;
// 修复: 移除容器时校验Activity状态
if ( ! isFinishing ( ) & & ! isDestroyed ( ) & & mContainer ! = null ) {
mContainer. removeView( container) ;
}
}
@Override
public void onRenderSuccess( ) {
LogUtils. d ( TAG , " onRenderSuccess" ) ;
}
@Override
public void onRenderFail ( int code , String msg ) {
LogUtils. e ( TAG , " onRenderFail errorCode " + code + " errorMsg " + msg ) ;
// 修复:渲染失败时移除容器
if ( ! isFinishing ( ) & & ! isDestroyed ( ) & & mContainer ! = null ) {
mContainer. removeView( container) ;
}
}
} ) ;
}
/**
* 请求广告( 核心修复: Context安全校验 + 异常捕获 + 资源管理)
*/
private void fetchAd ( ) {
LogUtils. d ( TAG , " fetchAd()" ) ;
// 1. 双重校验: Activity未销毁 + Context非空
if ( isFinishing ( ) | | isDestroyed ( ) | | getApplicationContext ( ) = = null ) {
LogUtils. e ( TAG , " fetchAd: Invalid Context or Activity state" ) ;
return ;
}
// 2. 释放之前的广告资源,避免内存泄漏
if ( mBannerAd ! = null ) {
mBannerAd. destroy( ) ;
}
// 3. 初始化广告( 使用ApplicationContext, 避免Activity Context失效)
try {
mBannerAd = new BannerAd ( ) ;
mAllBanners. add ( mBannerAd) ;
} catch ( Exception e ) {
LogUtils. e ( TAG , " fetchAd: Init BannerAd failed" , e ) ;
return ;
}
// 4. 设置下载监听
mBannerAd. setDownLoadListener( new BannerAd. BannerDownloadListener( ) {
@Override
public void onDownloadStarted( ) {
LogUtils. d ( TAG , " onDownloadStarted" ) ;
}
@Override
public void onDownloadPaused( ) {
LogUtils. d ( TAG , " onDownloadPaused" ) ;
}
@Override
public void onDownloadFailed( int errorCode) {
LogUtils. d ( TAG , " onDownloadFailed, errorCode = " + errorCode) ;
}
@Override
public void onDownloadFinished( ) {
LogUtils. d ( TAG , " onDownloadFinished" ) ;
}
@Override
public void onDownloadProgressUpdated( int progress ) {
LogUtils. d ( TAG , " onDownloadProgressUpdated " + progress + " % " ) ;
}
@Override
public void onInstallFailed( int errorCode) {
LogUtils. d ( TAG , " onInstallFailed, errorCode = " + errorCode) ;
}
@Override
public void onInstallStart( ) {
LogUtils. d ( TAG , " onInstallStart" ) ;
}
@Override
public void onInstallSuccess( ) {
LogUtils. d ( TAG , " onInstallSuccess" ) ;
}
@Override
public void onDownloadCancel( ) {
LogUtils. d ( TAG , " onDownloadCancel" ) ;
}
} ) ;
// 5. 构建广告参数并请求
String currentAD_ID = getAD_ID ( ) ;
LogUtils. d ( TAG , String. format( " currentAD_ID = %s" , currentAD_ID) ) ;
ADParams params = new ADParams. Builder( ) . setUpId( currentAD_ID) . build ( ) ;
mBannerAd. loadAd( params, new BannerAd. BannerLoadListener( ) {
@Override
public void onBannerAdLoadSuccess( ) {
LogUtils. d ( TAG , " onBannerAdLoadSuccess()" ) ;
// 修复: 广告加载成功后校验Activity状态
if ( ! isFinishing ( ) & & ! isDestroyed ( ) ) {
showAd( ) ;
}
}
@Override
public void onAdLoadFailed ( int errorCode, String errorMsg) {
LogUtils. e ( TAG , " onAdLoadFailed: errorCode = " + errorCode + " , errorMsg = " + errorMsg) ;
// 修复:加载失败时移除当前广告实例
if ( mAllBanners. contains( mBannerAd) ) {
mAllBanners. remove( mBannerAd) ;
}
mBannerAd. destroy( ) ;
mBannerAd = null ;
}
} ) ;
}
/**
* 根据当前秒数获取广告ID( 原逻辑保留)
*/
private String getAD_ID( ) {
long currentSecond = System. currentTimeMillis( ) / 1000 ;
return ( currentSecond % 2 = = 0 ) ? BANNER_POS_ID :
( BuildConfig. DEBUG ? BANNER_POS_ID_WINBOLL_BETA : BANNER_POS_ID_WINBOLL) ;
}
/**
* 获取广告价格(原逻辑保留,添加空指针校验)
*/
private long getPrice ( ) {
if ( mBannerAd = = null ) {
return 0 ;
}
Map< String, Object > map = mBannerAd. getMediaExtraInfo( ) ;
if ( map = = null | | map . isEmpty ( ) | | ! map . containsKey ( " price " ) ) {
LogUtils. w ( TAG , " getPrice: media extra info is null or no price key" ) ;
return 0 ;
}
Object priceObj = map . get ( " price " ) ;
if ( priceObj instanceof Long ) {
return ( Long ) priceObj ;
} else if ( priceObj instanceof Integer) {
return ( ( Integer ) priceObj ) . longValue( ) ;
} else {
LogUtils. e ( TAG , " getPrice: price type is invalid" ) ;
return 0 ;
}
}
/**
* 显示隐私协议弹窗( 原逻辑保留, 优化Context使用)
*/
private void showPrivacy ( ) {
// 校验Activity状态, 避免弹窗泄露
if ( isFinishing ( ) | | isDestroyed ( ) ) {
return ;
}
String privacyAgreeValue = getSharedPreferences( ) . getString( PRIVACY_VALUE, null ) ;
if ( TextUtils. equals( privacyAgreeValue, String. valueOf( 0 ) ) ) {
LogUtils. i ( TAG , " 已拒绝隐私协议,广告已处于不可用状态..." ) ;
Toast. makeText( getApplicationContext( ) , " 已拒绝隐私协议,广告已处于不可用状态" , Toast . LENGTH_SHORT ) . show ( ) ;
return ;
}
if ( TextUtils. equals( privacyAgreeValue, String. valueOf( 1 ) ) ) {
LogUtils. i ( TAG , " 已同意隐私协议, 开始初始化米盟SDK..." ) ;
initMimoSdk( ) ;
return ;
}
LogUtils. i ( TAG , " 开始弹出隐私协议..." ) ;
AlertDialog. Builder builder = new AlertDialog. Builder( this ) ;
builder. setTitle( " 用户须知 " ) ;
builder. setMessage( " 小米广告SDK隐私政策: https://dev.mi.com/distribute/doc/details?pId=1688, 请复制到浏览器查看" ) ;
builder. setIcon( R . drawable. ic_launcher) ;
builder. setCancelable( false ) ; // 点击对话框以外的区域不消失
builder. setPositiveButton( " 同意 " , new DialogInterface. OnClickListener( ) {
@Override
public void onClick ( DialogInterface dialog, int which ) {
getSharedPreferences( ) . edit ( )
. putString( PRIVACY_VALUE, String. valueOf( 1 ) )
. apply ( ) ;
initMimoSdk( ) ;
dialog. dismiss( ) ;
}
} ) ;
builder. setNegativeButton( " 拒绝 " , new DialogInterface. OnClickListener( ) {
@Override
public void onClick ( DialogInterface dialog, int which ) {
getSharedPreferences( ) . edit ( )
. putString( PRIVACY_VALUE, String. valueOf( 0 ) )
. apply ( ) ;
dialog. dismiss( ) ;
}
} ) ;
AlertDialog dialog = builder. create( ) ;
// 配置弹窗位置(底部全屏)
Window window = dialog. getWindow( ) ;
if ( window ! = null ) {
window. setGravity( Gravity. BOTTOM) ;
WindowManager m = getWindowManager( ) ;
Display d = m . getDefaultDisplay( ) ;
WindowManager. LayoutParams p = window. getAttributes( ) ;
p . width = d . getWidth ( ) ;
window. setAttributes( p ) ;
}
dialog. show ( ) ;
}
/**
* 初始化米盟SDK( 核心修复: 传递ApplicationContext + 异常捕获)
*/
private void initMimoSdk ( ) {
// 1. 安全获取ApplicationContext, 避免Activity Context失效
Context appContext = getApplicationContext( ) ;
if ( appContext = = null ) {
Log. e ( TAG , " initMimoSdk: ApplicationContext is null" ) ;
return ;
}
// 2. 初始化SDK, 捕获异常避免崩溃
try {
MimoSdk. init ( appContext , new MimoCustomController( ) {
@Override
public boolean isCanUseLocation( ) {
return true ;
}
@Override
public MimoLocation getMimoLocation( ) {
return null ;
}
@Override
public boolean isCanUseWifiState( ) {
return true ;
}
@Override
public boolean alist ( ) {
return true ;
}
} , new MimoSdk. InitCallback( ) {
@Override
public void success ( ) {
Log. d ( TAG , " MimoSdk init success" ) ;
}
@Override
public void fail ( int code , String msg ) {
Log. e ( TAG , " MimoSdk init fail, code= " + code + " ,msg= " + msg ) ;
}
} ) ;
MimoSdk. setDebugOn( true ) ;
} catch ( Exception e ) {
Log. e ( TAG , " initMimoSdk: init failed" , e ) ;
}
}
//
// /**
// * 显示广告( 核心修复: 传递安全的Context + 生命周期校验)
// */
// private void showAd() {
// LogUtils.d(TAG, "showAd()") ;
// // 1. 生命周期校验: 避免Activity已销毁时操作UI
// if (isFinishing() || isDestroyed()) {
// LogUtils.e(TAG, " showAd: Activity is finishing or destroyed") ;
// return;
// }
// // 2. 非空校验:广告实例和容器
// if (mBannerAd == null || mContainer == null) {
// LogUtils.e(TAG, " showAd: BannerAd or Container is null") ;
// return;
// }
// // 3. 创建广告容器( 使用ApplicationContext避免内存泄漏)
// final FrameLayout container = new FrameLayout( getApplicationContext()) ;
// container. setPadding(0, 0, 0, MimoUtils. dpToPx(this, 10)) ;
// mContainer. addView( container, new FrameLayout. LayoutParams(
// FrameLayout. LayoutParams. MATCH_PARENT,
// FrameLayout. LayoutParams. WRAP_CONTENT
// )) ;
//
// if ( mIsBiddingWin) {
// mBannerAd. setPrice( getPrice()) ;
// }
// // 4. 显示广告: 传递ApplicationContext, 避免Activity Context失效
// mBannerAd. showAd( MainActivity.this, container, new BannerAd. BannerInteractionListener() {
// @Override
// public void onAdClick() {
// LogUtils.d(TAG, " onAdClick") ;
// }
//
// @Override
// public void onAdShow() {
// LogUtils.d(TAG, "onAdShow") ;
// }
//
// @Override
// public void onAdDismiss() {
// LogUtils.d(TAG, " onAdDismiss") ;
// // 修复: 移除容器时校验Activity状态
// if (!isFinishing() && !isDestroyed() && mContainer != null) {
// mContainer. removeView( container) ;
// }
// }
//
// @Override
// public void onRenderSuccess() {
// LogUtils.d(TAG, " onRenderSuccess") ;
// }
//
// @Override
// public void onRenderFail(int code, String msg) {
// LogUtils.e(TAG, "onRenderFail errorCode " + code + " errorMsg " + msg) ;
// // 修复:渲染失败时移除容器
// if (!isFinishing() && !isDestroyed() && mContainer != null) {
// mContainer. removeView( container) ;
// }
// }
// }) ;
// }
//
// /**
// * 请求广告( 核心修复: Context安全校验 + 异常捕获 + 资源管理)
// */
// private void fetchAd() {
// LogUtils.d(TAG, " fetchAd()") ;
// // 1. 双重校验: Activity未销毁 + Context非空
// if (isFinishing() || isDestroyed() || getApplicationContext() == null) {
// LogUtils.e(TAG, " fetchAd: Invalid Context or Activity state") ;
// return;
// }
// // 2. 释放之前的广告资源,避免内存泄漏
// if (mBannerAd != null) {
// mBannerAd. destroy() ;
// }
// // 3. 初始化广告( 使用ApplicationContext, 避免Activity Context失效)
// try {
// mBannerAd = new BannerAd() ;
// mAllBanners.add( mBannerAd) ;
// } catch (Exception e) {
// LogUtils.e(TAG, " fetchAd: Init BannerAd failed", e) ;
// return;
// }
// // 4. 设置下载监听
// mBannerAd. setDownLoadListener(new BannerAd. BannerDownloadListener() {
// @Override
// public void onDownloadStarted() {
// LogUtils.d(TAG, " onDownloadStarted") ;
// }
//
// @Override
// public void onDownloadPaused() {
// LogUtils.d(TAG, " onDownloadPaused") ;
// }
//
// @Override
// public void onDownloadFailed(int errorCode) {
// LogUtils.d(TAG, " onDownloadFailed, errorCode = " + errorCode) ;
// }
//
// @Override
// public void onDownloadFinished() {
// LogUtils.d(TAG, " onDownloadFinished") ;
// }
//
// @Override
// public void onDownloadProgressUpdated(int progress) {
// LogUtils.d(TAG, " onDownloadProgressUpdated " + progress + "%") ;
// }
//
// @Override
// public void onInstallFailed(int errorCode) {
// LogUtils.d(TAG, " onInstallFailed, errorCode = " + errorCode) ;
// }
//
// @Override
// public void onInstallStart() {
// LogUtils.d(TAG, " onInstallStart") ;
// }
//
// @Override
// public void onInstallSuccess() {
// LogUtils.d(TAG, " onInstallSuccess") ;
// }
//
// @Override
// public void onDownloadCancel() {
// LogUtils.d(TAG, " onDownloadCancel") ;
// }
// }) ;
//
// // 5. 构建广告参数并请求
// String currentAD_ID = getAD_ID() ;
// LogUtils.d(TAG, String. format(" currentAD_ID = %s", currentAD_ID)) ;
// ADParams params = new ADParams. Builder(). setUpId( currentAD_ID).build() ;
// mBannerAd. loadAd( params, new BannerAd. BannerLoadListener() {
// @Override
// public void onBannerAdLoadSuccess() {
// LogUtils.d(TAG, " onBannerAdLoadSuccess()") ;
// // 修复: 广告加载成功后校验Activity状态
// if (!isFinishing() && !isDestroyed()) {
// showAd() ;
// }
// }
//
// @Override
// public void onAdLoadFailed(int errorCode, String errorMsg) {
// LogUtils.e(TAG, " onAdLoadFailed: errorCode = " + errorCode + ", errorMsg = " + errorMsg) ;
// // 修复:加载失败时移除当前广告实例
// if ( mAllBanners. contains( mBannerAd)) {
// mAllBanners. remove( mBannerAd) ;
// }
// mBannerAd. destroy() ;
// mBannerAd = null;
// }
// }) ;
// }
//
// /**
// * 根据当前秒数获取广告ID( 原逻辑保留)
// */
// private String getAD_ID() {
// long currentSecond = System. currentTimeMillis() / 1000;
// return ( currentSecond % 2 == 0) ? BANNER_POS_ID :
// ( BuildConfig.DEBUG ? BANNER_POS_ID_WINBOLL_BETA : BANNER_POS_ID_WINBOLL) ;
// }
//
// /**
// * 获取广告价格(原逻辑保留,添加空指针校验)
// */
// private long getPrice() {
// if (mBannerAd == null) {
// return 0 ;
// }
// Map< String, Object> map = mBannerAd. getMediaExtraInfo() ;
// if (map == null || map.isEmpty() || !map.containsKey("price")) {
// LogUtils.w(TAG, " getPrice: media extra info is null or no price key") ;
// return 0 ;
// }
// Object priceObj = map.get("price") ;
// if ( priceObj instanceof Long) {
// return (Long) priceObj;
// } else if ( priceObj instanceof Integer) {
// return ((Integer) priceObj). longValue() ;
// } else {
// LogUtils.e(TAG, " getPrice: price type is invalid") ;
// return 0 ;
// }
// }
//
// /**
// * 显示隐私协议弹窗( 原逻辑保留, 优化Context使用)
// */
// private void showPrivacy() {
// // 校验Activity状态, 避免弹窗泄露
// if (isFinishing() || isDestroyed()) {
// return;
// }
// String privacyAgreeValue = getSharedPreferences(). getString( PRIVACY_VALUE, null) ;
// if ( TextUtils. equals( privacyAgreeValue, String. valueOf(0))) {
// LogUtils.i(TAG, " 已拒绝隐私协议,广告已处于不可用状态...") ;
// Toast. makeText( getApplicationContext(), " 已拒绝隐私协议,广告已处于不可用状态", Toast.LENGTH_SHORT).show() ;
// return;
// }
// if ( TextUtils. equals( privacyAgreeValue, String. valueOf(1))) {
// LogUtils.i(TAG, " 已同意隐私协议, 开始初始化米盟SDK...") ;
// initMimoSdk() ;
// return;
// }
// LogUtils.i(TAG, " 开始弹出隐私协议...") ;
// AlertDialog. Builder builder = new AlertDialog. Builder(this) ;
// builder. setTitle("用户须知") ;
// builder. setMessage(" 小米广告SDK隐私政策: https://dev.mi.com/distribute/doc/details?pId=1688, 请复制到浏览器查看") ;
// builder. setIcon(R. drawable. ic_launcher) ;
// builder. setCancelable(false); // 点击对话框以外的区域不消失
// builder. setPositiveButton("同意", new DialogInterface. OnClickListener() {
// @Override
// public void onClick( DialogInterface dialog, int which) {
// getSharedPreferences().edit( )
// . putString( PRIVACY_VALUE, String. valueOf(1) )
// .apply() ;
// initMimoSdk() ;
// dialog. dismiss() ;
// }
// }) ;
// builder. setNegativeButton("拒绝", new DialogInterface. OnClickListener() {
// @Override
// public void onClick( DialogInterface dialog, int which) {
// getSharedPreferences().edit( )
// . putString( PRIVACY_VALUE, String. valueOf(0) )
// .apply() ;
// dialog. dismiss() ;
// }
// }) ;
// AlertDialog dialog = builder. create() ;
//
// // 配置弹窗位置(底部全屏)
// Window window = dialog. getWindow() ;
// if (window != null) {
// window. setGravity( Gravity. BOTTOM) ;
// WindowManager m = getWindowManager() ;
// Display d = m. getDefaultDisplay() ;
// WindowManager. LayoutParams p = window. getAttributes() ;
// p.width = d.getWidth() ;
// window. setAttributes(p) ;
// }
// dialog.show() ;
// }
//
// /**
// * 初始化米盟SDK( 核心修复: 传递ApplicationContext + 异常捕获)
// */
// private void initMimoSdk() {
// // 1. 安全获取ApplicationContext, 避免Activity Context失效
// Context appContext = getApplicationContext() ;
// if (appContext == null) {
// Log.e(TAG, " initMimoSdk: ApplicationContext is null") ;
// return;
// }
// // 2. 初始化SDK, 捕获异常避免崩溃
// try {
// MimoSdk.init(appContext, new MimoCustomController() {
// @Override
// public boolean isCanUseLocation() {
// return true;
// }
//
// @Override
// public MimoLocation getMimoLocation() {
// return null;
// }
//
// @Override
// public boolean isCanUseWifiState() {
// return true;
// }
//
// @Override
// public boolean alist() {
// return true;
// }
// }, new MimoSdk. InitCallback() {
// @Override
// public void success() {
// Log.d(TAG, " MimoSdk init success") ;
// }
//
// @Override
// public void fail(int code, String msg) {
// Log.e(TAG, "MimoSdk init fail, code=" + code + ",msg=" + msg) ;
// }
// }) ;
// MimoSdk. setDebugOn(true) ;
// } catch (Exception e) {
// Log.e(TAG, " initMimoSdk: init failed", e) ;
// }
// }
@Override
public boolean dispatchKeyEvent ( KeyEvent event ) {
@@ -605,23 +615,23 @@ public class MainActivity extends WinBoLLActivity {
getSupportActionBar ( ) . setDisplayHomeAsUpEnabled ( false ) ;
}
}
/**
* 获取SharedPreferences实例( 原逻辑保留, 添加空指针校验)
*/
public SharedPreferences getSharedPreferences( ) {
if ( mSharedPreferences = = null ) {
// 修复: 使用ApplicationContext获取SharedPreferences, 避免Activity Context泄露
Context appContext = getApplicationContext( ) ;
if ( appContext ! = null ) {
mSharedPreferences = appContext. getSharedPreferences( PRIVACY_FILE, Context. MODE_PRIVATE) ;
} else {
Log. e ( TAG , " getSharedPreferences: ApplicationContext is null" ) ;
// 降级方案: 若ApplicationContext为空, 使用Activity Context( 仅作兼容)
mSharedPreferences = super . getSharedPreferences( PRIVACY_FILE, Context. MODE_PRIVATE) ;
}
}
return mSharedPreferences ;
}
//
// /**
// * 获取SharedPreferences实例( 原逻辑保留, 添加空指针校验)
// */
// public SharedPreferences getSharedPreferences() {
// if ( mSharedPreferences == null) {
// // 修复: 使用ApplicationContext获取SharedPreferences, 避免Activity Context泄露
// Context appContext = getApplicationContext() ;
// if (appContext != null) {
// mSharedPreferences = appContext. getSharedPreferences( PRIVACY_FILE, Context. MODE_PRIVATE) ;
// } else {
// Log.e(TAG, " getSharedPreferences: ApplicationContext is null") ;
// // 降级方案: 若ApplicationContext为空, 使用Activity Context( 仅作兼容)
// mSharedPreferences = super. getSharedPreferences( PRIVACY_FILE, Context. MODE_PRIVATE) ;
// }
// }
// return mSharedPreferences;
// }
}