java - 在后台服务的系统叠加层中显示横幅/原生广告
问题描述
我一直在开发一个android应用程序,它几乎完成了。基本上我在其中使用系统覆盖,我想在覆盖本身中显示广告。我的应用程序通过警报管理器向服务发送警报,服务显示系统覆盖,我想在覆盖中显示广告。我能够成功地显示系统覆盖,但问题是我想在系统覆盖中显示广告(任何横幅或原生),就像 Truecaller 在来电时所做的那样。我想完全实现这一点,如图所示。. 我到目前为止所尝试的是 -
private void SetParametersToDisplayShort() {
if(allowAlerts)
{
if(allowAlertsShort)
{
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams params;
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
{
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
}
else
{
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
}
params.gravity = Gravity.CENTER;
params.x = 0;
params.y = 0;
ShortAlertView = (RelativeLayout) View.inflate(getApplicationContext(), R.layout.activity_alert_dialog, null);
MobileAds.initialize(getApplicationContext(), initializationStatus ->
{
CardView template = ShortAlertView.findViewById(R.id.ad_container);
refreshAd(template);
template.setVisibility(View.VISIBLE);
});
windowManager.addView(ShortAlertView, params);
TextView time = ShortAlertView.findViewById(R.id.text_time);
SharedPreferences sharedPreferences = getSharedPreferences("Main", MODE_MULTI_PROCESS);
long Time = sharedPreferences.getLong("ShortAlertTimeCountDown", 20000);
long RemainingTime = Time - System.currentTimeMillis();
countDownTimer = new CountDownTimer(RemainingTime, 1000) {
@Override
public void onTick(long l) {
int secondsShort = (int) (l / 1000) % 60;
int minutesShort = (int) ((l / (1000 * 60)) % 60);
String timeLeft = minutesShort + ":" + secondsShort;
time.setText(timeLeft);
}
@Override
public void onFinish() {
try {
if(AllowNotificationVibrate)
{
Vibrate();
}
windowManager.removeView(ShortAlertView);
}
catch (Exception ignored)
{
}
if(isDeviceNotLocked())
{
startMainAlarm();
}
if(AllowNotificationVibrate)
{
Vibrate();
}
if(AllowNotificationSound)
{
StartMediaPlayerClose();
}
stopSelf();
}
};
countDownTimer.start();
}
else
{
startNotificationShort();
if(isDeviceNotLocked())
{
startMainAlarm();
}
stopSelf();
}
}
}
private void refreshAd(CardView cardView)
{
AdLoader.Builder builder = new AdLoader.Builder(this, getString(R.string.ad_native_id));
builder.forNativeAd(unifiedNativeAd -> {
if(nativeAd != null)
{
nativeAd = unifiedNativeAd;
}
NativeAdView adView = (NativeAdView) View.inflate(getApplicationContext(), R.layout.native_ad_layout_small, null);((LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.native_ad_layout, null);
populateNativeAd(unifiedNativeAd, adView);
cardView.removeAllViews();
cardView.addView(adView);
});
AdLoader adLoader = builder.withAdListener(new AdListener() {
@Override
public void onAdClosed() {
super.onAdClosed();
}
@Override
public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
super.onAdFailedToLoad(loadAdError);
}
@Override
public void onAdOpened() {
super.onAdOpened();
}
@Override
public void onAdLoaded() {
super.onAdLoaded();
}
@Override
public void onAdClicked() {
super.onAdClicked();
}
@Override
public void onAdImpression() {
super.onAdImpression();
}
}).build();
AdRequest adRequest = new AdRequest.Builder().build();
adLoader.loadAd(adRequest);
}
private void populateNativeAd(NativeAd nativeAd, NativeAdView adView)
{
adView.setHeadlineView(adView.findViewById(R.id.ad_headline));
adView.setAdvertiserView(adView.findViewById(R.id.ad_advertiser));
adView.setBodyView(adView.findViewById(R.id.ad_body_text));
adView.setMediaView(adView.findViewById(R.id.media_view));
adView.setCallToActionView(adView.findViewById(R.id.add_call_to_action));
adView.setIconView(adView.findViewById(R.id.adv_icon));
adView.getMediaView().setMediaContent(nativeAd.getMediaContent());
((TextView)adView.getHeadlineView()).setText(nativeAd.getHeadline());
if(nativeAd.getBody() == null)
{
adView.getBodyView().setVisibility(View.INVISIBLE);
}
else
{
((TextView)adView.getBodyView()).setText(nativeAd.getBody());
adView.getBodyView().setVisibility(View.VISIBLE);
}
if(nativeAd.getAdvertiser() == null)
{
adView.getAdvertiserView().setVisibility(View.INVISIBLE);
}
else
{
((TextView)adView.getAdvertiserView()).setText(nativeAd.getAdvertiser());
adView.getAdvertiserView().setVisibility(View.VISIBLE);
}
try {
adView.setStarRatingView(adView.findViewById(R.id.star_rating));
if(nativeAd.getStarRating() == null)
{
adView.getStarRatingView().setVisibility(View.INVISIBLE);
}
else
{
((RatingBar)adView.getStarRatingView()).setRating(nativeAd.getStarRating().floatValue());
adView.getStarRatingView().setVisibility(View.VISIBLE);
}
}
catch (Exception e)
{
Log.e("TAG", e.toString());
}
if(nativeAd.getIcon() == null)
{
adView.getIconView().setVisibility(View.INVISIBLE);
}
else
{
((ImageView)adView.getIconView()).setImageDrawable(nativeAd.getIcon().getDrawable());
adView.getIconView().setVisibility(View.VISIBLE);
}
if(nativeAd.getCallToAction() == null)
{
adView.getCallToActionView().setVisibility(View.INVISIBLE);
}
else
{
((Button)adView.getCallToActionView()).setText(nativeAd.getCallToAction());
adView.getCallToActionView().setVisibility(View.VISIBLE);
}
adView.setNativeAd(nativeAd);
}
我可以使用这种方法成功地将广告加载到活动中,但我不知道服务中的问题是什么。我也尝试在 onCreate 方法中初始化移动广告,但它甚至没有工作。另外我想提一下,在展示此广告时,我的应用程序正在后台运行,并使用除此服务之外的前台服务,而且此服务也是前台服务。任何帮助都会得到帮助。
解决方案
推荐阅读
- python - 如何解决不正确的字母比较错误
- javascript - 在现有项目中设置 Flow CLI Emulator,但每次运行时都会出现此服务器错误;flow emulator'/'flow project start-emulator'
- sql-server - 无法将 Glassfish 5.1.0 上的 Java 8 (291) Web 应用程序连接到 SQL Server 2014 实例
- javascript - 如何使用javascript删除自定义属性元素?
- python - 使用pypy时导入mnist模块出错
- reactjs - 2d 对象,其键与同一对象中值的键相同
- javascript - 使用计时器自动提交答案 (Javascript)
- java - 在 Trie 中设置 isLeaf 标志失败
- python - 如何使用 Numpy 通过来自另一个 DataFrame 的因子来缩放 DataFrame 中的列
- spring-webflux - 如何使用 sum 操作将 Mono 的 Stream 转换为 Flux 或将 Mono 的流减少为 Mono