android广告_android 穿山甲添加广告 - CSDN
精华内容
参与话题
  • 广告植入(集成万普广告平台) 平台使用 万普平台官网:http://www.waps.cn/ 集成万普SDK 添加配置信息 将以下权限添加到 AndroidManifest.xml 文件中 注:如果设置 android:targetSdkVersion,其值须设置为 15 ...

    广告植入(集成万普广告平台)

    平台使用

    万普平台官网:http://www.waps.cn/
    在这里插入图片描述
    在这里插入图片描述

    集成万普SDK

    在这里插入图片描述在这里插入图片描述
    添加配置信息 将以下权限添加到 AndroidManifest.xml 文件中

    注:如果设置 android:targetSdkVersion,其值须设置为 15 或 15 以下 。

    <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.GET_TASKS"/>
    
        <!-- 适配android8.0系统(若设置了targetSdkVersion为26以上,则必须添加此权限) -->
        <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
    
    

    混淆事项

    如果应用进行了混淆编译,需要在混淆的配置文件中加入以下代码,避免SDK被二次混淆编译,才能确保SDK功能正常使用。如果开发者使用了定制名的SDK,也需要对相应的包名加入类似代码:

    -keep public class cn.waps.** {*;}
    
    -keep public interface cn.waps.** {*;}
    
    -dontwarn cn.waps.**
    

    集成代码

    数据统计接口

    该接口是所有其他接口能正常使用的基础,在每次应用启动时,必须调用该接口进行初始化操作,才能保证获得准确的统计数据。

    步骤1:在的应用中第一个Activity类中(启动的第一个类),添加下面一行代码:

    //方式①:通过代码设置APP_ID和APP_PID
    
    AppConnect.getInstance("APP_ID","APP_PID",this);
    

    APP_ID为应用标识,该值由万普后台添加应用后自动生成,点击“应用详情”获取;

    APP _PID为分发渠道标识,使用规则请参见本文档附表《常用渠道编码表》。

    除了使用以上方法外,也可以通过在AndroidManifest内添加配置来设置APP_ID和APP_PID:

    <meta-data android:name="APP_ID"android:value="应用标识"/>
    
    <meta-data android:name="APP_PID"android:value="分发渠道标识"/>
    
    //方式②:通过AndroidManifest文件读取APP_ID和APP_PID
    
    AppConnect.getInstance(this);
    

    在这里插入图片描述
    注意:上传到万普平台官方合作商店(机锋、N多、木蚂蚁、优亿、联想、MM、十字猫等)的,需要采用方式②初始化,并需要严格按照《常用渠道编码表》的要求设置对应的APP_PID标识,才能快速通过商店审核;而对于其他可能会限制第三方广告SDK的应用商店,需要采用方式①初始化,并结合万普“在线参数”功能进行广告显示控制,在通过商店审核并正常发布之后再开启广告。

    步骤2:在程序退出的处理方法中, 添加下面一行代码:

    AppConnect.getInstance(this).close();
    

    在这里插入图片描述在这里插入图片描述

    积分墙、互动广告

    积分墙

    什么是积分墙?

    积分墙是指在一个应用内展示各种积分(货币)任务(下载安装推荐 的优质应用、注册、填表等),以供用户完成任务获得积分(货币)
    的广告解决方案。积分墙将广告与应用融为一体,避免生硬的广告推 送,对用户体验影响最小,单个用户对积分墙广告收入的贡献率比较 高。

    强大学习引擎让您的流量更有效率

    该引擎构建在多维立体优化模型基础上,依托用户在您应用中的所为 行为习惯,实时计算,动态决策,并且能够根据投放的历史数据自动
    学习、自动调优,确保您的收入不断提升,使您每个广告用户的单位价 值更加高效。

    积分墙广告计费方式

    可按CPA(效果)计费,实时检测数据。 如按CPA(效果)计费,则不重复计费展示数、点击数。

    积分墙(也称Offer,广告墙)是万普平台提供的一种集中展示型广告。开发者可在应用中合适的位置加入“推荐应用”、“免费赚积分”等类似字样的功能,获取更高的广告收益。添加如下代码,即可显示万普平台推荐应用列表:

    AppConnect.getInstance(this).showOffers(this);
    
    //对于使用“服务器通知接口”时,则使用下面的方法进行设置userId
    
    AppConnect.getInstance(this).showOffers(this, userId);
    

    说明:以上方法调用的为综合积分墙。SDK还提供了showAppOffers(this)、showGameOffers(this)两个接口,用于直接调用推荐软件列表、推荐游戏列表的积分墙。

    提示:开发者可通过万普后台的“广告设置”功能,手动设置积分墙的显示样式和广告内容。

    积分墙关闭监听接口(可选,可在积分墙关闭时调用getPoints方法更新积分或进行其它操作)

    //设置关闭积分墙的监听接口,必须在showOffers接口之前调用
    
    AppConnect.getInstance(this).setOffersCloseListener(new AppListener(){
    
          @Override
    
          public void onOffersClose() {
    
                // TODO 关闭积分墙时的操作代码
    
          }
    
    });
    

    在这里插入图片描述

    package com.example.ad;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    
    import cn.waps.AppConnect;
    import cn.waps.AppListener;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //初始化
            AppConnect.getInstance(this);
            //监听广告墙关闭事件
            AppConnect.getInstance(this).setOffersCloseListener(new AppListener(){
                @Override
                public void onOffersClose() {
                    super.onOffersClose();
                    // TODO 关闭积分墙时的操作代码
                }
            });
        }
    
        public void show(View view){
            AppConnect.getInstance(this).showOffers(this);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //关闭
            AppConnect.getInstance(this).close();
        }
    }
    
    

    互动广告

    互动广告是一个显示在应用内固定位置高度为50像素广告条,将自动显示万普平台提供的广告。结合虚拟货币功能使用,可获得最佳的广告效果和用户体验。

    方式①:通过布局文件添加互动广告
    
    步骤1: 复制如下代码到相应Activiy的Layout文件中,并放置在合适的位置:
    
    <LinearLayout  android:id="@+id/AdLinearLayout"
    
    android:layout_width="fill_parent"
    
    android:layout_height="wrap_content"
    
    android:gravity="center_horizontal"/>
    

    步骤2: 在调用样式文件的Activity类中, 添加下面的代码:

    LinearLayout adlayout =(LinearLayout)findViewById(R.id.AdLinearLayout);
    
    AppConnect.getInstance(this).showBannerAd(this, adlayout);
    

    方式②:纯代码模式添加互动广告

    LinearLayout adlayout = new LinearLayout(this);
    
    adlayout.setGravity(Gravity.CENTER_HORIZONTAL);
    
    RelativeLayout.LayoutParamslayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
                                                    ViewGroup.LayoutParams.WRAP_CONTENT);
    
    AppConnect.getInstance(this).showBannerAd(this, adlayout);
    
    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);//设置顶端或低端
    
    this.addContentView(adlayout, layoutParams);
    

    互动广告无数据时的回调监听:(2.3.2版本加入)

    AppConnect.getInstance(this).setBannerAdNoDataListener(new AppListener(){
    
          @Override
    
          public void onBannerNoData() {
    
                Log.e("debug", "Banner广告无数据");
    
          }
    
    });
    
           该接口需要在showBannerAd之前调用。
    

    插屏广告、迷你广告

    插屏广告

    插屏广告是1.8版本SDK开始推出的一种新型广告形式,以全屏对话框的新式显示广告,支持透明背景和浮层特效。和传统Banner广告相比,显示效果更炫,转化率更高,而且具有良好的用户体验。不占用固定广告位,特别适用于应用启动、游戏通关等场景使用。

    初始化(预先加载)广告数据:

    AppConnect.getInstance(this).initPopAd(this);
    

    说明:该方法将通过异步方式预先加载5-10条插屏广告到本地缓存,如果事先未通该方法初始化广告,或者在数据未加载完成的情况下直接显示插屏广告,将重新异步加载一次数据,等待数据加载完成后才能显示出广告,会造成一定的延时。

    显示插屏广告:

    AppConnect.getInstance(this).showPopAd(this);
    
    //调用方式2:显示插屏广告时设置关闭插屏广告的监听接口 (选用)
    
    AppConnect.getInstance(this).showPopAd(this, new AppListener(){
    
              @Override
    
              public void onPopClose() {super.onPopClose();   }
    
    });
    

    说明:该方法将根据应用当前场景,用自适应方式显示插屏广告。

    获取插屏广告对话框(可选):

    Dialog popAdDialog = AppConnect.getInstance(this).getPopAdDialog();
    

    说明:该方法仅用于先通过调用showPodAd方法正常显示出插屏广告后,获取到插屏广告对话框实例,实现对插屏广告的显示过程灵活控制,比如监听广告关闭事件、定时自动关闭广告等自定义效果,但不能用于取代showPodAd方法直接显示插屏广告。当插屏广告尚未正常显示时,该方法可能会获取到空值。

    获取插屏广告内嵌布局(可选):

    //获取默认宽高的插屏广告布局
    
    View popAdDialog = AppConnect.getInstance(this).getPopAdView(this);//默认400*400
    
    //获取可自定义宽高的插屏广告布局
    
    View popAdDialog = AppConnect.getInstance(this).getPopAdView(this, width, height);
    

    说明:该接口可用于将插屏广告灵活插入到应用内,用于实现开屏广告、退屏广告、界面内嵌入式广告等灵活的广告形式。随本文档提供的Demo程序中,提供了一份完整的开屏广告和退屏广告的实现样例和源码,开发者可直接引用,也可进行任意修改用于实现更多的广告形式。

    判断插屏广告是否初始化完成:

    //判断插屏广告是否已初始化完成,用于确定是否能成功调用插屏广告
    
    booleanhasPopAd = AppConnect.getInstance(this).hasPopAd(this);
    

    从2.3.1版本开始,插屏广告展示时默认屏蔽了设备back键可关闭广告的功能。如需启用back键的关闭插屏广告的功能,可在调用插屏广告之前添加如下代码:

    // 参数true表示可使用设备back键关闭插屏广告,不调用该代码则使用默认值false不可关闭
    
    AppConnect.getInstance(this).setPopAdBack(true);
    

    互动广告无数据时的回调监听:(2.3.2版本加入)

    AppConnect.getInstance(this).setPopAdNoDataListener(new AppListener(){
    
          @Override
    
          public void onPopNoData() {
    
                Log.e("debug", "插屏广告已经没有数据");
    
          }
    
    });
    
           注:该接口需要在showPopAd之前调用。
    

    迷你广告

    迷你广告是一种基于自定义广告的广告形式,每个广告由一个微缩图标和文字链组成,高度仅为24像素,文字颜色、背景颜色及透明度可自定义,特别适用于广告位空间有限的游戏类应用。和传统的Banner大广告条相比,迷你广告采用了流量压缩和本地缓存方式轮换广告,不仅省广告位,而且非常省流量,广告轮换频率更高,相比传统Banner广告条有更高的收益。

    步骤1: 复制如下代码到相应Activiy的Layout文件中,并放置在合适的位置:

    <LinearLayoutandroid:id="@+id/miniAdLinearLayout"
    
    android:layout_width="wrap_parent"
    
    android:layout_height="wrap_content"
    
    android:gravity="center_horizontal"/>
    

    步骤2: 在调用样式文件的Activity类中, 添加下面的代码:

    //设置迷你广告背景颜色
    
    AppConnect.getInstance(this).setAdBackColor(Color.argb(50, 120, 240, 120));
    
    //设置迷你广告广告语颜色
    
    AppConnect.getInstance(this).setAdForeColor(Color.YELLOW);
    
    //若未设置以上两个颜色,则默认为黑底白字
    
    LinearLayout miniLayout =(LinearLayout)findViewById(R.id.miniAdLinearLayout);
    
    AppConnect.getInstance(this).showMiniAd(this, miniLayout, 10); //默认10秒切换一次广告
    

    在这里插入图片描述

    展开全文
  • Android 广告

    2020-07-26 23:32:34
    android 闪屏页和广告页的实现,同一页面首先展示闪频页,再展示广告页!
  • Android 启动页面与广告页面的实现

    万次阅读 2019-05-16 16:55:25
    在我们APP的开发过程中,启动页面是绕不开的,广告页面说不定,但是不得不说,这两个界面都是经常要用到的。接下来我记录一下我的实现过程。项目架构为MVP。  那么先看看我们的需求和流程:(当然这也是可以根据...

    在我们APP的开发过程中,启动页面是绕不开的,广告页面说不定,但是不得不说,这两个界面都是经常要用到的。接下来我记录一下我的实现过程。项目架构为MVP。
      那么先看看我们的需求和流程:(当然这也是可以根据实际需求改动的)

    • 展示 logo 页面3秒
    • 服务端可以控制是否播放广告
    • 服务端可以控制播放广告的秒数
    • 服务端可以控制广告的内容(图片)和广告详情页面的链接

    这里写图片描述
      这里需要注意的一点是,从服务端请求数据是在展示 3 秒启动页的时候获取的。

    启动页

    如果我们稍微有留意的话,都会发现,我们自己的应用启动的时候都有一段白屏的状态。但是微信却没有,我们现在要做的是解决这个问题。
      首先我们来了解一下,冷启动,热启动。

    • 冷启动:是指进程从无到有的过程。因为要进行页面初始化,所以相对其他两个启动方式,消耗的时间是相对比较多的。
    • 热启动:是指之前的进程还在,在之前进程的基础上创建 Activity 的过程。这里耗时相对少一点。
        我们可以通过 Activity 的 theme 来修改这个白屏所显示的界面。根据上面的需求,我们需要显示3秒 logo 的页面。那么,我们干脆将我们的logo设置为背景图就行。
        <style name="AppTheme.NoActionBarWithBackGround">
            <item name="windowActionBar">false</item>//取消Actionbar
            <item name="windowNoTitle">true</item>
            <item name="android:windowFullscreen">true</item>//设置全屏
            <item name="android:windowBackground">@drawable/splash_jyz</item>//设置背景
        </style>
    

    然后让我们的 Activity 使用这个 theme 即可。

            <activity
                android:name=".View.iml.AdActivity"
                android:theme="@style/AppTheme.NoActionBarWithBackGround">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    

    那么我们来看看效果图:
    这里写图片描述

    广告页

    广告页我尝试过两种方式:
    1. glide 加载
    2. 通过下载文件,然后再加载
    如果使用glide加载广告图片,如果网络比较差,会存在广告页面空白的情况,因为使用 glide 无法判断在 3 秒展示 logo 的页面是否加载好了广告图片。这给用户的体验是比较差的,也是不太友好的,因为用户在空白界面拜拜等待了 3 秒。所以后面使用了将广告图片下载到本地的方法。
      这里进行数秒,这里是通过增加数字值来控制的,解决了服务端要控制广告时间的问题。之前使用过减少数字值来实现,但是要解决服务端控制广告时间,就没那么容易了。

    View

        private int countNum() {//数秒
            timeCount++;
            if (timeCount == 3) {//数秒,超过3秒后如果没有网络,则进入下一个页面
                if (!NetUtils.isConnected(AdActivity.this)) {
                    continueCount = false;
                    toNextActivity();
                    finish();
                }
                if (!loginCheckBean.isPlayAd()) {//如果服务端不允许播放广告,则直接进入下一个页面
                    continueCount = false;
                    toNextActivity();
                    finish();
                } else {//如果播放,则进行显示
                    ivAdvertising.setVisibility(View.VISIBLE);
                    layoutSkip.setVisibility(View.VISIBLE);
                }
            }
            if (timeCount == initTimeCount) {//超过广告显示的最长时间,进入下一个界面
                continueCount = false;
                toNextActivity();
                finish();
            }
            return timeCount;
        }
    
        public void toNextActivity() {//根据是否保存有 token 判断去登录界面还是主界面
            L.d("到下一个界面");
            Intent intent = null;
            String token = (String) SPUtils.get(AdActivity.this, "token", "");
            if (TextUtils.isEmpty(token)) {
                intent = new Intent(AdActivity.this, LoginActivity.class);
            } else {
                intent = new Intent(AdActivity.this, MainActivity.class);
                MyApplication.setToken(token);
            }
            startActivity(intent);
            finish();
        }
    

    Presenter##

    向服务端请求是否要播放广告

        public void getLoginCheck() {//向服务器请求是否要播放广告
            mAdModel.getLoginCheck()
                    .subscribeOn(Schedulers.io())                            //发布者在后台线程中运行
                    .observeOn(AndroidSchedulers.mainThread())               //订阅者在Android主线程中运行
                    .subscribe(new RxSubscribe<LoginCheckBean>() {
                        @Override
                        protected void _onNext(LoginCheckBean loginCheckBean) {
                            getMyView().setLoginCheckBean(loginCheckBean);
                            if (loginCheckBean.isPlayAd()) {//这里需要添加一个是否已经下载的判断,如果已经下载,则不再进行下载
                                getAdMessage();
                            }
                        }
    
                        @Override
                        protected void _onError(String message) {
    
                        }
    
                        @Override
                        public void onCompleted() {
    
                        }
                    });
        }
    
    

    获取图片地址,详情页面链接,广告的播放时间

        public void getAdMessage() {
            mAdModel.getAdMessage()
                    .subscribeOn(Schedulers.io())                            
                    .observeOn(AndroidSchedulers.mainThread())               
                    .subscribe(new RxSubscribe<AdMessageBean>() {
                        @Override
                        protected void _onNext(AdMessageBean adMessageBean) {
                            getMyView().setAdTime(adMessageBean.getAdTime());
                            getAdPicture(adMessageBean.getAdPictureUrl(), "123.jpg");
                        }
    
                        @Override
                        protected void _onError(String message) {
    
                        }
    
                        @Override
                        public void onCompleted() {
    
                        }
                    });
        }
    
    

    获取广告图片

        private void getLocalPicture(String localUrl) {
            Bitmap bitmap = BitmapFactory.decodeFile(localUrl);
            getMyView().setAdImg(bitmap);
        }
    
        public void getAdPicture(final String fileUrl, final String fileName) {//获取要展示的广告图片
            if (SPUtils.get((Context) getMyView(), "adPictureUrl", "").equals(fileUrl)) {//判断是否存在缓存
                L.d("从本地获取图片");
                getLocalPicture((String) SPUtils.get((Context) getMyView(),"adPictureAddress",""));
            } else {
                L.d("从网络中获取图片");
                mAdModel.downLoadFile(fileUrl)
                        .subscribeOn(Schedulers.newThread())                            
                        .observeOn(AndroidSchedulers.mainThread())               
                        .map(new Func1<ResponseBody, Bitmap>() {
                            @Override
                            public Bitmap call(ResponseBody responseBody) {
                                if (responseBody != null) {
                                    L.d("收到的responseBody不为空!");
                                }
                                if (writeResponseBodyToDisk(responseBody, fileName, fileUrl)) {
                                    Bitmap bitmap = BitmapFactory.decodeFile(((Context) getMyView()).getExternalFilesDir(null) + File.separator + fileName);
                                    return bitmap;
                                }
                                return null;
                            }
                        }).subscribe(new RxSubscribe<Bitmap>((Context) getMyView()) {
                    @Override
                    protected void _onNext(Bitmap bitmap) {
                        getMyView().setAdImg(bitmap);
                    }
    
                    @Override
                    protected void _onError(String message) {
    
                    }
    
                    @Override
                    public void onCompleted() {
    
                    }
                });
            }
    
        }
    
    
        private boolean writeResponseBodyToDisk(ResponseBody body, String fileName, String fileUrl) {//保存图片到本地
            try {
                // todo change the file location/name according to your needs
    
                File futureStudioIconFile = new File(((Context) getMyView()).getExternalFilesDir(null) + File.separator + fileName);
                L.d("文件的保存地址为:" + ((Context) getMyView()).getExternalFilesDir(null) + File.separator + fileName);
                InputStream inputStream = null;
                OutputStream outputStream = null;
                try {
                    byte[] fileReader = new byte[4096];
                    long fileSize = body.contentLength();
                    long fileSizeDownloaded = 0;
                    inputStream = body.byteStream();
                    outputStream = new FileOutputStream(futureStudioIconFile);
                    while (true) {
                        int read = inputStream.read(fileReader);
                        if (read == -1) {
                            break;
                        }
                        outputStream.write(fileReader, 0, read);
                        fileSizeDownloaded += read;
    
                        L.d("file download: " + fileSizeDownloaded / fileSize * 100);
                        L.d("file download: " + fileSizeDownloaded + " of " + fileSize);
                    }
                    outputStream.flush();
    
                    SPUtils.put((Context) getMyView(), "adPictureAddress", ((Context) getMyView()).getExternalFilesDir(null) + File.separator + fileName);//下载好广告图片后,保存好当前广告图片的地址,为判断是否已经下载好图片做准备
                    SPUtils.put((Context) getMyView(), "adPictureUrl", fileUrl);
                    return true;
                } catch (IOException e) {
                    return false;
                } finally {
                    if (inputStream != null) {
                        inputStream.close();
                    }
                    if (outputStream != null) {
                        outputStream.close();
                    }
                }
            } catch (IOException e) {
                return false;
            }
        }
    
    

    Model

        public Observable<LoginCheckBean> getLoginCheck() {//假装服务器要展示广告
            return Observable.create(new Observable.OnSubscribe<LoginCheckBean>() {
                @Override
                public void call(Subscriber<? super LoginCheckBean> subscriber) {
                    subscriber.onNext(new LoginCheckBean(true));
                    subscriber.onCompleted();
                }
            });
        }
    
        public Observable<AdMessageBean> getAdMessage() {
            return Observable.create(new Observable.OnSubscribe<AdMessageBean>() {
                @Override
                public void call(Subscriber<? super AdMessageBean> subscriber) {//假装要展示 3 秒广告,且广告图为如下地址
                    subscriber.onNext(new AdMessageBean(3,"http://odjfpxwey.bkt.clouddn.com/2017-3-3-20-141110180-Screenshot_2017-02-23-23-10-26-062_com.tmall.wireless.png","http://www.baidu.com"));
                    subscriber.onCompleted();
                }
            });
        }
    
        public Observable<ResponseBody> downLoadFile(String fileUrl) {
            return retrofitService.downLoadFile(fileUrl);
        }
    

    哈哈,启动页和广告页的内容暂时是这些,github 地址如下:https://github.com/zonezoen/ForGitHubProject

    关注微信公众号:zone7,获取最新技术文章

    zone_qrcode.jpg

    展开全文
  • Android应用去广告方法盘点

    千次阅读 2018-03-13 15:35:39
    应用广告方式1、小平台应用由于其没有自己的广告系统,它们一般会嵌入第三方广告平台的SDK来显示广告,所以只需要分析第三方平台的SDK就行。2、大平台应用由于其拥有自己的广告平台,需要对其单独进行分析。去广告...

    应用广告方式

    1、小平台应用

    由于其没有自己的广告系统,它们一般会嵌入第三方广告平台的SDK来显示广告,所以只需要分析第三方平台的SDK就行。


    2、大平台应用

    由于其拥有自己的广告平台,需要对其单独进行分析。


    去广告的场景 

    1、游戏

    2、视频

    3、其他


     广告类应用的特点 

    对于一些包含广告的应用,它首先会进行广告的拉取,如果拉取到广告就会正常显示,否则就会跳过广告,所以我们既可以从网络请求着手,也可以从网络请求代码着手。


     去广告的方法 

    对于有root权限的手机

    1. 修改设备的hosts文件,对广告网络请求进行拦截替换

    把生成的过滤规则添加到设备的hosts文件中,Android中的hosts文件存放的目录是在根目录下的/etc/hosts


    典型软件代表:

    AdWay

    https://f-droid.org/en/packages/org.adaway/

    https://github.com/AdAway/AdAway


    2. 针对广告 API 进行拦截

    需要使用第三方hook框架来对广告API进行HOOK拦截,例如Xposed


    典型代表:

    MinMinGuard

    https://github.com/chiehmin/MinMinGuard


    3. 使用iptable拦截网络请求

    通过iptables命令设置filter表,针对来源是广告的做REJECT或是DROP操作。


    典型代表:

    droidwall

    https://github.com/CfYz/droidwall


    对于无root权限的手机

    1. 使用VPNService功能进行网络请求拦截,目前很多去广告应用都是这么干的。


    典型代表:

    https://github.com/M66B/NetGuard


    2. apk包反编译,修改广告请求相关代码,然后重打包,可以更改替换广告请求地址,也可以修改网络请求代码逻辑,总之使其请求结果失败就行。


    3. 设置电脑作为代理,修改电脑的hosts文件


    4. 修改路由器过滤规则,添加地址屏蔽规则



     总结 

    去广告的方法基本可以总结为两类:

    一、对广告的网络请求进行拦截

    网络拦截主要有三类:

    1. 修改host文件进行拦截

    2. 使用iptable拦截

    3. 使用代理进行拦截

    使用代理有三种方式:

    • 使用Android自带的VPNService

    • 修改路由器过滤规则

    • 设置电脑作为代理,修改电脑的hosts文件


    二、对广告API代码调用进行拦截

    广告API拦截分为静态方式和动态方式:

        1. 静态方式:反编译APK源码,对广告相关代码进行静态的修改,然后重新打包

        2. 动态方式:使用HOOK框架,对广告相关API的调用进行拦截


    最后需要补充的是网络请求拦截的方式不仅可以进行广告过滤,而且可以进行网络管理、流量管理、网络安全控制、联网控制、WiFi安全通道等很多方面的实现,既然将手机的整个网络流量给控制了,具体可以干什么,大家也可想而知。


     参考文章 

    http://t.cn/RECeFAt

    http://blog.csdn.net/itleaks/article/details/39692391

    https://www.jianshu.com/p/01f9f9954fc8


    欢迎关注我的公众号:DroidMind

    精品内容,独家发布

    展开全文
  • android 关于启动页广告的总结。

    千次阅读 2017-12-02 14:11:27
    android 启动页广告页的实现以及一些细节注意。

    公司最近随着版本的不断迭代有了广告页的需求。那么接下来我就总结下我们的思路以及实现方式。

    1.每次打开启动页的时候请求网络广告信息(包含广告图片url,广告相关联的链接,版本号,图片id)。

    2.从本地获取上次保存的广告信息缓存。

    3.如果存在缓存信息,将缓存信息和当前请求出来的广告信息中的版本号或者图片Id进行判断是否需要下载图片,如果需要就下载图片保存到本地。并且在广告也展示缓存中的广 告信息。

       如果不存在缓存信息,那就展示默认的背景图片。

    4.将本次请求的广告信息缓存。


    上边是主要的思路信息。

    下面是一下细节问题。

    1.我们使用glide加载本地路径的方式加载图片。

    2.用android api下载 将图片File 以固定的filePath 保存到本地。

    3.使用Acache保存请求出来的广告信息 。

    4这里需要用到两个计时器CouontTimer(原生Api)---CountTimerA ,CountTimerB,作用分别是CountTimerA 负责加载广告的倒计时3秒。CountTimerB负责 每次请求广告信息的时间控制,我们将时间控制在3秒,如果在网络不好的时候,会请求不出数据。3秒过后,我们直接进入app主页。

    5.由于有两个计时器,如果在3秒之后,闪屏页已经被销毁了,但是网络数据请求刚回来,相应的会操作View那么就会崩溃。所以我们要在请求广告信息成功或者失败的回调外层加上判断,只有当前页面没有被销毁才能加载页面。

    6.测试的时候要考虑到网络的不同情况,网络不好,或者没有网络,都要保证闪屏页的正常显示。


    展开全文
  • Android app嵌入广告开发心酸史

    千次阅读 热门讨论 2019-01-29 11:17:04
    自从加入Android开发以来一直有通过app插入广告上传到应用市场赚点外快的想法,但平时忙于公司开发而没有时间,年末了没有那么忙了,便想着搞搞个app试试,最后决定了先整个五子棋练练手,算是上道先,但没想到遇到...
  • TogetherAd 封装了多种广告的 SDK,可以自行控制请求各种广告次数的比例, 目前支持的广告 百度Mob、腾讯GDT、科大讯飞 功能介绍 多种平台随机展示 因为各个平台分发广告的量实际上有可能不够用,所以多种广告根据...
  • 如何在Android应用中加入广告

    万次阅读 热门讨论 2011-11-02 10:24:46
    前面在论坛里发了《Android学习及如何利用android来赚钱》帖子后,收到不少android开发者的回复,加上整理到博客里的回复,很多人问到如何在应用中加入广告,今天刚好有一个新的小应用要加广告,一起算写一篇总结。...
  • ANDROID广告轮播DEMO_仿淘宝广告轮播_滑动图片广告例子 2014-08-27 11:50:10 By: dwtedx Android dwtedx 5 7749 今天在项目中遇到了这样的需求、轮播图片来展示商品、刚刚已经分享了一种方法 ...
  • Android广告图片轮播控件 GitHub地址 https://github.com/youth5201314/banner 1.添加依赖 //图片轮播框架 implementation 'com.youth.banner:banner:1.4.10' //glide,比较好的版本,Matisse...
  • Android广告平台

    千次阅读 2018-07-21 12:36:35
    1.Android应用盈利广告平台的嵌入方法详解 2.Android广告平台  
  • 基于Android系统的设备上投放广告视频,比如:地铁广告屏、自助服务机器上的广告位,取号机广告等。 最近两天做了一个叫号机端的系统,内部有一块循环播放视频广告的处理,于是乎有了此篇小结 先来了解下视频广告...
  • Android广告轮播图效果实现

    千次阅读 2016-03-16 18:53:49
    效果如下:首先看下一下布局文件:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android...
  • Android 广告轮播效果实现

    千次阅读 2016-06-14 20:51:51
    使用ViewPager实现Android广告轮播效果,广告轮播是很多电商网站的必备,比如淘宝、京东的顶部广告轮播条,今天我们就是一步步利用ViewPager来实现广告轮播效果! 界面布局 资源文件编写 实现轮播 一、界面的布局...
  • 1、导入小米广告SDK SDK在 小米开发者平台 中可以下载 导入MimoSdk.jar,右击jar包,Add As Library 在Module的AndroidManifest.xml中加入SDK demo 中的相应权限 &amp;amp;lt;manifest xmlns:android=&...
  • Android广告SDK聚合开发

    千次阅读 2018-04-08 16:05:08
    开发需求需要聚合多渠道广告SDK,并对外提供一套调用接口,中间控制层添加己方服务器交互以及控制逻辑(广告填充优先级等),初次开发sdk,整理遇到的问题希望可以帮到有缘人。遇到的问题aar嵌套引用ClassNotFound这...
  • 视频暂停的时候显示的插屏广告,是用dialog来显示的么?还是什么?
  • Android 移动广告sdk的原理

    千次阅读 2018-05-30 12:18:13
    详细讲解一下android广告SDK在app里面到底会做什么以及应该做什么,知道了这些的话,就可以更好的优化自己的广告获取更多的收入,甚至可以根据这些步骤自己开发一款自己的广告SDK,用于制作自己的广告投放系统。...
  • Android广告SDK的Package

    千次阅读 2017-01-18 20:45:19
    记录一些Android中的adware package
  • android广告SDK原理详解(附源码)

    千次阅读 2017-08-16 11:52:07
    广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会...也有一些开发者为了能够提高自己的变现水平,同时接入了好几家的sdk,哪家出的收益高一点我就出哪家的广告,但是这
1 2 3 4 5 ... 20
收藏数 45,994
精华内容 18,397
关键字:

android广告