You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android调用适配器中插屏广告时出现java.lang.SecurityException报错求助

解决Android 6.0+设备插屏广告展示时的SecurityException崩溃问题

看起来你遇到的是插屏广告在高版本Android设备上的权限崩溃问题——模拟器正常但真实用户频繁反馈报错,核心原因基本都是广告展示的上下文无效或者时机不对,下面给你一步步的解决方案:

1. 必须用活跃的Activity上下文展示广告

很多开发者会不小心用Application Context来初始化或展示插屏广告,但Android 7.0+对非Activity上下文启动弹窗类UI(比如插屏广告)有严格的权限限制,直接抛出SecurityException。

修改你的InterstitialInsideshow方法,确保传递的是当前处于活跃状态的Activity实例:

// 错误示例:可能拿到的是Application Context
public void InterstitialInsideshow(Context context) {
    interstitialAd.show(context); // 这里会在高版本崩溃
}

// 正确做法:强制使用Activity上下文,并先验证状态
public void InterstitialInsideshow(Activity activity) {
    // 先检查Activity是否还存活
    if (activity == null || activity.isFinishing() || activity.isDestroyed()) {
        return; // 直接返回,避免崩溃
    }
    if (interstitialAd != null && interstitialAd.isLoaded()) {
        interstitialAd.show(activity);
    }
}

在Adapter的点击事件里,从ViewHolder的itemView获取Activity:

downloadButton.setOnClickListener(v -> {
    Activity currentActivity = (Activity) v.getContext();
    // 处理点击计数逻辑...
    if (clickCount >= 2) {
        InterstitialInsideshow(currentActivity);
        clickCount = 0;
    }
});

2. 严格检查Activity生命周期,避免在不可见时展示广告

当用户快速操作(比如点击两次后立刻退出页面),广告加载完成后去展示时,Activity可能已经处于onPause/onStop/onDestroy状态,这时候展示广告会触发权限异常。

在展示广告前,一定要加上这些判断:

  • Activity是否已经销毁(isDestroyed(),Android 11+支持,低版本可以自己维护一个生命周期标记)
  • Activity是否正在结束(isFinishing())
  • Activity是否处于可见状态(isResumed(),可选但更严谨)

3. 避免重复触发广告展示

点击计数逻辑要防止短时间内多次调用show()方法,这也可能引发异常。可以加一个标记变量控制广告展示状态:

private boolean isAdCurrentlyShowing = false;

// 点击事件里的逻辑
downloadButton.setOnClickListener(v -> {
    clickCount++;
    if (clickCount >= 2 && !isAdCurrentlyShowing) {
        isAdCurrentlyShowing = true;
        Activity currentActivity = (Activity) v.getContext();
        InterstitialInsideshow(currentActivity);
        clickCount = 0;
    }
});

// 在广告关闭的回调里重置标记
interstitialAd.setAdListener(new AdListener() {
    @Override
    public void onAdClosed() {
        isAdCurrentlyShowing = false;
        // 这里可以重新加载下一次要用的广告
        interstitialAd.loadAd(new AdRequest.Builder().build());
    }

    @Override
    public void onAdFailedToLoad(LoadAdError error) {
        isAdCurrentlyShowing = false; // 加载失败也要重置标记
    }
});

4. 更新广告SDK到最新版本

旧版本的广告SDK(比如Google AdMob)可能存在高版本Android的兼容性bug,更新到最新版本往往能解决很多权限相关的问题。比如AdMob的依赖更新:

implementation 'com.google.android.gms:play-services-ads:22.6.0' // 替换为当前最新版本

5. 排查特殊权限(可能性较低)

如果你的应用用到了SYSTEM_ALERT_WINDOW权限(一般插屏广告不需要),Android 6.0+需要用户手动授权,未授权时展示全屏类内容会触发SecurityException。如果不是必要权限,建议移除;如果必须用,要做好权限申请流程。


按照上面的步骤调整后,应该就能解决Android 6.0、7.0及以上版本的崩溃问题了。

内容的提问来源于stack exchange,提问作者Chaouki Anass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:44:06