私のユーザーの 1 人が猫を袋から出して、広告で収益化されている私の無料アプリの 1 つを使用しているが、広告ブロッカーで広告をブロックしていると言いました。彼らは私がそれについて何もできないかのように、あざけるように私に言った。
それについて何かできることはありますか?広告がブロックされていることを検出する方法はありますか?
広告ブロックが (実際にはどのコンピューターでも) 機能する 1 つの方法を認識しています。ホスト ファイルを編集して、既知のすべての広告サーバーの 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 ベースの OS で同じように動作するファイルが他にあるかどうかはわかりませんが、いずれにせよ、それらのファイルすべてをいつでも確認できます。
これを改善するための提案は大歓迎です。
また、「Ad Free android」と呼ばれるアプリには 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
それが役立つことを願っています。
開発者として、私たちはユーザーに共感するという困難な仕事をし、利用しようとする少数の者を罰することと、ルールに従って行動する多くの者を罰することの中間点を見つける必要があります。モバイル広告は、誰かが機能的なソフトウェアを無料で使用できるようにする合理的な方法です。広告ブロック技術を採用しているユーザーは収益の損失と見なされる可能性がありますが、全体像を見ると、アプリケーションが気に入った場合にそのことを広めているユーザーである可能性もあります。広告がブロックされているシステムで実行するためのより穏やかな方法は、独自の「ハウス」広告を表示することです。1 つまたは複数のバナー画像を作成し、 ImageViewを使用して通常の広告と同じ場所に表示します同じ高さ (例: 50 dp)。広告を正常に受信した場合は、ImageView の可視性を View.GONE に設定します。ユーザーの注意を引くために、いくつかの自社広告を循環するタイマーを作成することもできます。広告をクリックすると、ユーザーはマーケット ページに移動してフル バージョンを購入できます。
広告がアプリに読み込まれたかどうかを確認できますか?
広告ブロッカーは、アプリがデータをダウンロードできないようにすることで機能します。広告フレーム内のデータのコンテンツの長さをチェックして、そこにデータがあることを確認できます。
データがない場合は、メッセージをスローして終了するか、電子メールで警告します。
広告をブロックする人はごくわずかなので、思ったほど大きな問題ではないかもしれません。
上位2つの回答は、広告をブロックする特定の(おそらく最も人気のある)方法のみに役立ちます。ルートユーザーは、デバイスのファイアウォールで広告をブロックすることもできます。WiFiユーザーは、アップストリームファイアウォールで広告をブロックできます。
私は提案します:
広告をブロックしているユーザーに報酬を与えないでください。広告を読み込めない場合でも、レイアウトが広告の表示の一部を予約していることを確認してください。または、フルスクリーン広告が少し再生される場合は、広告を再生できない場合でも、アプリが少し待機するようにしてください。通知を広告として使用する場合(あなたはスカム)、そのような広告を取得できない場合はユーザーに通知してください。これは「すべてのユーザーを困らせる」と読むことができますが、通常のユーザーは自分が何を得ているかを知っており、広告をブロックする「ユーザー」は必要ありません。
広告ブロッカーに停止を依頼します。ユーザーが望むものを供給する業界の収益性が低いほど、その業界はユーザーが望むものを供給することが少なくなります。個々の開発者は、彼が他のユーザーにサービスを提供することでより多くのお金を稼ぐことに気付くでしょう。あなたはこれを知っています、そしてあなたが彼らに言った後あなたのユーザーはそれが明白であると思うでしょう、しかしそれはまだ経済的な議論です-それは直感的ではありません。「これは私の仕事です。あなたが私にお金を払わなければ、私は別のアプリを手に入れます、そしてあなたは私からこのようなアプリをこれ以上手に入れることはできません」のようなバックアップ広告を持っています。
インストールまたは変更された個々のソフトウェアのホスト ファイルをチェックするのではなく、私のアプローチはこのようなAdListener を使用しており、 NETWORK_ERRORが原因で広告の読み込みに失敗した場合は、ランダムな常時オンライン ページ (念のため、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();
}
});
ユーザーがより良くできることで、あなたにできることはありません。
リモートで効果的であると頭に浮かぶ唯一のことは、広告をプログラムの切り離せない部分にすることです。これにより、広告がブロックされた場合、ユーザーはアプリケーションを理解/操作できなくなります.
ユーザーが広告をバイパスするには、次の 2 つの方法があります。
1) インターネットをオンにせずにアプリを使用します。
2) ルート化された電話と変更されたホスト ファイルを使用。
実装できる 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();
}
}
広告のコンテンツプロバイダーによると思います。AdMob SDK は、広告リクエストが失敗したときにコールバックを提供することを知っています。これに登録して、コールバックで接続を確認できる可能性があると思います-接続があり、広告を受信しなかった場合-注意してください。それが1回または2回以上発生する場合は、おそらくあなたの可能性があります広告がブロックされています。Google のモバイル向け AdSense ツールセットを使用したことはありませんが、同様のコールバック メカニズムがあったとしても驚かないでしょう。
広告なしでアプリを使用する方法をユーザーに提供します。個人的には、広告は自分のコンピューターで発生する可能性がある最も迷惑なものの 1 つだと思っています。広告が顔に表示されるという侮辱を免れることができるのであれば、喜んでアプリケーションの料金を支払います。そして、私は私だけではないと確信しています。
この回答は、開発者の特定のセグメントに完全に人気があるわけではないと確信していますが、このカテゴリに該当する場合、アプリがアプリ ストアに存在するに値しない可能性があることを考慮してください。これらはすべてコードの変更として実装可能であり、ハッカーやスパイウェアのような動作は必要ありません。
基本的に、アプリの経済性を変更します。ユーザーは常に正しい- これは、これまでで最も成功した広告会社の 1 つ (Google) の姿勢です。あなたの広告がユーザーによってブロックされている場合、それはあなたが悪いからであり、広告や広告ブロッカーが悪いからではありません.
http://books.google.com/books/about/The_User_is_Always_Right.html?id=gLjPMUjVvs0C
繰り返しますが、上記の変更はすべて、アンチ広告の動作を防ぐためにコードで合法的に実行できるものです。広告は、主にセキュリティ上の理由と内臓反応のためにブロックされ、場合によっては帯域幅とパフォーマンスが原因でブロックされるため、広告がコード レベルでこれらの問題を引き起こさないようにしてください。
最後に、ボレリッドが言ったことに触れたいと思いました。これは上で繰り返しました。最終的には「いたちごっこ」ゲームです。ユーザーは自分の所有物に対して、法的にも道徳的にも最終的な権限と責任を持っているからです。ユーザーは、その場でコードを直接変更するなど、何でもできます。もちろん、実装できる制限などもありますが、問題を回避する方法は常にあります。これは、DRM の (技術的に) 究極の問題です (これは、あなたがやろうとしていることです)。このゲームで時間と労力を無駄にするよりも、ユーザーに広告を表示するよう促したほうがよいでしょう。無料で最高の、最もスマートなアンチ広告ブロッカーになります。
これは以前の回答の拡張です。ユーザーから、使用しているアプリは AdFree Android と呼ばれているとの連絡がありました。市場で見つけることができます。このアプリは、「広告を提供する既知のホスト名へのリクエストを無効にする」ことで機能すると述べています。
アプリを広告で収益化する場合は、起動時にこのプログラムを確認し、ユーザーに不快なメッセージを表示してから、アプリを終了することをお勧めします。
インターネット接続がない場合は、この チュートリアルに従い 、「ネットワーク状態リスナー」を次のように作成しました。
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 と任意の 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 がポップアップ表示され、その逆も同様です。これは、広告を表示するすべてのアクティビティで行う必要があります。
最初に、アプリケーションに関して言えば、広告ブロックは実際には著作権侵害の一種であると私は信じています。これらのアプリは広告によってサポートされており、広告をオフにしたり機能を追加したりするための「有料ライセンス」がある場合もあります。広告をブロックすることで、ユーザーは、あなたが使用しているアプリを作成するのに時間をかけた開発者から潜在的な収益を盗んでいます.
とにかく、広告ブロッカーの使用を防ぐ方法を追加したいと思います。私はこの方法を使用しており、広告ブロッカーを検出した場合、ユーザーにアプリの使用を許可しません. 人々は非常に怒って、あなたに悪い評価を与えるでしょう。ただし、アプリケーションの説明では、広告ブロッカーを使用している場合はアプリを使用できないことも非常に明確に述べています.
パッケージマネージャーを使用して、特定のパッケージがインストールされているかどうかを確認します。これですべての広告ブロッカーを取得できるわけではありませんが、人気のある広告ブロッカーのいくつかを「最新」に保つと、それらのほとんどを取得できます。
PackageManager pm = activity.getPackageManager ();
Intent intent = pm.getLaunchIntentForPackage ( "de.ub0r.android.adBlock" );
if ( Reflection.isPackageInstalled ( activity, intent ) ) {
// they have adblock installed
}