隐藏安卓平板的SystemStatuBar

来源:互联网 发布:淘宝店铺管理平台 编辑:程序博客网 时间:2024/04/30 18:05

(转载自:http://www.apkbus.com/android-109962-1-1.html)


这个教程 我们 遵循 1.发现问题 2.思考问题 3.解决问题的 主线 进行下去

1.发现问题 
最近在做一个公司的项目,这个项目是对应 android tablet(android 4.0)的 。本人以前也没有在平板上开发过,对 平板和手机 开发的特性不是很了解。公司 要求 应用全屏显示,禁止用户操作 Home ,back 键 。起初 以为和 手机开发一样的 很简单,但是真正了解之后 ,发现这是 困扰 很对 平板开发者的难题。貌似 只有一些 外国的 第三方软件能实现 这个功能(都需要 root)。
2.思考问题
带着这个问题就去网上搜寻各种资料,大概列举一下 我找到的方案(都不能解决问题)。
2.1
[mw_shl_code=java,true]/**
* 设置系统栏可见性
*/
public static void setSystemBarVisible(final Activity context,boolean visible) {
    int flag = context.getWindow().getDecorView().getSystemUiVisibility();   // 获取当前SystemUI显示状态
    // int fullScreen = View.SYSTEM_UI_FLAG_SHOW_FULLSCREEN;
    int fullScreen = 0x8;   // 4.1 View.java的源码里面隐藏的常量SYSTEM_UI_FLAG_SHOW_FULLSCREEN,其实Eclipse里面也可以调用系统隐藏接口,重新提取下android.jar,这里就不述了。
    if(visible) {   // 显示系统栏
        if((flag & fullScreen) != 0) {  // flag标志位中已经拥有全屏标志SYSTEM_UI_FLAG_SHOW_FULLSCREEN
            context.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);   // 显示系统栏
        }
    } else {    // 隐藏系统栏
        if((flag & fullScreen) == 0) {  // flag标志位中不存在全屏标志SYSTEM_UI_FLAG_SHOW_FULLSCREEN
            context.getWindow().getDecorView().setSystemUiVisibility(flag | fullScreen); // 把全屏标志位加进去
        }
    }
}
[/mw_shl_code]
2.2
[mw_shl_code=java,true]onCreate 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 

and to hide 
WindowManager.LayoutParams attrs = getWindow().getAttributes(); 
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; 
getWindow().setAttributes(attrs); 
[/mw_shl_code]
2.3
in your Manifest, use in the <application> tag the attribute: 
[mw_shl_code=java,true]android:theme="@android:style/Theme.Holo.NoActionBar" 
or 
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" [/mw_shl_code]
2.4.。。。(N多 方法都不好用)

3.解决问题
  面对这么个 纠结的问题,最好的方法 就是看源码了!对于平板 google 是不允许隐藏底部 状态栏的,因此也不提供 相应的API。而对于一些特别定制的应用又有
这方面的需求。要实现的话 估计 要设计到 底层的 代码操作了,本人 对 底层的代码 理解 也不是很深 ,在一些 老前辈的 指导下慢慢摸索 最终 实现了 在 android 平板  隐藏 底部状态栏的功能。
下面分享一下 我的成果。
隐藏的关键代码:
[mw_shl_code=java,true] private void closeBar(){
            try{
                    //需要root 权限 
                Build.VERSION_CODES vc = new Build.VERSION_CODES();
                Build.VERSION vr = new Build.VERSION();
                String ProcID = "79"; 

                if(vr.SDK_INT >= vc.ICE_CREAM_SANDWICH){
                    ProcID = "42"; //ICS AND NEWER
                }

                //需要root 权限 
                Process proc = Runtime.getRuntime().exec(new String[]{"su","-c","service call activity "+ ProcID +" s16 com.android.systemui"}); //WAS 79
                proc.waitFor();

            }catch(Exception ex){
                Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show();
            }
    }[/mw_shl_code]
(欢呼吧!)
 
那么我们隐藏了 状态栏又要用 怎么办?别着急 ,下面是 显示 的代码:
[mw_shl_code=java,true]   private void showBar(){
        try {
            Process proc = Runtime.getRuntime().exec(new String[]{
                    "am","startservice","-n","com.android.systemui/.SystemUIService"});
            proc.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }[/mw_shl_code]
 

PS:本实例需要 root 权限 ,本人 是在公司的 covia测试平板
      上测试的(系统版本android 4.0.4),我相信这种方法会 适用大部分平板,同志们赶紧试试吧!

0 0
原创粉丝点击