zoukankan      html  css  js  c++  java
  • Android如何屏蔽home键和recent键

    最近在做一个项目的时候,进入一个 Activity后需要暂时屏蔽掉home键和recent键(back键可以在onKeyDown里面处理),网上找了半天,都是针对旧版本android的方法,android5.0以后就不能生效了。

    看了半天的SDK和资料,发现有一种方法可以暂时屏蔽掉home键和recent键,如果有办法获取到高级的系统权限,还可以正在的屏蔽掉。废话不多说,直接上代码:

    其实代码就一句话:startLockTask,整段代码如下:


    package utils.bobo.com.boboutils.App;

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.KeyEvent;

    import utils.bobo.com.boboutils.R;

    public class ScreenPinningActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screen_pinning);
    }
    @Override
    public void onResume(){
    super.onResume();
    this.startLockTask();
    }
    @Override
    public boolean onKeyDown(int keyCode,KeyEvent event){
    if(keyCode==KeyEvent.KEYCODE_BACK)
    return true;
    return super.onKeyDown(keyCode, event);
    }
    }

    启动后,会出现如下图的提示,用户点击知道了,home键和recent键就被屏蔽掉了,只有长按back键才能解除这个状态:


    再来说说高级的接口,这个高级的接口需要android.permission.STATUS_BAR的permission,这个permission定义如下:

        <permission android:name="android.permission.STATUS_BAR"
            android:protectionLevel="signature|privileged" />

    这个定义决定了你的apk必须是platform签名或者预制在system/priv-app下,

    所以这个方法对普通的开发者无效,但是如果你是做rom的,就可以采用这个方法。代码也很简单,这边就不贴完整代码了


    mStatusBarManager = (StatusBarManager) getApplicationContext()
    .getSystemService(Context.STATUS_BAR_SERVICE);
    mStatusBarManager.disable(StatusBarManager.DISABLE_HOME | StatusBarManager.DISABLE_RECENT | StatusBarManager.DISABLE_EXPAND);
    在activity 退出的时候要执行下

    mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
    恢复home键和recent键

    其实还有一种比较流氓的方法:

    就是不用activity实现,而是添加一个TYPE_SYSTEM_ALERT的view到window上,这个网上的代码也挺多的,这边贴小部分代码,有兴趣的同学自己再去百度下


    WindowManager wm = (WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams();

    params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
    params.flags = LayoutParams.FLAG_NOT_FOCUSABLE;

    params.width = WindowManager.LayoutParams.FILL_PARENT;
    params.height = WindowManager.LayoutParams.FILL_PARENT;
    params.format = PixelFormat.TRANSPARENT;

    params.gravity=Gravity.LEFT|Gravity.TOP;
    params.x = 0;
    params.y = 0;
    wm.addView(mView, params);

    源代码可以从 https://github.com/bobohuang1985/android-utils-api 下载,
    ————————————————
    版权声明:本文为CSDN博主「zhenbohuang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zhenbohuang/article/details/72722247

  • 相关阅读:
    Oracle通过Rman的"copy datafile"转移数据文件后不要使用sqlplus来重命名文件位置和文件名
    Oracle使用errorstack跟踪客户端的ORA报错
    Oracle OEM 13C表空间报警延迟问题
    CH5 用神经网络解决线性问题
    CH4 简化神经网络模型
    CH3 初识 TensorFlow
    Python 语言和 TensorFlow 框架环境准备
    创建型模式之单例模式与工厂模式(一)
    Node.js Koa框架学习笔记
    国庆七天假 不如来学学Vue-Router
  • 原文地址:https://www.cnblogs.com/Alex80/p/11988433.html
Copyright © 2011-2022 走看看