Android 应用层面屏蔽状态栏方法总结

目前已转至个人博客,本文地址:Lam's Blog - Knowledge as Action


以下内容为网络资料整理得出,感谢大神,在此就不一一指出了

一、由于StatusBarManager在SDK中没有提供,所以需要使用反射来调用该类的方法

代码部分如下:

Object service = getSystemService("statusbar");
    try { 
        Class <?> statusBarManager = Class.forName("android.app.StatusBarManager"); 
        Method expand = statusBarManager.getMethod("disable",int.class); 
        expand.invoke (service,0×00000001); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    }

禁用通知栏需要添加以下权限并使用系统签名

<uses-permission android:name="android.permission.STATUS_BAR"/> 
    <uses-permission android:name="android.permission.DISABLE_STATUS_BAR"/>

网上资料中有提到如果没有使用系统签名则会报如下错误

     Caused by: java.lang.SecurityException: StatusBarManagerService: Neither user 10072 nor current process has android.permission.STATUS_BAR.

在使用系统签名之前需要

1.在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"
2.修改Android.mk文件,加入LOCAL_CERTIFICATE:=platform

让程序运行到系统进程中

Android中使应用程序获得系统签名权限方法:

1.需要在Android系统源码的环境下用make来编译

      (1)在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"
      (2)修改Android.mk文件,加入LOCAL_CERTIFICATE:=platform
      (3)使用mm命令来编译生成APK即可

2.不需要在系统源码环境下编译

      (1)在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"
      (2)使用eclipse编译出APK文件,此时的APK文件不可用
      (3)用压缩软件打开APK文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件
      (4)使用目标系统的platform密钥来重新给APK文件签名。首先要找到密钥文件,如"build\target\product\security",下面的platform.pk8和platform.x509.pem两个文件,然后用Android提供的SignApk工具来签名,该工具源码在"build\tools\signapk"下,用法是"signapk platform.x509.pem platform.pk8 input.apk output.apk"

原理:

首先加入android:sharedUserId="android.uid.system"这个属性,通过SharedUserId拥有同一个User ID的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,就具有相应的权限了。
但是只是加入UID还不够,这时候的APK是无法安装的,因为签名不符。程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法中的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中,第一个方法的LOCAL_CERTIFICATE:=platform其实就是用这两个key签名
这也有一个问题,就是这样生成的程序只有在原始的Android系统或自己编译的系统中才可用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件,要是别家公司的Android系统连安装都安装不了。目前只是整理了资料,还没有进行实际开发,之后如果有实际应用这部分内容,会将最后结果整理发布。


二、如果是系统级应用,也就是手机厂家植入的应用,可以使用disable(int)的方法来进行屏蔽,参数如上源码五个参数之一即可。但是如果是在应用层上的,disable方法因为权限问题无法使用(如果一定要使用必须具有系统签名)。这个时候可以使用collapse()方法,现在的小米锁屏和360锁屏都是使用该方法,具体代码如下:

<span style="font-size:14px;"><span style="margin: 0px; padding: 0px; border: 0px; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">    public void disableStatusBar(){
        try {
            Object service = getSystemService("statusbar");
            Class<?> claz = Class.forName("android.app.StatusBarManager");
            Method expand = claz.getMethod("collapse");
            expand.invoke(service);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }</span>
</span>

重写activity的onWindowfocuschanged方法,执行如上操作即可。 但是此种方法有严重的适配性问题,不同的系统下的回滚方法名不一样,需要对所有版本进行适配,非常繁琐。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值