回答:
エミュレータでAdMob広告を実行している場合、IDはありません。AdManagerメソッドを使用して、logcatが言うようにTEST_EMULATORに設定するだけです。USBデバッグを使用して実際のデバイスで実行し、logcatを監視すると、IDがそこに表示されます。
承認された回答は、エミュレータまたは少数のデバイスでのみテストしている場合に機能しますが、多数のデバイスでテストしている場合は、実行中のデバイスのデバイスIDをプログラムで追加する手段が必要になる場合があります。
次のコードは、現在実行中のデバイスをプログラムによってadviewテストデバイスにします
...
if(YourApplication.debugEnabled(this)) //debug flag from somewhere that you set
{
String android_id = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
String deviceId = md5(android_id).toUpperCase();
mAdRequest.addTestDevice(deviceId);
boolean isTestDevice = mAdRequest.isTestDevice(this);
Log.v(TAG, "is Admob Test Device ? "+deviceId+" "+isTestDevice); //to confirm it worked
}
Android IDのmd5を使用する必要があり、大文字である必要があります。これが私が使ったmd5コードです
public static final String md5(final String s) {
try {
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest
.getInstance("MD5");
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++) {
String h = Integer.toHexString(0xFF & messageDigest[i]);
while (h.length() < 2)
h = "0" + h;
hexString.append(h);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
Logger.logStackTrace(TAG,e);
}
return "";
}
編集:どうやら、MD5メソッドは完璧ではないようです。https: //stackoverflow.com/a/21333739/2662474この機能はもう必要ないので、テストしていません。幸運を!
com.google.android.gms.internal.cm.l(Context ctx)
、問題のIDを返す内部難読化メソッド(バージョン4.0.30)である呼び出しよりも優れています
import hashlib; hashlib.md5(android_id.lower()).hexdigest().upper()
です。これにより、アプリをダウンロードしてAndroid IDを表示し、そのMD5を取得できます。
ドキュメントから、Google広告に似たもの:
public AdRequest.Builder addTestDevice(String deviceId)
デバイスにテスト広告を受信させます。deviceIdは 、新しい広告を作成した後にlogcat出力を表示することで取得できます。エミュレーターの場合は、DEVICE_ID_EMULATORを使用します。
たとえば、LogCatに表示されるテストデバイスIDは"B86BC9402A69B031A516BC57F7D3063F"
次のとおりです。
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("B86BC9402A69B031A516BC57F7D3063F")
.build();
アプリがPlayストアにあり、ライブ広告を表示している場合(ライブ広告をテストに使用できない場合)、デバイスIDをコードに追加して、実際のデバイスのAdmobからテスト広告を取得します。開発中やテスト中はライブ広告を使用しないでください。
logcatで実際のデバイスIDを取得するには、
Admobからライブ広告を表示するデバイスで任意のアプリを開きます。接続されたデバイスで、Playストアからアプリをダウンロードした場合(ライブ広告を表示)、そのアプリを開くか、ライブAdmob広告を表示する他のアプリを開きます。デバイスはインターネットに接続している必要があります。
以下に示すように、「デバイス」でlogcatをフィルタリングして、テストデバイスを取得します。
デバイスでのAdmob広告テストの読み取り-デバイスIDはさらに変化する可能性があります
ハッシュデバイスIDを取得するには
oncreate内
String android_id = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
String deviceId = md5(android_id).toUpperCase();
Log.i("device id=",deviceId);
次に、このクラスをmd5()に追加します
public String md5(String s) {
try {
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i=0; i<messageDigest.length; i++)
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
hexString.append(String.format("%02X", 0xFF & messageDigest[i]));
ようになります。先頭のゼロが出力されないため、実装ではバイト値が15以下の場合に誤った出力が生成されます。
実際のデバイスでアプリをテストしている場合は、デバイスIDを提供するこの小さなAndroidアプリを試すことができます。
https://play.google.com/store/apps/details?id=pe.go_com.admobdeviceidfinder&hl=en
ハッシュされたデバイスIDを直接取得します。お役に立てれば。
テスト広告を表示するもう1つの最も簡単な方法は、バナーにテストデバイスIDを使用して、すべてのデバイスに AdMobテスト広告を表示することです。「ca-app-pub-3940256099942544 / 6300978111」。このAdMobテスト広告IDは、google:linkの AdMobチュートリアルに記載されています。これは上記のリンクからの引用です:
デバイスIDを取得するには、スマートフォンをUSBに接続し、android studioでlogcatを開きます。以下のコードを使用します(デバイスでUSBデバッグが有効になっていることを確認してください)。次に、Google広告が含まれている任意のアプリを開きます(Playストアから任意のアプリをダウンロードします)。画像に示すように、Logcatに「set」と入力します。デバイスIDは画像で強調表示されています
setTestDeviceIds(Arrays.asList( "CC9DW7W7R4H0NM3LT9OLOF7455F8800D"))。
次のように、コードでテストデバイスを使用します。
val adRequest = AdRequest
.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("CC9DW7W7R4H0NM3LT9OLOF7455F8800D")
.build()
テスト中のデバイスがいくつかあり、それぞれのデバイスIDを手動で取得したくありません。プログラムでDeviceIDを取得するためのここでの回答が機能しなかったため(ゼロが欠落)、テスト広告の代わりに実際の広告が表示されました。
これをApplicationクラスのonCreateに配置してから、ゲッターメソッドを使用してdeviceIdを公開し、全体にアクセスできるようにしました。
@Override
public void onCreate() {
super.onCreate();
String androidId = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
deviceId = MD5(androidId).toUpperCase();
}
public static String getDeviceId() {
return deviceId;
}
private static String deviceId;
そしてMD5メソッド。
public String MD5(String md5) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(md5.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
}
return null;
}
次に、これを使用して、AdRequestオブジェクトを作成します。
if(BuildConfig.DEBUG) {
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice(Application.getDeviceId())
.build();
adView.loadAd(adRequest);
} else {
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.build();
adView.loadAd(adRequest);
}
このように機能します:
InterstitialAd mInterstitial = new InterstitialAd(this);
mInterstitial.setAdUnitId("your id");
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("some words")
.build();
mInterstitial.loadAd(adRequest);
アプリを実行したら... Logcatに移動し、Verboseを入力して検索フィールドにAdRequestを入力すると、idデバイスにdonwが表示されます。
.addTestDevice( "ここにIDを入力");
お役に立てば幸いです。
このクラスをプロジェクトに追加します
import android.content.Context;
import android.provider.Settings;
import android.text.TextUtils;
import com.google.android.gms.ads.AdRequest;
import java.io.UnsupportedEncodingException;
public class AdsHelper {
public static AdRequest createRequest(Context context) {
AdRequest.Builder adRequest = new AdRequest.Builder();
adRequest.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);
if (BuildConfig.DEBUG) {
String deviceId = MD5(getDeviceId(context));
if (!TextUtils.isEmpty(deviceId)) {
adRequest.addTestDevice(deviceId.toUpperCase());
}
}
return adRequest.build();
}
private static String MD5(String md5) {
if (TextUtils.isEmpty(md5)) return null;
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(md5.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte anArray : array) {
sb.append(Integer.toHexString((anArray & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException ignored) {
} catch(UnsupportedEncodingException ignored){
}
return null;
}
private static String getDeviceId(Context context) {
try {
return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
} catch (Exception e) {
return "";
}
}
}
使用法:
AdRequest adRequest = AdsHelper.createRequest(this);
アプリ: build.gradle
dependencies {
...
compile 'com.google.firebase:firebase-ads:10.0.1'
...
}
あなたの活動:
AdRequest.Builder builder = new AdRequest.Builder();
if(BuildConfig.DEBUG){
String android_id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
String deviceId = io.fabric.sdk.android.services.common.CommonUtils.md5(android_id).toUpperCase();
builder.addTestDevice(deviceId);
}
AdRequest adRequest = builder.build();
adView.loadAd(adRequest);