...
AppCompat Theme중 하나를 상속받는 theme을 styles.xml에 정의
Code Block language xml <style name="CustomTheme" parent="Theme.AppCompat.DayNight"> <!-- add your custom attributes here --> </style>
AndroidManifest.xml에 다음 line을 추가
Code Block language xml <activity android:name="com.buzzvil.buzzad.browser.BuzzAdBrowserActivity" android:theme="@style/CustomTheme" tools:replace="android:theme"/>
광고 할당
BuzzAdBenefit SDK는 광고를 받아오고 보여주는 역할을 합니다. 이때 유저 정보가 없다면 광고 할당을 받을 수 없기 때문에 반드시 유저 정보를 SDK에 등록하는 과정이 필요합니다. 그 과정은 여기에서 진행하실 수 있습니다.
setUserProfile
를 통해 유저 정보를 SDK에 등록하면 내부적으로 세션키를 발급 하는데 이는 광고 할당에 꼭 필요한 값입니다. 만약 setUserProfile
이후 짧은 시간 안에 광고 할당 요청을 하면 세션키 발급이 완료되지 않아 요청이 실패할 수 있습니다. 이런 경우에 다음과 같이 세션이 발급이 완료되었는지 확인할 수 있는 receiver를 등록하여 확인 후 광고 할당 요청을 보낼 수 있습니다.
Code Block | ||
---|---|---|
| ||
// 1. create a BroadcastReceiver private BroadcastReceiver sessionReadyReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Session is ready } }; // 2. register the receiver to LocalBroadcastManager private void registerSessionReadyReceiver() { LocalBroadcastManager.getInstance(context).registerReceiver(sessionReadyReceiver, BuzzAdBenefit.getSessionReadyIntentFilter()); } // 3. unregister the receiver when you're done private void unregisterSessionReadyReceiver() { LocalBroadcastManager.getInstance(context).unregisterReceiver(sessionReadyReceiver); } |
...
[1] CustomBrowserActivity
를 구현합니다.
Code Block | ||
---|---|---|
| ||
public class CustomBrowserActivity extends AppCompatActivity { public static final String KEY_URL = "com.sample.KEY_URL"; private BuzzAdWebView webView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_browser); // URL을 KEY로 하여 WebView를 가지고있는 Fragment를 받아와 사용합니다. Intent intent = getIntent(); BuzzAdBrowserFragment fragment = BuzzAdBrowser.getInstance(this).getFragment(intent.getStringExtra(KEY_URL)); getSupportFragmentManager().beginTransaction().replace(R.id.browserContainer, fragment).commit(); this.webView = fragment.getWebView(); // Browser의 이벤트를 받을 수 있습니다. DeepLink가 열렸을 경우, Browser를 닫아주어야 빈 페이지가 보여지는 현상을 방지할 수 있습니다. BuzzAdBrowser.getInstance(this).setOnBrowserEventListener(new BuzzAdBrowser.OnBrowserEventListener() { // 기존에 사용하던 isDeepLink 를 아래로 대체 @Override public void onDeepLinkOpened() { finish(); } }); } // Optional - BackButton을 눌렀을때 뒤로가기 기능 @Override public void onBackPressed() { if (webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } } |
[2] activity_custom_browser.xml
Code Block | ||
---|---|---|
| ||
?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/browserContainer" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> |
[3] Launcher
를 구현
Code Block | ||
---|---|---|
| ||
public class MyLauncher implements Launcher { @Override public void launch(@NonNull Context context, @NonNull LaunchInfo launchInfo) { launch(context, launchInfo, null); } @Override public void launch(@NonNull final Context context, @NonNull final LaunchInfo launchInfo, @Nullable final LauncherEventListener listener) { launch(context, launchInfo, listener, null); } @Override public void launch(@NonNull final Context context, @NonNull final LaunchInfo launchInfo, @Nullable final LauncherEventListener listener, @Nullable List<Class<? extends BuzzAdJavascriptInterface>> javascriptInterfaces) { // Custom Browser 실행 final Intent intent = new Intent(context, CustomBrowserActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putString(CustomBrowserActivity.KEY_URL, launchInfo.getUri().toString()); // URI는 변경 하면 안 됨 context.startActivity(intent); } } |
[4] BuzzAdBenefit.init
호출 이후에 생성한 Launcher
를 세팅
Code Block | ||
---|---|---|
| ||
BuzzAdBenefit.setLauncher(new MyLauncher()); |
[+] Custom launcher 사용시 Article의 sourceUrl 사용법
Code Block | ||
---|---|---|
| ||
public class MyLauncher implements Launcher {
@Override
public void launch(@NonNull final Context context, @NonNull final LaunchInfo launchInfo, @Nullable final LauncherEventListener listener, @Nullable List<Class<? extends BuzzAdJavascriptInterface>> javascriptInterfaces) {
if (launchInfo.getArticle() != null) {
String sourceUrl = launchInfo.getArticle().getSourceUrl();
}
}
}
|
컨텐츠의 경우 url scheme에 따라 랜딩 방식을 다르게 처리하고 싶다면 (ex. 앱 안에서 브라우저 오픈 없이 다른 화면으로 이동되는 컨텐츠) 다음과 같은 방법으로 NativeArticle
객체의 sourceUrl
을 가져와 분기 처리를 할 수 있습니다.
[+] Custom launcher 사용시 광고 또는 컨텐츠인지 미리 판단하고 싶을 경우
Code Block | ||
---|---|---|
| ||
public class MyLauncher implements Launcher { ... @Override public void launch(@NonNull final Context context, @NonNull final LaunchInfo launchInfo, @Nullable final LauncherEventListener listener, @Nullable List<Class<? extends BuzzAdJavascriptInterface>> javascriptInterfaces) { // 광고 또는 컨텐츠인지 미리 판단하고 싶을 경우, 다음을 이용하여 확인 if (launchInfo.getAd() != null) { // 광고 } else if (launchInfo.getArticle() != null) { // 컨텐츠 } ...// Custom Browser 실행 } } |
...
앱에서 버즈빌의 UI만 다크테마가 적용되는 경우의 대처방법
BuzzAd SDK의 UI는 다크테마를 지원하고 있습니다.
앱에서 다크테마를 지원하지 않는 경우, 버즈빌에서 제공하는 UI만 다크테마가 적용되어 부자연스럽게 보일 수 있습니다.
이런 경우, 아래의 코드를 추가하여 앱에 다크모드가 적용되지 않게 막을 수 있습니다.
Code Block |
---|
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 아래 코드 추가
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
} |