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