从Eclipse迁移至Android Studio后添加Google插屏广告遇冲突报错求助
解决Android Studio中添加Google插屏广告时的Support库重复依赖问题
嘿,这个问题我之前帮好几个从Eclipse迁移到Android Studio的开发者解决过——本质就是Android Support v4库被重复引入导致的冲突:你添加的play-services-ads本身已经包含了适配的Support库,而你的项目里其他依赖(比如Rajawali、aFileChooser子模块,或者libs目录下的jar包)大概率也自带了v4库,打包时就会出现类重复的编译错误。咱们一步步来搞定它:
第一步:排查并移除手动引入的重复Support库
- 先检查项目根目录下的
app/libs文件夹,看看有没有android-support-v4.jar这类文件,如果有直接删除 - 打开依赖的子项目(
Rajawali、aFileChooser)的build.gradle文件,看它们是不是单独引入了support-v4依赖,如果有的话,要么删除这些子项目里的v4依赖,要么给它们配置依赖主模块的统一Support库
第二步:优化主模块的Gradle依赖配置
修改你的app模块dependencies块,给play-services-ads添加排除规则,避免重复引入Support库,同时统一匹配你compileSdk版本的Support库版本(你用的是27,所以要对应27.x.x的Support库):
dependencies { compile fileTree(include: '*.jar', dir: 'libs') compile project(':Rajawali') compile project(':aFileChooser') compile 'com.github.castorflex.smoothprogressbar:library:1.1.0' // 排除play-services-ads中自带的Support库,避免冲突 compile ('com.google.android.gms:play-services-ads:11.0.4') { exclude group: 'com.android.support', module: 'support-v4' exclude group: 'com.android.support', module: 'support-annotations' } // 统一引入与compileSdk匹配的support-v4库 compile 'com.android.support:support-v4:27.1.1' compile 'com.android.support:multidex:1.0.1' }
第三步:完善Multidex配置(确保生效)
因为你已经引入了Multidex依赖,还要确保它在项目中生效:
- 如果没有自定义Application类,直接在
AndroidManifest.xml的<application>标签里指定:
<application android:name="android.support.multidex.MultiDexApplication" ...> ... </application>
- 如果有自定义Application类,在类中添加以下代码:
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
第四步:清理并重新构建项目
点击Android Studio顶部菜单栏的:
Build->Clean Project- 然后
Build->Rebuild Project
额外:插屏广告的基础实现步骤(依赖问题解决后)
- 在
AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- 在目标Activity中初始化并展示插屏广告:
private InterstitialAd mInterstitialAd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); // 初始化插屏广告 mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId("你的AdMob插屏广告ID"); // 替换成你自己的ID // 请求加载广告 AdRequest adRequest = new AdRequest.Builder().build(); mInterstitialAd.loadAd(adRequest); // 设置广告加载完成监听,在合适时机展示(比如用户点击按钮后) mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdLoaded() { if (mInterstitialAd.isLoaded()) { mInterstitialAd.show(); } } }); }
内容的提问来源于stack exchange,提问作者Gaurav Mandlik
相关产品推荐
相关产品推荐

