2019-06-25 18:17:41 qq_33796069 阅读数 243

又是用户的需求,实现Kiosk模式,让设备只运行他想要的程序。之前做过一种是自动隐藏底部所有按键,可以看我之前的博客隐藏底部按键

但是这种方式还是有缺陷,虽然也能实现想要的模式,总感觉,很不满意。这次想要实现Android原本就有的Kiosk模式。

在Android中有两种模式对我们非常有用

  1. DeviceAdmin设备管理

  2. DeviceOwner设备所有者

当然还有一种模式ProfileOwner(配置文件所有者),这种模式看了一下资料说国内不好用,暂时不管,因为今天讲的也用不上。

先说设备管理模式

Android 2.2通过提供Android设备管理API引入了对企业应用程序的支持。设备管理API提供了系统级的设备管理功能。这些api允许您创建安全感知的应用程序,这些应用程序在企业设置中非常有用,在企业设置中,IT专业人员需要对员工设备进行丰富的控制。例如,内置的Android电子邮件应用程序利用了新的api来改进Exchange支持。通过电子邮件应用程序,Exchange管理员可以跨设备强制执行密码策略——包括字母数字密码或数字pin。管理员还可以远程擦除(即恢复出厂默认值)丢失或被盗的手机。Exchange用户可以同步他们的电子邮件和日历数据。  ——来自有道翻译官方Android文档。哈哈哈哈哈哈哈

代码实现如下

在AndroidManifest.xml文件中添加

  <receiver
            android:name=".AdminReceiver"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />

            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>

上面的receiver的name就是我们要创建的类名

public class AdminReceiver extends DeviceAdminReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        LogUtil.d("设备管理=onReceive");
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        LogUtil.d("设备管理=onDisableRequested");
        return super.onDisableRequested(context, intent);
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        super.onDisabled(context, intent);
        LogUtil.d("设备管理=onDisabled");
    }

    @Override
    public void onEnabled(Context context, Intent intent) {
        super.onEnabled(context, intent);
        LogUtil.d("设备管理=onEnabled");
        //可以在此处进行跳转,但是不好处理其他的逻辑,暂时保留,后面会说其他跳转
        Intent itn = new Intent(context,
                MainActivity.class);
        itn.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(itn);
    }
}

其中还有一个xml文件,声明元数据中使用的安全策略。元数据提供特定于设备管理员的附加信息,由DeviceAdminInfo类解析

device_admin示例:

<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 指定设备超级管理员所拥有的权限 -->
    <uses-policies>

        <!--停用相机-->
        <disable-camera/>
        <!--锁屏时禁用某些功能-->
        <disable-keyguard-features/>
        <!--设置存储设备加密-->
        <encrypted-storage/>
        <!--设置锁定屏幕密码的有效期-->
        <expire-password/>
        <!--锁定屏幕-->
        <force-lock/>
        <!--设置密码规则-->
        <limit-password/>
        <!--更改屏幕解锁密码-->
        <reset-password/>
       <!-- &lt;!&ndash;设置设备全局代理&ndash;&gt;
        <set-global-proxy/>-->
        <!--监控屏幕解锁尝试次数-->
        <watch-login/>
        <!--恢复出厂设置-->
        <wipe-data/>
    </uses-policies>
</device-admin>

当然你也可以创建一个空的<device-admin>文件。不需要设置管理的权限

好了,需要的文件已经准备好了,现在是开始触发该模式的方式了

先通过代码判断我们的包名app是否已经处在设备管理者模式状态下

 private DevicePolicyManager dpm;
 private ComponentName componentName;



dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); 

componentName = new ComponentName(context, AdminReceiver.class);



dpm.isAdminActive(componentName);//判断是否已经是设备管理者模式了,返回boolean。

当我们进入闪屏页时,进行判断。

if(isAdminActive()){
    startMain();//跳转主页面的逻辑
}else {
    satrtOpenDevicer();//主动询问设备管理者权限的逻辑
}
public void satrtOpenDevicer() {
        ComponentName componentName = new ComponentName(this, AdminReceiver.class);
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "请求设备管理权限...");
        /*
         * 不能直接startActivity  因为可能在激活的时候用户点击了取消,这时候CheckBox状态是勾选的,但是实际是没激活的,
         */
        startActivityForResult(intent, DEVICECOMPONENTCODE);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.e("jsb_kiosk","结果"+requestCode);
        if(requestCode == DEVICECOMPONENTCODE){
            
            startMain();
        }
    }

这个时候当我们处于没有设备管理权限时进入app都会进行询问权限,界面如下:

好了处于设备模式后,就该处理DeviceOwner设备所有者

在这里查看大神写的比较完整的介绍

Android 提供了比较完善的设备所有者api,但是我发现调用的那些api效果完全没有作用,

ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class);
mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
if (!mDpm.isAdminActive(deviceAdmin)) {
            Toast.makeText(this, "没有设备管理权限", Toast.LENGTH_SHORT).show();
        }

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (mDpm.isDeviceOwnerApp(getPackageName())) {
                mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
            } else {
           
                Log.i("jsb_","没有专属模式");

            }
        }

上面代码没有效果。我们通过mDpm.isDeviceOwnerApp去判断当前是否处于设备所有者的是没有效果的。

但是通过adb shell处理设备确实可以进入Kiosk模式,

命令adb shell dpm set-device-owner 包名/包名.AdminReceiver   (跟你创建的AdminReceiver地址一样)设置DeviceOwner;
命令adb shell dpm remove-active-admin 包名/包名.AdminReceiver   退出DeviceOwner;

那么我们只要通过代码实现该操作命令就可以了

private void execShell(String cmd){
        try{
            java.lang.Process p = Runtime.getRuntime().exec("sh");
            OutputStream outputStream = p.getOutputStream();
            DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
            dataOutputStream.writeBytes(cmd);
            dataOutputStream.flush();
            dataOutputStream.close();
            outputStream.close();
        } catch(Throwable t)  {
            t.printStackTrace();
        }
    }

调用:

execShell("adb shell dpm set-device-owner "+getPackageName()+"/"+AdminReceiver.class.getName());

至于在什么时候调用该命令,就看个人需要,我是在闪屏页获取设备管理者后直接调用的

 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.e("jsb_kiosk","结果"+requestCode);
        if(requestCode == DEVICECOMPONENTCODE){
            execShell("adb shell dpm set-device-owner "+getPackageName()+"/"+AdminReceiver.class.getName());
            startMain();
        }
    }

好了通过上面的操作,我们已经完全进入DeviceOwner设备所有者模式了

但是并没有完事,还差最后一步,真正的完成Kiosk模式

调用下面方法

private void enableKioskMode(boolean enabled) {
        try {
            if (enabled) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    if (mDpm.isLockTaskPermitted(this.getPackageName())) {
                        startLockTask();
                        mIsKioskEnabled = true;
                    } else {
                        //没有进入该模式,没有权限
                    }
                }
            } else {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    stopLockTask();
                }
                mIsKioskEnabled = false;
            }
        } catch (Exception e) {
            // TODO: Log and handle appropriately
        }
    }

最后看效果吧

点击进入改模式

 

ok,感觉很不错~~今天就到这里了,有空我上传一下demo,下班了。

 

 

 

2011-05-21 00:44:14 dguthai 阅读数 26
什么是"Kiosk"模式?

通俗的说就是全屏(不同于F11全屏),是啥都没有的全屏,无地址栏,无windows状态栏等等,就是一裸的web页面和滚动条。

Kiosk Software广泛用于公共电脑或者嵌入系统,最常用的就是ATM机、自动服务机之类的系统了,其实他们很多都只是一个浏览器,虽然用Alt+Tab组合键就可以随意切换,但是一般的Kiosk系统不会给你这样的键盘。

如何打开"Kiosk"模式?

运行(win+R键)输入 C:\Program Files\Internet Explorer\iexplore.exe -k 回车。就这么简单,赶快动手试试。
2016-11-06 01:09:37 attilax 阅读数 769

Atitit 全屏模式的cs桌面客户端软件gui h5解决方案 Kiosk模式

 

1.1. Kiosk Software广泛用于公共电脑或者嵌入系统,最常用的就是ATM机、自动服务机之类的系统了1

1.2. Firefox的常用启动参数: (使用插件可以1

2. R-kiosk 0.9.0.1-signed.1-signed  2

2.1. Chrome 启动参数 (这个好用)2

 

1.1. Kiosk Software广泛用于公共电脑或者嵌入系统,最常用的就是ATM机、自动服务机之类的系统了

其实他们很多都只是一个浏览器,虽然用Alt+Tab组合键就可以随意切换,但是一般的Kiosk系统不会给你这样的键盘滴。

 

Use 360 yog ho tyaotyao ..

 

Ff zo ok le ..

 

安装以下扩展就可以进行设置成默认开启就全屏:https://addons.mozilla.org/zh-CN/firefox/addon/full-fullscreen/

 

 

1.2. Firefox的常用启动参数: (使用插件可以

 

-safe-mode  动火狐安全模在安全模式下,可以重置某些设置或禁用加载项等

-private 以隐私模式启动火狐

-kiosk        全屏启动

 

2. R-kiosk 0.9.0.1-signed.1-signed  

Kiosk模式不起作用,使用rkiosk插件才可。

2.1. Chrome 启动参数 (这个好用)

–start-maximized                启动就最大化

version    版本信息

-kiosk        全屏启动

 

C:\Program Files (x86)\Google\Chrome\Application\chrome.exe http://localhost/static/index.html -kiosk

 

HTML5实现全屏API【进入和退出全屏】 - kingwell - 博客园.html

HTML5实现全屏API【进入和退出全屏】 - kingwell - 博客园.html

 

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 

汉字名:艾提拉(艾龙)   EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

Atiend

 

2016-09-22 09:00:10 keyunq 阅读数 9219

新建脚本start.bat

自动全屏模式

"C:\Program Files\Google\Chrome\Application\chrome.exe" --kiosk http://cn.bing.com/

“C:\Program Files\Google\Chrome\Application\chrome.exe”是chrome程序路径

这种全屏显示和正常状态下chrome按F11是不一样的,F11全屏后chrome会在左下角显示A标签的链接地址,同时鼠标移动到最上方会弹出退出全屏的提示,可以再次按F11推出全屏模式,而通过参数启动全屏之后,F11将失效,A标签提示和退出全屏提示也将消失,只能通过ALT+F4退出chrome全屏模式,是很彻底的全屏模式,通过这种全屏模式,可以将网站制作成软件形式。

APP模式

"C:\Program Files\Google\Chrome\Application\chrome.exe" --app=http://cn.bing.com/ --start-maximized

APP 模式下,系统任务栏的图标会变成网页的 favicon 图标,而且窗口标题没有了 Google Chrome 的字样;

另外,为了让bat文件后台运行,随系统启动,新建一个vbs文件

createobject("wscript.shell").run "C:\start.bat",0

C:\start.bat 是bat文件路径
最后一个参数0 表示后台运行

然后将此vbs文件,放到【开始】-》【所有程序】-》【启动】里(windows下)。

就可以实现开机自启动chrome,并全屏打开某网页。

2010-11-29 05:31:00 yuanmeng001 阅读数 3746

p { margin-bottom: 0.21cm; }a:link { }

    近几年,国外出现一种“上网亭”(” Kiosk” ),类似我们的路边“售报亭”,专门用于上网冲浪,是英国 发明的,有点新意。为什么?


          当今,许多人整天在网上“泡”,多半少不了使用浏览器。几年前,英国工程师 Kai Hendry 突发奇想,何不专门制作一个“裸体”浏览器(其实就是火狐浏览器),简单、快速,而且安全可靠,特别适合于“上网撒野”?说干就干, 2006 年,他在 Debian 基础上搞了一个火狐浏览器发行版,叫“ Webconverger” (直译为 Web 汇聚器,也被简记为“ Webc” )。人们把它也叫做“互联网上网亭”(“ Kiosk” )。令人没有想到的是,这玩意儿近年来特别“火”起来了,谷歌的 Chrome OS 操作系统的原型大概就源于此(或借鉴它的模式)。


          实质上, Webc 就是一个“ Live read-only” 的火狐发行版。今年 11 6 日发布的最新版本 Webc 7.0 (是自由软件),体积不大,只有 255MB ,可以放在 CD/USB 上,有中日韩语言版本,直接启动系统(免安装)进行上网冲浪,使用非常方便。人们也许会问:如果这个“上网亭”平日没有人去管理维护,系统三天两头被人随意破坏需要恢复,岂不烦死人了?实际上, Webc 是一个“只读”压缩格式的自启动系统,放在光盘上就可以自己启动,或将其植入 U 盘(也是只读格式),用户自己随身携带,使用起来非常方便,根本不需要维护。互联网“上网亭”可以“无人值守”,不须维护。对于”上网亭”而言,病毒、木马、窥私和后门问题,全是“扯淡”(说废话之意)。


         互联网“上网亭”可以用在某些政府部门、学校、旅馆、医院、网吧等公共的上网场所(无人值守),(特别是在国外,网吧几乎都用“上网亭”),或是大型垂直企业的系统内部(需要特别定制一下)。有时,年轻的个人用户也很需要这种东西,深更半夜,上网撒野,无人知晓。这玩意儿初看起来并没有什么技术含量,一般不为“技术能人“看得起,实则不然。一个在中国境内可用的”上网亭“的中文化定制过程却并不简单,有许多细节需要考虑到我们的”国情“。

今天是 11 29 日,正好是喀纳斯自由软件专卖店网站( www.kanasshop.com )运转一周年, 12 8 日是一周年“店庆”。我建议在“店庆”那一天优惠发行“上网亭”的中文定制版( CD USB )以示庆贺。(注:要是喀纳斯专卖店小老板不同意这么做,我也没有办法。)

有人也许认为“上网亭”技术很简单,实际上,并非如此。“上网亭”包含了最新的“ Live 技术”(自生系统技术)进展,考虑了内存优化、桌面特殊布局等,不是一般人都能轻而易举“玩得转”。记住:“上网亭”不仅仅是一个“裸体”浏览器,它是火狐浏览器与 Linux 内核最小化的无缝“集成”,如果你不相信,不妨自己动手试试看!


          说明 1 :谷歌 Chrome 浏览器操作系统是一个通用型操作系统,可以用在:台式机、笔记本、上网本、平板电脑,车载系统、甚至网络电视(即 WebTV )。业内分析人士预计,明年全球平板电脑( Tablets )将要销售 1 亿台,为此, PC 计算机产量将要下降 4,000 多万台。看起来,互联网时代真的就要到来了。我认为, 360 pk Qq 是我国互联网朝向“现代化”发展一个里程碑事件,唤醒了我国广大的互联网用户的(互联网)主人翁意识,谁输,谁赢都不重要了, 360 与腾讯只是互联网 ISP 厂商而已。


          说明 2 Webconverger 的官方定义是:” The easiest way to deploy Firefox on kiosks for public Internet access” ,思路不要搞错了。

袁萌 11 29 日清晨

RHCE环境介绍

阅读数 57

没有更多推荐了,返回首页