마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

interstitialAd 전면광고 부착시 오류

0 추천

AlertDialog를 띄워 "예"를 클릭했을 경우 전면광고가 나타나도록 하려는 코드입니다

public class NotificationsFragment extends Fragment {


    private InterstitialAd minterstitialAd;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_notifications, container, false);
                                         ---생략---

        MobileAds.initialize(getContext(), new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(@NonNull InitializationStatus initializationStatus) {}
        });

        AdRequest adRequest = new AdRequest.Builder().build();
        InterstitialAd.load(getContext(), " ~ 임시 ID ~ ", adRequest, new InterstitialAdLoadCallback() {
            @Override
            public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                minterstitialAd = interstitialAd;
                minterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() {
                    @Override
                    public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                        minterstitialAd = null;
                    }
                    @Override
                    public void onAdShowedFullScreenContent() {
                    }
                    @Override
                    public void onAdDismissedFullScreenContent() {
                        minterstitialAd = null;
                    }
                });
            }
            @Override
            public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                minterstitialAd = null;
            }
        });

                        savebutton.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                                builder.setTitle("안내");
                                builder.setMessage("저장하시겠습니까?");
                                builder.setPositiveButton("", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        if(minterstitialAd != null){
                                            minterstitialAd.show(NotificationsFragment.this.getActivity());
                                        }else{
                                            Toast.makeText(getContext(),"광고띄우기 실패", Toast.LENGTH_SHORT).show();
                                        }
                                    }
                                });

 

이렇게 코드를 하면 AlertDialog에 "예" 버튼을 눌렀을 때 minterstitial이 null이라고 판단하고 Toast메세지로 "광고띄우기 실패"가 뜨게 됩니다.

왜 minterstitial이 null인지 알려주세요   (분명 minterstitial = interstitial이라고 해서 문제가 없어보이는데..)

 

 

그리고 

minterstitialAd.show(NotificationsFragment.this.getActivity());

이 show() 괄호 사이에 Activity를 집어넣으라고 하는데 현재 프래그먼트 이름이 NotificationsFragment이고 이러한 식으로 코드를 입력하긴 했는데 코드를 입력하는것도 맞는지 봐주세요

쿠롱 (400 포인트) 님이 2022년 2월 6일 질문

1개의 답변

0 추천

제가 광고 라이브러리는 사용해 보질 않아서 잘은 모르겠지만, 직잠이 가는 부분은 MobileAds를 초기화하는 시점에 문제가 있을 것으로 보입니다. MobileAds의 문서를 보면 

public static void initialize (Context context,OnInitializationCompleteListener listener)

Call this method as early as possible after the app launches to reduce latency on the session's first ad request.

초기화에 시간이 걸릴 수 있기 때문에, 가능한 최대한 일찍 초기화를 하라는 내용인데. MobileAds.initialize가 비동기적으로로 동작하는 걸로 보이고,  InterstitialAd.load를 호출하는 시점이 바로 다음이므로, 이상태에서는 초기화가 안 끝난 상태이므로 minterstitialAd가 아직 초기화가 되지 않은 것으로 보입니다. 로그를 찍어 보시거나 디버깅을 해보시면 금방 확인할 수 있을 것 같습니다.

해결책으로는  Application class를 하나 만드셔서 여기에서 초기화를 하시는 것이 좋을 것 같습니다. 보통 이런 종류의 라이브러리는 Application 클래스에서 초기화를 합니다.

Application 클래스를 상속받은 다음, onCreate 메소드 안에서 초기화 코드를 실행하세요.

public class MyApp extends Application {

   @Override
   public void onCreate() {
        super.onCreate()

        initializeAd();
    }

    private void initializeAd() {
         MobileAds.initialize(this);
    }
}

 

AndroidManifest.xml에 MyApp을 지정해 주세요.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.mpark.mssunshine">

    <uses-permission android:name="android.permission.INTERNET" />
    ...

    <application
        android:name=".MyApp"
     ...
        tools:ignore="AllowBackup,UnusedAttribute">
        <activity
             ...
        </activity>
    </application>

</manifest>

 

그리고 두번째 질문은 틀린 부분은 없지만, 아래처럼 하실 수도 있습니다.

minterstitialAd.show(requireActivity());

 

spark (224,800 포인트) 님이 2022년 2월 6일 답변
spark님이 2022년 2월 6일 수정
...