如何防止广告拦截器阻止应用上的广告

时间:2010-08-10 19:58:45

标签: android ads adblock

我的一位用户将这只猫从袋子中取出并告诉我他们正在使用我的免费应用程序之一,这些应用程序通过广告获利,但是他们用广告拦截器屏蔽了广告。他们嘲笑地告诉我,好像我对此无能为力。

我能为此做些什么吗?有没有办法检测到广告被阻止了?

15 个答案:

答案 0 :(得分:60)

我知道广告拦截的一种方式(实际上在任何计算机上),他们编辑hosts文件以指向所有已知广告服务器的localhost。对于android,它位于“etc / hosts”文件中。

例如,我使用admob广告和我从自定义rom中获取的主机文件列出了下面的admob条目:

127.0.0.1 analytics.admob.com
127.0.0.1 mmv.admob.com
127.0.0.1 mm.admob.com
127.0.0.1 admob.com
127.0.0.1 a.admob.com
127.0.0.1 jp.admob.com
127.0.0.1 c.admob.com
127.0.0.1 p.admob.com
127.0.0.1 mm1.vip.sc1.admob.com
127.0.0.1 media.admob.com
127.0.0.1 e.admob.com

现在,只要进程尝试解析上述地址,就会在这种情况下将它们路由到左侧列出的地址(localhost)。

我在我的应用程序中执行的操作是检查此主机文件并查找任何admob条目,如果我发现任何我通知用户我已检测到广告拦截并告诉他们从那里删除admob条目并且不允许他们使用该应用程序。

如果他们没有看到广告,那对我有什么好处呢?让他们免费使用该应用程序毫无意义。

以下是我如何实现这一目标的代码段:

        BufferedReader in = null;

    try 
    {
        in = new BufferedReader(new InputStreamReader(
                new FileInputStream("/etc/hosts")));
        String line;

        while ((line = in.readLine()) != null)
        {
            if (line.contains("admob"))
            {
                result = false;
                break;
            }
        }
    } 

我发誓所有广告支持的应用都应该检查此文件。您无需成为root用户即可访问它,但写入它可能是另一回事。

此外,不确定在基于Linux的操作系统上是否还有其他文件相同,但无论如何我们总能检查所有这些文件。

欢迎提出改善建议的任何建议。

此外,名为“Ad Free android”的应用程序需要root访问权限,这意味着它很可能会更改hosts文件以实现其目标。

答案 1 :(得分:25)

这个问题的代码是: -

try {
    if (InetAddress.getByName("a.admob.com").getHostAddress().equals("127.0.0.1") ||
        InetAddress.getByName("mm.admob.com").getHostAddress().equals("127.0.0.1") ||
        InetAddress.getByName("p.admob.com").getHostAddress().equals("127.0.0.1") ||
        InetAddress.getByName("r.admob.com").getHostAddress().equals("127.0.0.1")) {
        //Naughty Boy - Punishing code goes here.
        // In my case its a dialog which goes to the pay-for version 
        // of my application in the market once the dialog is closed.
    }
} catch (UnknownHostException e) { } //no internet

希望有所帮助。

答案 2 :(得分:9)

作为开发人员,我们需要做出与用户同情的艰难工作,并在惩罚试图利用的少数人和遵守规则的许多人之间找到中间立场。移动广告是允许某人免费使用功能软件的合理方式。使用广告拦截技术的用户可能会被视为收入损失,但如果您看一下大局,也可以是那些在您喜欢的情况下宣传您的应用程序的人。在阻止广告的系统上运行更温和的方法是显示您自己的“住宅”广告。创建一个或多个横幅图片,并使用相同高度的 ImageView (例如50dp)将其显示在与普通广告相同的位置。如果您成功收到广告,请将ImageView的可见性设置为View.GONE。您甚至可以创建一个计时器来循环浏览多个自家广告以引起用户的注意。点击您的广告可以将用户带到市场页面购买完整版。

答案 3 :(得分:4)

您可以查看您的应用中是否加载了广告?

广告拦截器的工作原理是阻止您的应用下载数据。您可以检查广告框架中数据的内容长度,以确保其中包含数据。

如果没有数据抛出消息并退出或通过电子邮件发出警告。

这可能不像您想象的那么大,因为只有一小部分人会屏蔽广告。

答案 4 :(得分:4)

前两个答案仅为您提供阻止广告的特定(如果可能是最受欢迎的)方法。 Root用户还可以使用设备上的防火墙阻止广告。 WiFi用户可以使用上游防火墙阻止广告。

我建议:

  1. 不要奖励广告拦截用户。即使无法加载广告,也请确保您的广告为广告保留部分展示广告。或者,如果您播放的是全屏广告,请确保即使广告无法播放,您的应用也会等待一段时间。如果您使用通知作为广告(您是渣滓),请在未能获得此类广告时通知用户。这可以理解为“烦恼所有您的用户”,但您的普通用户知道他们会得到什么,并且您的广告拦截“用户”不是通缉。

  2. 要求广告拦截器停止。提供用户需求的行业利润越少,行业提供用户所需内容的程度就越小。个别开发人员会发现他为其他用户提供更多资金。你知道这一点,你告诉他们后你的用户会认为这很明显,但这仍然是一个经济论点 - 它并不直观。有一个备用广告,上面写着“这是我的工作。如果你不给我付款,我会再收到一个,你就不会从我那里得到更多这样的应用。”

答案 5 :(得分:3)

我的方法是使用AdListener like this而不是检查单个软件安装或修改的主机文件,如果由于 NETWORK_ERROR 导致广告无法加载,我只是取一些随机的总是在线页面(对于踢,apple.com)并检查页面是否成功加载。

如果是, boom goes the app

要添加一些代码,监听器类将类似于:

public abstract class AdBlockerListener implements AdListener {

    @Override
    public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
        if (arg1.equals(ErrorCode.NETWORK_ERROR)) {
            try {
                URL url = new URL("http://www.apple.com/");
                URLConnection conn = url.openConnection();
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                reader.readLine();
                onAdBlocked();
            } catch (IOException e) {}
        }
    }

    public abstract void onAdBlocked();
}

然后使用adView的每个活动都会执行以下操作:

AdView adView = (AdView) findViewById(R.id.adView);
        adView.setAdListener(new AdBlockerListener() {
            @Override
            public void onAdBlocked() {
                AlertDialog ad = new AlertDialog.Builder(CalendarView.this)
                                    .setMessage("nono")
                                    .setCancelable(false)
                                    .setNegativeButton("OK", new OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                            System.exit(1);
                                        }
                                    })
                                    .show();
            }
        });

答案 6 :(得分:1)

您无法做任何事情,您的用户无法做得更好。

唯一让人想到的远程效果就是让广告成为程序中不可分割的一部分,这样如果它们被阻止,用户就无法理解/与应用程序交互。

答案 7 :(得分:1)

我认为这取决于广告的内容提供商。我知道AdMob SDK会在广告请求失败时提供回调功能。我怀疑你可以注册这个,然后检查回调中的连接 - 如果有连接并且你没有收到广告 - 注意,如果它发生超过一次或两次,很可能你的广告正在被屏蔽。我没有使用过Google的AdSense for Mobile工具集,但如果有类似的回调机制,我也不会感到惊讶。

答案 8 :(得分:1)

用户通过广告有两种方式:

1)使用不带互联网的应用程序。

2)使用root电话和修改后的主机文件。

我制作了两个可以实现的工具,请参阅下面的代码。

checkifonline();是问题1:

public void checkifonline() {
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    }

    if(haveConnectedWifi==false && haveConnectedMobile==false){

        // TODO (could make massage and than finish();
    }
}

adblockcheck();是问题2

private void adblockcheck() {
    BufferedReader in = null;
    boolean result = true;

    try 
    {
        in = new BufferedReader(new InputStreamReader(
                new FileInputStream("/etc/hosts")));
        String line;

        while ((line = in.readLine()) != null)
        {
            if (line.contains("admob"))
            {
                result = false;
                break;
            }
        }
    } catch (UnknownHostException e) { }
      catch (IOException e) {e.printStackTrace();}  

    if(result==false){

        // TODO (could make massage and than finish();

    }
}

答案 9 :(得分:0)

这是之前答案的扩展。用户已通知我他们正在使用的应用程序称为AdFree Android。它可以在市场上找到。该应用程序表示它的工作原理是“对提供广告的已知主机名的请求无效。”

我建议,如果您通过广告从您的任何应用中获利,请在启动时检查此计划并向用户提供令人讨厌的消息,然后终止您的应用。

答案 10 :(得分:0)

首先,我要说,我认为Ad Blocking在应用程序方面实际上是一种盗版形式。这些应用程序受广告支持,有时还支持关闭广告和/或添加功能的“付费许可”。通过屏蔽广告,用户可以从开发人员手中获取潜在收入,从而花时间创建您正在使用的应用。

无论如何,我想添加一种方法来帮助阻止使用广告拦截器。我使用这种方法,如果我检测到广告拦截器,我不允许用户使用该应用。人们非常生气,会给你很差的评价。但我也非常清楚地在我的应用程序描述中说明,如果你有一个广告拦截器,你将无法使用该应用程序。

我使用包管理器检查是否安装了特定的包。虽然这不会得到所有的广告拦截器,但如果你对一些受欢迎的版块保持“最新”,你可以获得大部分广告拦截器。

PackageManager pm = activity.getPackageManager ();
Intent intent = pm.getLaunchIntentForPackage ( "de.ub0r.android.adBlock" );
if ( Reflection.isPackageInstalled ( activity, intent ) ) {
  // they have adblock installed
}

答案 11 :(得分:0)

为您的用户提供在没有广告的情况下使用该应用的方法。我个人认为广告是我计算机上可能发生的最令人烦恼的事情之一,我很乐意为一个应用程序付费,如果它让我免受广告投入到我脸上的侮辱。我相信我不是唯一一个。

答案 12 :(得分:0)

对于没有互联网连接的情况,我跟着这个 tutorial 我建立了一个“网络状态监听器”,如下所示:

private BroadcastReceiver mConnReceiver = new BroadcastReceiver() 
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);

        if (noConnectivity == true)
        {
            Log.d(TAG, "No internet connection");
            image.setVisibility(View.VISIBLE);
        }
        else
        {
            Log.d(TAG, "Interet connection is UP");
            image.setVisibility(View.GONE);
            add.loadAd(new AdRequest());
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState)
{
    //other stuff
    private ImageView image = (ImageView) findViewById(R.id.banner_main);
    private AdView add = (AdView) findViewById(R.id.ad_main);
    add.setAdListener(new AdListener());
}

@Override
protected void onResume()
{
    registerReceiver(mConnReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    super.onResume();
}

@Override
protected void onPause()
{
    unregisterReceiver(mConnReceiver);
    super.onPause();
}
必须分别在onResume和onPause中调用registerReceiver和unregisterReceiver,如here所述。

在你的布局中,xml设置了你自己选择的AdView和ImageView,如下所示:

<com.google.ads.AdView xmlns:googleads="http://schemas.android.com/apk/lib/com.google.ads"
    android:layout_alignParentBottom="true"
    android:id="@+id/ad_main"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    googleads:adSize="BANNER"
    googleads:adUnitId="@string/admob_id" />

<ImageView
    android:id="@+id/banner_main"
    android:layout_centerInParent="true"
    android:layout_alignParentBottom="true"
    android:layout_width="379dp"
    android:layout_height="50dp"
    android:visibility="gone"
    android:background="@drawable/banner_en_final" />

现在,只要互联网连接可用,广告就会显示,当它关闭时,会弹出ImageView,反之亦然。这必须在您希望广告展示的每个活动中完成。

答案 13 :(得分:0)

除了检查admob是否可以解决之外,我所做的是提供一个页面,它基本上建议我检测到一个广告拦截器,说明我理解可能的原因,然后显示我自己的应用程序的一些内置广告并询问他们支持继续发展。 :)

答案 14 :(得分:-1)

我确信这个答案在某些开发人员群体中并不会完全受欢迎,但请考虑您是否属于这个类别,也许您的应用程序不应该存在于应用程序商店中。请注意,这些都可以实现代码更改,没有hackery或间谍软件需要的行为。

基本上,改变应用的经济效益。 用户永远是对的 - 这是有史以来最成功的广告公司之一(Google)采取的态度。如果您的广告被用户屏蔽,那是因为很糟糕,而不是因为广告或广告拦截器很糟糕。

http://books.google.com/books/about/The_User_is_Always_Right.html?id=gLjPMUjVvs0C

  • 让广告变得不那么烦人和面对面。用户对可怜的/烦人的广告作出反应,并且您的应用看起来和变得越来越多,他们越有可能放弃它。我不介意包含广告的应用,只要它们不会显着影响功能,甚至更好,我喜欢与我相关的广告。 (http://www.nngroup.com/articles/most-hated-advertising-techniques/
  • 要检测广告未加载,不必像以前的海报所提到的那样实施间谍软件。加载包含确认码的广告,并且每隔一段时间插入一个询问确认码的提示。代码不必冗长或烦人,事实上,实现具有3或4个字母/数字的验证码服务就足够了。 (http://textcaptcha.com/api
  • 除了检测广告加载失败外,还要制作更好的广告。而不是使用像mobads这样的API(你甚至意识到听起来多么肮脏吗?暴徒?真的吗?我们是开发者,俄罗斯黑手党吗?),与广告公司建立合作关系,允许你直接从你的应用中嵌入广告。这将使您的整体应用程序安装更大,不,您无法防止手动修改,但上面提到的更改也不能防止这种情况。这将更好地支持您的应用程序的任何付费版本,这将更轻量级(和更快)。
  • 彻底审核您向用户展示的广告,对广告政策保持公开透明,甚至允许用户检查您的广告和广告来源。我关注广告的主要原因不是因为我讨厌广告,而是因为我担心负责此应用的劣质开发人员也会放入病毒或其他恶意软件。要求对已安装的广告拦截器进行例外处理。与AdBlock等广告拦截者合作,获取他们的例外列表。如果您是合法的应用程序,这应该不是问题。 (http://www.cio.com/article/699970/6_Ways_to_Defend_Against_Drive_by_Downloads?page=1&taxonomyId=3089

我重复:以上所有更改都是您可以合法地在代码中执行 以防止反广告行为。广告因安全原因和内心反应而受阻,主要是带宽和性能,因此请确保您的广告不会在代码级别调用任何这些问题。

最后我确实想谈谈Borealid所说的内容,我在上面重复了一遍;最终它是一个“猫捉老鼠”游戏,因为用户在法律和道德上对自己的财产拥有最终的权力和责任。用户可以做任何事情,包括直接修改代码。当然,您可以实施限制,但总有办法解决问题。这是DRM(技术上)的最终问题(这是您正在尝试做的事情)。而不是浪费时间和精力在这个游戏上,最好是鼓励用户保持广告;他们将免费成为您最好,最聪明的反广告拦截器。