Android 谷歌广告MediaView在显示图像时未正确调整高度以包装内容

Android 谷歌广告MediaView在显示图像时未正确调整高度以包装内容,android,admob,google-dfp,native-ads,mediaview,Android,Admob,Google Dfp,Native Ads,Mediaview,我今天收到AdMob的一封电子邮件,上面说: 更改为本机广告策略:本机广告将要求MediaView 渲染视频或主图像资源。努力帮助你实现目标 从10月29日开始,本地广告更容易获得更好的广告体验 将需要MediaView渲染视频或主图像资源。公元 在此日期之前不符合要求的单位将停止提供广告,这可能导致 影响你的广告收入 我在我的Android应用程序中尝试了这一点,删除了使用ImageView对图像和使用MediaView对视频的单独处理,但我发现MediaView没有根据显示的图像的高度调整视

我今天收到AdMob的一封电子邮件,上面说:

更改为本机广告策略:本机广告将要求MediaView 渲染视频或主图像资源。努力帮助你实现目标 从10月29日开始,本地广告更容易获得更好的广告体验 将需要MediaView渲染视频或主图像资源。公元 在此日期之前不符合要求的单位将停止提供广告,这可能导致 影响你的广告收入

我在我的Android应用程序中尝试了这一点,删除了使用
ImageView
对图像和使用
MediaView
对视频的单独处理,但我发现MediaView没有根据显示的图像的高度调整视图的高度

在Google的codelab示例中,使用了
MediaView
的固定高度和宽度。我不能这样做,因为这个屏幕是对屏幕大小的响应,屏幕大小会根据设备的不同而变化。图像可以动态调整大小这一事实是使用
unifiednativeeads
而不是像横幅这样的预定义广告的主要好处之一

这就是我需要如何显示
MediaView
,使用
match\u parent
显示宽度,使用
wrap\u内容显示高度

<com.google.android.gms.ads.formats.MediaView
            android:id="@+id/ad_media"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:adjustViewBounds="true"
            android:scaleType="fitXY"/>

在前一种情况下,我们可以使用ImageView单独渲染图像,
wrap\u content
值可以正确调整图像的大小

有人对此有解决办法吗?如果不硬编码
MediaView
的高度,我如何遵循谷歌的新要求


我的完整代码可以在github上的演示应用程序中找到

我也面临着同样的问题,在反复尝试之后,我发现将
(在其中添加
UnifiedNativeReadView
)与
ScrollView
包装将解决这个问题。

for(int I=0;ImediaView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
    @Override
    public void onChildViewAdded(View parent, View child) {
        if (child instanceof ImageView) {
            ImageView imageView = (ImageView) child;
            imageView.setAdjustViewBounds(true);
        }
    }

    @Override
    public void onChildViewRemoved(View parent, View child) {}
});
for (int i = 0; i < mediaView.getChildCount(); i++) {
    View view = mediaView.getChildAt(i);
    if (view instanceof ImageView) {
        ((ImageView) view).setAdjustViewBounds(true);
    }
}
视图=mediaView.getChildAt(i); if(图像视图的视图实例){ ((图像视图)视图)。setAdjustViewBounds(true); } }

这对我来说很有效。我尝试了Richard的答案,但在RecyclerView中效果不佳。

如果实施高级原生广告,请按照官方文档中的建议使用MediaView的“imageScaleType”属性

adView.mediaView.setImageScaleType(ImageView.ScaleType.CENTER\u裁剪)


或根据要求的任何其他刻度类型。

以确保所有介质尽可能宽,并且它们尊重最大高度(因此根据介质的尺寸不会出现意外情况)

XML


你能补充一下你改变了什么/为什么/有什么不同吗?谢谢!这正是我所需要的。记住,不要担心它会添加视频。因为视频是WebView,并且它符合布局,没有问题。@Richard或任何其他已知信息(只有广告标题、URL、CTA和图像资产可以单击(没有可单击的“空白”),所以白色区域不应该是可单击的。如果我们确实匹配了父项,并且广告是纵向的,那么它会留下一些可点击的空白。这方面的任何解决办法或它不是违反政策?@Sarah或任何其他人根据support.google.com/admob/answer/6329638(只有广告标题、URL、CTA和图像资产可以点击(没有可点击的“空白”)知道,白色区域不应该被点击。如果我们确实匹配了父项,并且广告是纵向的,那么它会留下一些可点击的空白。这方面有什么解决办法吗?或者这不是违反政策?
<com.google.android.gms.ads.formats.MediaView
     android:id="@+id/ad_media"
     android:layout_gravity="center_horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" />
mediaView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
        @Override
        public void onChildViewAdded(View parent, View child) {
            float scale = context.getResources().getDisplayMetrics().density;
            
            int maxHeightPixels = 175;
            int maxHeightDp = (int) (maxHeightPixels * scale + 0.5f);

            if (child instanceof ImageView) { //Images
                ImageView imageView = (ImageView) child;
                imageView.setAdjustViewBounds(true);
                imageView.setMaxHeight(maxHeightDp);

            } else { //Videos
                ViewGroup.LayoutParams params = child.getLayoutParams();
                params.height = maxHeightDp;
                child.setLayoutParams(params);
            }
        }

        @Override
        public void onChildViewRemoved(View parent, View child) {}
    });