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

我的一个用户让这只猫从袋子里走出来,告诉我他们正在使用我的一个免费应用程序,这个应用程序是通过广告获利的,但是他们用广告拦截器阻止了这些广告。 他们这样嘲弄地告诉我,好像我什么都做不了。

我可以做些什么吗? 有没有办法检测到广告被阻止?

我知道阻止广告的一种方法(在任何一台计算机上),他们编辑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 

现在,任何时候一个进程试图解决上述地址,在这种情况下,它们被路由到它们左侧列出的地址(本地主机)。

我在我的应用程序中所做的是检查此主机文件,并查找任何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; } } } 

我发誓所有广告支持的应用程序应检查此文件。 您不必为了访问而创build根目录,但写入它可能是一个不同的故事。

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

任何改善这个build议是值得欢迎的。

此外,名为“广告免费安卓”的应用程序需要root权限,这意味着它很可能会改变主机文件,以实现其目标。

我的这个问题的代码是这样的:

 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 

希望有所帮助。

作为开发者,我们需要对用户进行困惑的工作,在惩罚less数利用者和惩罚者之间find中间立场。 移动广告是允许某人免费使用function性软件的合理方式。 使用广告拦截技术的用户可能会被认为是收入损失,但是如果您看一眼全局,也可以是那些对您的应用程序感兴趣的用户。 在阻止广告的系统上运行更温和的方法是显示您自己的“内部”广告。 创build一个或多个横幅图像,并使用相同高度(例如50dp)的ImageView将其显示在与正常广告相同的位置。 如果您成功收到广告,请将ImageView的可见性设置为View.GONE。 你甚至可以创build一个计时器来循环浏览几个房屋广告,以获得用户的关注。 点击您的广告可以将用户带到市场页面购买完整版本。

你可以检查,看看广告加载在您的应用程序?

广告拦截工作阻止您的应用程序下载数据。 您可以检查广告框中数据的内容长度,以确保其中有数据。

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

由于只有一小部分人阻止了广告,因此这可能不像您想的那么严重。

前两个答案只有一个特定的(如果,可能是最stream行的)阻止广告的方法帮助你。 根用户也可以通过设备上的防火墙阻止广告。 WiFi用户可以使用上游防火墙阻止广告。

我build议:

  1. 不要奖励阻止广告的用户。 确保您的布局保留了广告显示的一部分,即使无法加载。 或者,如果您的全屏广告播放了一段时间,请确保即使广告无法播放,您的应用也会等待一段时间。 如果你使用通知作为广告(你败类),通知用户,当你没有得到这样的广告。 这可以理解为“烦恼所有的用户”,但是你的普通用户知道他们得到了什么,而你的广告拦截“用户”是不需要的。

  2. 要求广告拦截器停止。 提供用户想要的行业的盈利能力越差,行业将提供用户想要的就越less。 个人开发者会发现他为更多的用户提供更多的服务。 你知道这一点,你的用户在你告诉他们之后会觉得很明显,但这仍然是一个经济的论点 – 这不是直观的。 有一个备用广告,上面写着这样的话:“这是我的工作,如果你不付钱给我,我会再买一个,而且你不会从我这里得到更多的这样的应用程序。

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

如果是这样, 繁荣的应用程序

要添加一些代码,监听器类将是这样的:

 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(); } }); 

我相信这个答案不会完全受到某些开发者群体的欢迎,但是考虑一下,如果你属于这个类别,也许你的应用程序不值得在app store中存在。 请注意,这些都是可以实现的代码更改,没有hackery或间谍软件的行为所需。

基本上,改变你的应用程序的经济效益。 用户永远是对的 – 这是有史以来最成功的广告公司(Google)所采取的态度。 如果您的广告被用户屏蔽,那么您的广告吸引人,而不是因为广告或广告拦截器吸引。

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

  • 让广告更less烦人和面对面。 用户对穷人/烦人的广告作出反应,而且你的应用看上去越变得越萌,反正越有可能抛弃它。 我不介意在这些应用中使用广告,只要它们不会明显阻碍function,更好的是我喜欢与我相关的广告。 ( http://www.nngroup.com/articles/most-hated-advertising-techniques/
  • 为了检测到广告没有被加载,它不需要像以前的海报中提到的活动那样实施间谍软件。 加载具有确认码的广告,并且每隔一段时间插入一个提示,询问确认码。 代码不需要很长或烦人,实际上它可以实现一个3或4个字母/数字的validation码服务。 ( http://textcaptcha.com/api
  • 除了检测广告加载失败之外,还可以制作更好的广告。 而不是像mobads一样使用API​​(你甚至可以意识到这听起来有多么怪异吗?Mobs?真的吗?我们是开发者,俄罗斯黑手党吗?),与广告公司build立合作关系,直接从你的应用程序中embedded广告。 这将使您的整体应用程序安装较大,不,你不能防止手动修改,但上面提出的变化也没有防范。 这将更好地支持你的应用程序的任何付费版本,这将是更轻量级(和更快)。
  • 彻底审查您向用户展示的广告,对广告政策保持公开和透明,甚至允许用户检查您的广告和广告来源。 我一直关注广告的主要原因不是因为我讨厌广告,而是因为担心负责这个应用程序的低质量开发人员也在放入病毒或其他恶意软件。 询问安装的adblocker是否有例外。 与AdBlock之类的广告拦截器合作,以获得例外列表。 如果你是一个合法的应用程序,这应该不成问题。 ( http://www.cio.com/article/699970/6_Ways_to_Defend_Against_Drive_by_Downloads?page=1&taxonomyId=3089

我重申:以上所有更改都是您可以在代码中合法执行的操作以防止出现反广告行为。 出于安全原因和内部反应(主要是广告,有时甚至是带宽和性能),广告被阻止,因此请确保您的广告在代码级别不会引发任何这些问题。

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

没有什么可以做,你的用户不能做得更好。

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

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

首先,让我说,我认为,广告拦截,涉及到应用程序,实际上是一种盗版forms。 这些应用程序是由广告支持的,有时还有一个“付费许可”来closures广告和/或添加function。 通过屏蔽广告,用户正在窃取开发人员花费时间创build您正在使用的应用程序的潜在收入。

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

我使用包pipe理器来检查是否安装了特定的包。 虽然这不会得到所有的广告拦截器,但如果您在某些stream行的广告上保持“最新”,则可以获得大部分广告拦截器。

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

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

1)使用没有互联网的应用程序。

2)根植电话和修改的主机文件。

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

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(); } } 

为用户提供一种在没有广告的情况下使用该应用的方法。 我个人发现,广告是我计算机上可能发生的最烦人的事情之一,如果能够免除投放广告的侮辱,我会很乐意为此付费。 我相信我不是唯一的一个。

对于没有互联网连接的情况下,我已经按照这个教程 ,我已经build立了一个“networking状态监听器”像这样:

 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(); } 

registerReceiver和unregisterReceiver必须分别在onResume和onPause中调用,如此处所述。

在您的布局xml中设置AdView和您自己select的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" /> 

现在,每当互联网连接可用时,广告将显示,当它closuresImageView将popup,反之亦然。 必须在您希望广告展示的所有活动中完成此操作。

除了检查admob是否可以解决,我所做的是提供一个页面,基本上build议我已经发现了一个adblocker,声明我明白了可能的原因,然后显示一些我自己的应用程序的内置广告,并要求他们的类支持持续发展。 🙂

这是以前答案的延伸。 用户告诉我,他们使用的应用程序称为AdFree Android。 它可以在市场上find。 该应用程序表示,它的工作原理是“取消对已知主机名投放广告的请求”。

我build议,如果您使用广告通过任何应用程序获利,则会在启动时检查此程序,并为用户提供令人讨厌的消息,然后终止您的应用程序。