답변:
에뮬레이터에서 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 Ads와 유사한 것 :
public AdRequest.Builder addTestDevice (문자열 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을 필터링하십시오.
해시 장치 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]));
. 선행 0이 출력되지 않기 때문에 구현에서 15 이하의 바이트 값에 대해 잘못된 출력을 제공합니다.
XML 레이아웃을 사용하여 광고를 표시하고 레이아웃 XML 파일에 이미 "ads : testDevices ="가있는 경우 AdMob은 LogCat 출력에 "To get test ads on this device ..."메시지를 인쇄하지 않습니다. 그것을 꺼내면 LogCat 메시지가 표시됩니다.
다음은 LogCat에서 장치 ID를 찾는 방법에 대한 멋진 자습서입니다. http://webhole.net/2011/12/02/android-sdk-tutorial-get-admob-test-device-id/
실제 기기에서 앱을 테스트하는 경우 기기 ID를 제공하는이 작은 Android 앱을 사용해 볼 수 있습니다.
https://play.google.com/store/apps/details?id=pe.go_com.admobdeviceidfinder&hl=ko
해시 된 장치 ID를 직접 얻을 수 있습니다. 도움이 되었기를 바랍니다.
테스트 광고를 표시하는 또 다른 가장 쉬운 방법은 배너에 테스트 기기 ID를 사용 하여 모든 기기에 대한 AdMob 테스트 광고를 표시하는 것 입니다. ' ca-app-pub-3940256099942544 / 6300978111 ' 이 AdMob 테스트 광고 ID는 google : link 의 AdMob 가이드에 언급되었습니다 . 이것은 위 링크의 인용문입니다.
장치 ID를 얻으려면 휴대폰을 USB에 연결하고 Android 스튜디오에서 logcat을 엽니 다. 아래 코드를 사용합니다 (장치에서 USB 디버깅이 활성화되어 있는지 확인). 그런 다음 Google 광고가있는 앱 (Play 스토어에서 임의의 앱 다운로드)을 엽니 다. 이미지에 표시된대로 Logcat 유형 "set"에서. 장치 ID는 이미지에서 다음과 같이 강조 표시됩니다.
setTestDeviceIds (Arrays.asList ( "CC9DW7W7R4H0NM3LT9OLOF7455F8800D")) .
표시된대로 코드에서 테스트 장치를 사용하십시오.
val adRequest = AdRequest
.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("CC9DW7W7R4H0NM3LT9OLOF7455F8800D")
.build()
테스트중인 장치가 몇 개 있는데 각 장치에 대한 DeviceID를 수동으로 가져오고 싶지 않았습니다. 프로그래밍 방식으로 DeviceID를 얻기위한 답변은 나를 위해 작동하지 않았습니다 (0 누락). 이로 인해 테스트 광고 대신 실제 광고가 표시되었습니다.
이를 내 Application 클래스 onCreate에 넣은 다음 getter 메서드를 사용하여 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);