SystemUI状态栏禁止下拉

有先时候有需求需要屏蔽状态栏下拉,例如com.android.phone中的紧急呼叫时(sim卡锁住),此时源码设计是状态栏下拉不了的。

Android中有许多隐藏的Service,StatusBarManager就是其中一个,在Context.java中可以看到:

   /**
    * Use with {@link #getSystemService} to retrieve a {@link
    * android.app.StatusBarManager} for interacting with the status bar.
    *
    * @see #getSystemService
    * @see android.app.StatusBarManager
    * @hide
    */
   public static final String STATUS_BAR_SERVICE = "statusbar";

表明该service不对外提供,如果要调用的话需要在源码上编译,才能调用到标记为@hide的接口。也可以将源码编译出来的classes.jar包添加到工程里面。

 

StatusBarManager提供了一些有用的接口,像disable()方法正是我们需要的,一些系统级的应用也是调用的该方法禁止StatusBar下拉的,比如电话、锁屏模块。想要调用该方法,你还需要以下权限:

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

获取StatusBarManager实例,

</pre><pre name="code" class="java">mStatusBarManager = (StatusBarManager) mContext.getSystemService(Context.STATUS_BAR_SERVICE);

禁止下拉:

mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND);

解除禁止:

mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);

例子1:

公司有个需求当拨打电话在前台执行时,状态栏下拉不了,而在后台执行时,状态栏则可以下拉,此时需要修改的是phone应用。

在电话的呼出流程中,我们最后需要按下拨号键,才能将电话拨打出去,那么在按下拨号键之后,我们可以看到会弹出一个界面(1),显示拨号信息以及一些其他信息,这个界面就是我们的InCallScreen界面。当然,在来电(2)的时候,弹出的界面依然是InCallScreen,在我们接通电话(3)之后显示的那个界面仍然是InCallScreen。也就是说在通话过程中,我们一直可见并操作的那个界面就是InCallScreen

在类com.android.phone. InCallScreen.java

private StatusBarManager mStatusBarManager;
mStatusBarManager = (StatusBarManager)getSystemService(Context.STATUS_BAR_SERVICE);
@Override
   protected void onResume() {
       if (DBG) log("onResume()...");
       super.onResume();
       
       mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND);
…………………..
}     
@Override
   protected void onPause() {
       if (DBG) log("onPause()...");
       super.onPause();
       
       mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
…………..
}         



例子2:公司有个需求在安全模式下状态栏下拉不了,android模式下状态栏可以下拉(两个模式的切换广播通知),这个需求我们可以使用上述方法,也可以直接在systemui中修改,此时我们使用第二种方法。

status_bar.xml:下拉部分就是触摸这个View,因此可以在这个视图中查看触摸事件。(状态栏部分:包括浮动通知,耳机、蓝牙、电池、信号、闹钟等图标)

<com.android.systemui.statusbar.phone.PhoneStatusBarView
………………..

packagecom.android.systemui.statusbar.phone;
public classPhoneStatusBarView extends PanelBar {
@Override
   public boolean panelsEnabled() { //可以在此处修改
       return ((mBar.mDisabled & StatusBarManager.DISABLE_EXPAND) == 0);
    }
}

上述方法中可以修改为如下:

public boolean panelsEnabled() {
if(安全模式){
                       return false;
             }else{
                       return ((mBar.mDisabled &StatusBarManager.DISABLE_EXPAND) == 0);
             }
}

packagecom.android.systemui.statusbar.phone;
public classPanelBar extends FrameLayout {
   @Override
    publicboolean onTouchEvent(MotionEvent event) {
       // Allow subclasses to implement enable/disable semantics
        if (!panelsEnabled()) {
           if (event.getAction() == MotionEvent.ACTION_DOWN) {
                Slog.v(TAG,String.format("onTouch: all panels disabled, ignoring touch at(%d,%d)",
                        (int)event.getX(), (int) event.getY()));
           }
           return false;
       }
public booleanpanelsEnabled() {//父类PhoneStatusBarView重写了
       return true;
    }
…..
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值