Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. AppCompat Theme중 하나를 상속받는 theme을 styles.xml에 정의

    Code Block
    languagexml
    <style name="CustomTheme" parent="Theme.AppCompat.DayNight">
        <!-- add your custom attributes here -->
    </style>
    
  2. AndroidManifest.xml에 다음 line을 추가

    Code Block
    languagexml
    <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
languagejava
// 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
languagejava
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
languagexml
?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
languagejava
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
languagejava
BuzzAdBenefit.setLauncher(new MyLauncher());

[+] Custom launcher 사용시 Article의 sourceUrl 사용법

Code Block
languagejava
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
languagejava
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);
    }
}