3

実行中のサービスから広告を表示したい。私のサービスは、テキストのクリップボードをチェックし、情報を含むポップアップ ウィンドウを表示します (辞書サービス)。しかし、アプリをデバッグすると、エラーが表示されます:

Could not initialize AdView: AdView was initialized with a Context that wasn't an Activity.

アクティビティのコンテキストがないと開始できないと言う人もいました。これで解決策はありますか?

以下のコードを更新します: ポップアップ ウィンドウを表示するコード:

    private void showCaptureWindow() {

    setTextToKeywordEdit(mClipboardText);

    makeDictContent(mClipboardText);

    if(!mDictContentView.hasFocus())
        mDictContentView.requestFocus();

    if(false == bHasAddedView)
    {
        int bgColor = MultiDictUtils.GetBgColor();
        int textColor = MultiDictUtils.GetTextColor();
        mParentViewLayout.setBackgroundColor(bgColor);
        mDictContentView.setBackgroundColor(bgColor);
        mLineView0.setBackgroundColor(textColor);
        mLineView1.setBackgroundColor(textColor);
        mLineView2.setBackgroundColor(textColor);
        mLineView3.setBackgroundColor(textColor);
        mLineView4.setBackgroundColor(textColor);           

        updateDisplaySize(true);

        mWindowParams.x = mWindow_Default_X;
        mWindowParams.y = mWindow_Default_Y;

        mWinStatus = 0;
        mWindowResizeBtn.setImageResource(R.drawable.ic_btn_max_win);
        // Look up the AdView as a resource and load a request.
        adView = (AdView)mCaptureWindowLayout.findViewById(R.id.adView);
        adView.loadAd(new AdRequest());
        mWindowManager.addView(mCaptureWindowLayout, mWindowParams);
        bHasAddedView = true;
    }
}

サービスを開始します。

    private void initService() {
    MyLog.v(TAG, "initService()");

    mClipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

    if(mClipboardManager.hasText())
    {
        mClipboardText = mClipboardManager.getText().toString();
    }

    LayoutInflater factory = LayoutInflater.from(this);
    mCaptureWindowLayout = (LinearLayout)factory.inflate(R.layout.capture_window, null);

    mWindowCloseBtn = (ImageButton)mCaptureWindowLayout.findViewById(R.id.windowCloseBtn);
    mWindowResizeBtn = (ImageButton)mCaptureWindowLayout.findViewById(R.id.windowResizeBtn);
    mWindowMoveBtn = (ImageButton)mCaptureWindowLayout.findViewById(R.id.windowMoveBtn);
    mWindowSchBtn = (ImageButton)mCaptureWindowLayout.findViewById(R.id.windowSchBtn);

    mKeywordEdit = (EditText)mCaptureWindowLayout.findViewById(R.id.keywordTxt);

    mParentViewLayout = (LinearLayout) mCaptureWindowLayout.findViewById(R.id.parentView);
    mLineView0 = (View) mCaptureWindowLayout.findViewById(R.id.lineView0);
    mLineView1 = (View) mCaptureWindowLayout.findViewById(R.id.lineView1);
    mLineView2 = (View) mCaptureWindowLayout.findViewById(R.id.lineView2);
    mLineView3 = (View) mCaptureWindowLayout.findViewById(R.id.lineView3);
    mLineView4 = (View) mCaptureWindowLayout.findViewById(R.id.lineView4);
    mDictContentView = (WebView)mCaptureWindowLayout.findViewById(R.id.dictContentWindow);
    mDictContentView.setWebViewClient(new DictWebViewClient(new ServiceWebViewClientCallback()));

    WebSettings webSettings = mDictContentView.getSettings();
    webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
    webSettings.setJavaScriptEnabled(true);
    webSettings.setSupportZoom(true);

作成時:

    @Override
public void onCreate() {

    mMultiDictUtils = new MultiDictUtils(this);

    mHandler = new Handler();

    mClipboardTask = new Runnable() {
        public void run() {

            clipboardCheck();

            mHandler.postDelayed(mClipboardTask, CLIPBOARD_TIMER);
        }
    };

    Runnable initServiceTask = new Runnable() {
        public void run() {

            initService();

            mHandler.postDelayed(mClipboardTask, CLIPBOARD_TIMER);
        }
    };

    mHandler.postDelayed(initServiceTask, 5000);

    super.onCreate();
}

ここに完全なコードを投稿できないため、申し訳ありません。サービス チェック クリップボードがあり、コンテンツをビュー レイアウトで表示します。

4

2 に答える 2

0

コードを編集できませんが、サービスから Admob 広告を表示できます。InterstitialAd のアプリケーションで使用しているコードは次のとおりです。

public class ServiceAd extends Service {

private InterstitialAd mInterstitialAd;


@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

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

    mInterstitialAd = new InterstitialAd(getApplicationContext());
    mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
    mInterstitialAd.loadAd(new AdRequest.Builder().build());

    mInterstitialAd.setAdListener(new AdListener() {
        @Override
        public void onAdClosed() {
            // Load the next interstitial.
            mInterstitialAd.loadAd(new AdRequest.Builder().build());
            Log.d("tag", "on closed ad");
        }

    });

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            if (mInterstitialAd.isLoaded()) {
                mInterstitialAd.show();
            } else {
                Log.d("tag", "The interstitial wasn't loaded yet.");
            }
        }
    }, 5000);   // 5 mins
    return START_STICKY;
}}

最初にハンドラーなしでコードを実行しましたが、広告が読み込まれなかったので、最初に広告を読み込む時間を与えました。

これが役立つことを願っています。

于 2017-05-21T04:56:03.633 に答える
0

ポップアップウィンドウに広告を表示できます(サービスから開始するアクティビティを意味すると思います)。発生しているエラーは、Activity ではない Context オブジェクトを使用して AdView を作成しているためです。ポップアップ ウィンドウであるアクティビティを渡します。

于 2013-01-14T13:32:35.820 に答える