重新启动Android SystemUIService后,如何在不重新启动的情况下刷新壁纸图像?

时间:2014-04-04 07:47:22

标签: android adb

我正在为我的公司创建一个企业应用程序,该应用程序只能运行在一台提供7英寸平板电脑的公司上,该平板电脑已植根并运行Android 4.2.2。要求是当员工登录应用程序时,他们不应该能够离开应用程序,直到他们退出。我能够通过在登录时隐藏顶部系统栏和底部导航栏来实现这一点,然后我们在他们退出时再次显示两个栏。隐藏栏我执行以下命令:

adb shell service call activity 42 s16 com.android.systemui

并再次显示条形码我执行此命令:

adb shell am startservice -n com.android.systemui/.SystemUIService

当我隐藏条形图时,壁纸背景图像被删除,这很好。当我再次显示条形图时,壁纸图像不会被替换,直到设备重新启动,这是不理想的。

所以我的问题是这个......有人能告诉我如何刷新或显示壁纸图像而不需要在启动SystemUIService后重启设备吗?

1 个答案:

答案 0 :(得分:2)

经过进一步调查后,我发现当我运行这些命令时,壁纸只会在图像而不是动态壁纸或视频壁纸时消失。

我意识到这对于一个不常见的场景来说是非常具体的,但我认为如果它可能在将来帮助其他人的情况下我会分享我的解决方案。我希望有一个命令,我可以运行,解决这个问题,但无法找到任何东西,所以我决定以编程方式刷新壁纸。 WallpaperManager在此阶段没有刷新方法,因此我只获取现有的壁纸图像,然后将壁纸设置为该图像。有点黑客,但在我看来,它比给用户留下黑色壁纸更好。

private void refreshWallpaper() {
    try {
        WallpaperManager wallpaperManager = 
            WallpaperManager.getInstance(context);
        WallpaperInfo wallpaperInfo = wallpaperManager.getWallpaperInfo();

        // wallpaperInfo is null if a static wallpaper is selected and
        // is not null for live wallpaper & video wallpaper.
        if (wallpaperInfo == null) {
            // get the existing wallpaper drawable
            Drawable wallpaper = wallpaperManager.peekDrawable();

            // convert it to a bitmap
            Bitmap wallpaperBitmap = drawableToBitmap(wallpaper);

            // reset the bitmap to the current wallpaper
            wallpaperManager.setBitmap(wallpaperBitmap);    
        }
    } catch (Exception e) {
        // TODO: Handle exception as needed
        e.printStackTrace();
    }
}

private static Bitmap drawableToBitmap(Drawable drawable) {
    if (drawable instanceof BitmapDrawable) { 
        return ((BitmapDrawable) drawable).getBitmap(); 
    }

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
        drawable.getIntrinsicHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}