Android - 从服务中获取通知栏高度

3
我正在开发的应用是一个在Android后台运行的服务。问题在于,我需要确定通知栏的高度以实现部分服务功能。
我找到了一些解决方案,对于常规活动——一个活动中的视图可以通过检查其onSizeChanged事件时的实际视图大小来确定自己没有通知栏的高度,因为它已经被绘制。然而,这并不适用于没有物理视图的服务。
我真的很希望能够得到获取系统级别通知栏大小的任何想法?
非常感谢!
Vitaliy
3个回答

1
也许你可以检索标准通知栏图标并测量它。
你需要使用系统图标,这样你就有更多机会存在于所有Android自定义(Sense UI、MotoBlur等)中。
类似以下的东西:
Drawable phoneCallIcon = getResources().getDrawable(android.R.drawable.stat_sys_phone_call);

int height = phoneCallIcon.getIntrinsicHeight();

在我的 Nexus One 上运行此代码,高度为 38 像素,非常准确。


更安全的方法是通过遍历一些标准通知图标来实现这个“hack”。

具体步骤如下:

int notificationBarResources[] = {
            android.R.drawable.stat_sys_phone_call,
            android.R.drawable.stat_notify_call_mute,
            android.R.drawable.stat_notify_sdcard,
            android.R.drawable.stat_notify_sync,
            android.R.drawable.stat_notify_missed_call,
            android.R.drawable.stat_sys_headset,
            android.R.drawable.stat_sys_warning };
int notificationBarHeight = -1;
    for (int i = 0; i < notificationBarResources.length; i++) {
        try {
            Drawable phoneCallIcon = getResources().getDrawable(
                    android.R.drawable.stat_sys_phone_call);
            if ((notificationBarHeight = phoneCallIcon.getIntrinsicHeight()) != -1) {
                break;
            }
        } catch (Resources.NotFoundException e) {
            // Nothing to do
        }
    }

感谢,xamar!这是一个非常有趣的解决方法! 在任何版本中都保证有这个特定的图标可用吗?我仍然在想是否有一般的方法来获取有关通知栏的信息? 这似乎是一件基本的事情。非常感谢你的帮助! Vitaliy - Vitaliy
我看到他们的资源ID被导出(=公共可访问),因此这不太可能改变。无论如何,我会创建一个包含5-8个通知栏图标的数组,并在“Resources.NotFoundException”出现时对它们进行迭代。这样做可以最大程度地减少失败的可能性。 - xamar

1

在活动中告诉您的服务使用适当的尺寸。状态栏高度和屏幕尺寸在您的服务运行期间不太可能发生变化。


谢谢你的回复, 但我没有具体的活动可以用来做这件事, 而且为此专门创建一个似乎是不对的。 我相信应该有一些系统级API可以确定通知栏的高度?为了让事情更清晰 - 我并不关心用户“展开”通知栏,我只想知道它的默认大小 - 即当通知栏折叠时的大小。 - Vitaliy
@Vitaly: 没有活动的应用程序往往不受欢迎。另外,请不要假定所有Android设备都具有相同的屏幕配置。例如,有些设备可能没有顶部状态栏。 - CommonsWare
谢谢,CommonsWave。只要我能够获取通知栏的实际大小,应用程序将可以使用这样的配置。 - Vitaliy

0

我有同样的问题。我的视图在视图构造函数中布局图像。你唯一知道实际视图高度的时间是通过onMesure方法:

   protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    widthView = MeasureSpec.getSize(widthMeasureSpec);
    heightView = MeasureSpec.getSize(heightMeasureSpec);
   }

然而,我无法在此方法中布置图像(图像的动画将不断调用此方法)。

要知道视图的实际高度,我需要执行以下操作:

屏幕高度 - 状态栏高度

因此,我可以在视图的构造函数中使用此值。

我无法相信为满足如此简单的要求提供解决方案会如此复杂。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接