โหมดคีออสก์ใน Android


114

ฉันอยู่ระหว่างการประเมินว่าแอปพลิเคชันองค์กร CF .NET สามารถพอร์ตให้ทำงานบนอุปกรณ์ Android ได้หรือไม่และอย่างไร แอปพลิเคชันบนโทรศัพท์มือถือ Windows ทำงานในโหมดคีออสก์ซึ่งแอปพลิเคชันจะเริ่มอัตโนมัติในโหมดเต็มหน้าจอหลังจากบูตและผู้ใช้ไม่สามารถเข้าถึงส่วนอื่น ๆ ของโทรศัพท์ได้โดยบังเอิญหรือเต็มใจ

เป็นไปได้หรือไม่ที่ Android จะมีการรีสตาร์ทแอปพลิเคชันเพียงครั้งเดียวหลังจากบูตและป้องกันไม่ให้ผู้ใช้เข้าถึงส่วนอื่น ๆ ของอุปกรณ์ Android โดยบังเอิญ (หรือเต็มใจ)


คุณแก้ปัญหาของคุณหรือไม่?
Menna-Allah Sami

3
ใช่มันเป็นไปได้ ฉันสร้างโพสต์บล็อกยาว (มาก) เกี่ยวกับเรื่องนี้: andreas-schrade.de/2015/02/16/…
funcoder

ฉันยังสร้างบล็อกโพสต์เกี่ยวกับเรื่องนี้ (บางส่วน) โดยใช้ Lollipop - ไม่รวมส่วนรับบูตแม้ว่า: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi

ฉันตอบคำถามที่คล้ายกันที่นี่เกี่ยวกับวิธีการต่างๆในการสร้างอุปกรณ์แบบใช้ครั้งเดียวที่ล็อกไว้: stackoverflow.com/a/43644803/2888763
Trevor Halvorson

คำตอบ:


29

คุณสามารถเริ่มต้นแอปพลิเคชันโดยอัตโนมัติเมื่อบูตโดยฟังandroid.intent.action.BOOT_COMPLETEDเจตนาใน BroadcastReceiver และเริ่มกิจกรรมของคุณจากที่นั่น ในกิจกรรมคุณสามารถลงทะเบียนตัวเองเป็นหน้าจอหลักเริ่มต้นใหม่ [1] และจัดการกับคีย์

ฉันคิดว่ามีบางกรณีที่คุณไม่สามารถจัดการได้โดยไม่ต้องแก้ไขกรอบ (เช่น longpress บนหน้าแรกเพื่อแสดงแอปพลิเคชันที่ใช้งานอยู่ในปัจจุบัน) - ฉันอาจเข้าใจผิดได้เช่นกัน

แต่สำหรับต้นแบบนั้นก็เพียงพอแล้ว

ขอให้สนุกกับการซ่อม!

[1]:

<intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.HOME" />
 <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

1
นอกจากนี้คุณยังต้องแทนที่ onbackpressed ของ acitivty ครั้งแรกเมื่อคุณกดปุ่มย้อนกลับคุณไปที่ตัวเรียกใช้งาน
ademar111190

วิธีบรรลุการโต้ตอบของระบบ n แถบการแจ้งเตือนที่ปิดใช้งานผ่านรหัส
Gnanam R

1
@GnanamR: ตรวจสอบคำตอบของฉันได้ที่: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

@Rinkalkumar เรียกใช้แอปในโหมดเต็มหน้าจอ
John61590

17

คุณสามารถปรับแต่งสิ่งนี้ได้ (ปิดใช้งานการเข้าถึงเมนู จำกัด การเพิ่มแอปพลิเคชัน ฯลฯ ) เพื่อเปิดใช้งานคีออสก์ http://code.google.com/p/android-launcher-plus/


7
ฉันขอทราบได้ไหมว่าเหตุใดจึงถูกลดคะแนน ฉันเขียนแอปคีออสก์ Android ที่ใช้งานได้เต็มรูปแบบแล้วในปัจจุบันโดยแก้ไขและพัฒนาบน Android launcher plus
rbot

1
ในกรณีนี้ฉันโหวตให้ทั้งคำตอบและความคิดเห็นของคุณ ;-)
Mawg บอกว่าคืนสถานะ Monica

@rbot คุณทำได้อย่างไร? ฉันพยายามสร้างแอปพลิเคชันคีออสก์มานานแล้วและได้แก้ไขเกือบทุกอย่างยกเว้นเพื่อให้แน่ใจว่าถาดการแจ้งเตือนไม่เปิดขึ้น
Wakka02

1
@ Wakka02 ฉันคิดว่าฉันกำลังมองหา onwindowchanged หรือเหตุการณ์ที่คล้ายกัน (ซึ่งอาจบ่งบอกถึงการเปิดถาดแจ้งเตือน) และปิดถาด ฉันทำเมื่อนานมาแล้วดังนั้นอย่าจำเฉพาะเจาะจง
rbot

@ Wakka02: ตรวจสอบคำตอบของฉันได้ที่: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

17

ใน Android L Preview ใหม่ Google ได้ประกาศTask Lockingซึ่งทำเช่นนั้น ดูเหมือนว่าจะต้องรูทอย่างไรก็ตาม

L Developer Preview แนะนำ API การล็อกงานใหม่ที่ช่วยให้คุณ จำกัด ผู้ใช้ชั่วคราวไม่ให้ออกจากแอปของคุณหรือถูกรบกวนจากการแจ้งเตือน สิ่งนี้สามารถใช้ได้เช่นหากคุณกำลังพัฒนาแอปการศึกษาเพื่อรองรับข้อกำหนดการประเมินที่มีเดิมพันสูงบน Android เมื่อแอปของคุณเปิดใช้งานโหมดนี้ผู้ใช้จะไม่สามารถดูการแจ้งเตือนเข้าถึงแอปอื่น ๆ หรือกลับไปที่หน้าจอหลักได้จนกว่าแอปของคุณจะออกจากโหมด

เพื่อป้องกันการใช้งานโดยไม่ได้รับอนุญาตเฉพาะแอปที่ได้รับอนุญาตเท่านั้นที่สามารถเปิดใช้งานการล็อกงานได้ นอกจากนี้การอนุญาตการล็อกงานต้องได้รับอนุญาตจากแอปเจ้าของอุปกรณ์ที่กำหนดค่าไว้เป็นพิเศษผ่านทางไฟล์ android.app.admin.DevicePolicyManager.setLockTaskComponents()วิธีนี้

ในการตั้งค่าเจ้าของอุปกรณ์ให้ทำตามขั้นตอนเหล่านี้:

  • แนบอุปกรณ์ที่ใช้ Android userdebugbuild กับเครื่องพัฒนาของคุณ
  • ติดตั้งแอปเจ้าของอุปกรณ์ของคุณ
  • สร้างdevice_owner.xmlไฟล์และบันทึกลงใน/data/systemไดเร็กทอรีบนอุปกรณ์
$ adb root
$ adb shell stop
$ rm /tmp/device_owner.xml
$ echo "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" >> /tmp/device_owner.xml
$ echo "&device-owner package=\"<your_device_owner_package>\" name=\"*<your_organization_name>\" />" >> /tmp/device_owner.xml
$ adb push /tmp/device_owner.xml /data/system/device_owner.xml
$ adb reboot

ก่อนที่จะใช้งาน API การล็อกงานในแอปของคุณให้ตรวจสอบว่ากิจกรรมของคุณได้รับอนุญาตโดยเรียก DevicePolicyManager.isLockTaskPermitted ()

หากต้องการเปิดใช้งานการล็อกงานให้โทรandroid.app.Activity.startLockTask() จากกิจกรรมที่ได้รับอนุญาตของคุณ

เมื่อการล็อกงานทำงานอยู่ลักษณะการทำงานต่อไปนี้จะมีผล:

  • แถบสถานะว่างเปล่าและการแจ้งเตือนผู้ใช้และข้อมูลสถานะจะถูกซ่อนไว้
  • ปุ่มโฮมและแอพล่าสุดถูกซ่อนไว้
  • แอปอื่น ๆ อาจไม่เปิดตัวกิจกรรมใหม่
  • แอปปัจจุบันอาจเริ่มกิจกรรมใหม่ได้ตราบเท่าที่การดำเนินการดังกล่าวไม่ได้สร้างงานใหม่
  • ส่วนที่เหลือของผู้ใช้ล็อคใน app Activity.stopLockTask()ของคุณจนกว่าผู้มีอำนาจโทรกิจกรรม

3
developer.android.com/guide/topics/admin/device-admin.html - ในการปรับใช้แอปผู้ดูแลอุปกรณ์
Toshe

2
นี่คือบทความของฉันเกี่ยวกับ Task Locks พร้อมการตั้งค่าแบบเต็ม algoritm pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan

9

หลังจากค้นหาสิ่งนี้มาระยะหนึ่งแล้วฉันก็ได้พบทางออกที่ดี สิ่งนี้ใช้ได้กับอุปกรณ์ที่รูทเท่านั้น แต่ฉันเดาว่ามันมีไว้สำหรับแอพนี้เท่านั้นการรูทก็ไม่น่าจะเป็นปัญหา

  • ทำให้แอปพลิเคชันของคุณเป็นตัวเรียกใช้งานโดยการเพิ่ม

    <category android:name="android.intent.category.HOME" /> 

    เพื่อกรองเจตนาของคุณ

  • ตรวจสอบให้แน่ใจว่าแอปของคุณยุบแถบเครื่องมือดังนั้นคุณจึงไม่สามารถเข้าถึงแถบการแจ้งเตือนได้โปรดดูวิธีปิดใช้งานแถบสถานะ / แถบการแจ้งเตือนบน Android โดยทางโปรแกรม? หรือhttp://blog.vogella.com/2011/02/28/android-hidding-the-status-and-title-bar/

  • จากนั้นหากต้องการหยุดโปรแกรมอื่น ๆ ไม่ให้เปิดโดยไม่ได้ตั้งใจให้ใช้ Accessibility Service เพื่อตรวจสอบ Window State Changed เปรียบเทียบแพ็กเกจกับรายการสีขาวหรือสีดำและใช้ ActivityManager.killBackgroundProcesses เพื่อฆ่าหากไม่ควรทำงาน

ตรวจสอบhttp://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/สำหรับวิธีอื่น


5

เริ่มต้นแอปของคุณเมื่อบูต

วิธีที่ดีที่สุดในการทำสิ่งนี้คือการตั้งค่าแอปของคุณเป็นตัวเรียกใช้งาน

<activity ...
  android:launchMode="singleInstance"
  android:windowActionBar="false">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.HOME" />
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

กำลังล็อกแอปของคุณ

วิธีที่น่าเชื่อถือที่สุดคือใช้อุปกรณ์ที่มี Lollipop ขึ้นไปและใช้ประโยชน์จาก

startLockTask

ก่อนอื่นคุณต้องตั้งค่าแอปของคุณเป็นเจ้าของอุปกรณ์ หมายเหตุอุปกรณ์ของคุณต้องยกเลิกการจัดสรร: หากคุณลงทะเบียนคุณควรรีเซ็ตเป็นค่าเริ่มต้นจากโรงงานและข้ามการลงทะเบียนบัญชี

เพื่อให้สามารถลงทะเบียนแอพของคุณได้คุณต้องตั้งค่าคอมโพเนนต์ DeviceAdminReceiver ก่อน:

package com.example.myapp;

public class MyDeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver {
    @Override
    public void onEnabled(Context context, Intent intent) {
        Toast.makeText(context, "Device admin permission received", Toast.LENGTH_SHORT).show();
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return "are you sure?";
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        Toast.makeText(context, "Device admin permission revoked", Toast.LENGTH_SHORT).show();
    }


    @Override
    public void onLockTaskModeExiting(Context context, Intent intent) {
        // here you must re-lock your app. make your activity know of this event and make it call startLockTask again!
    }
}

เมื่อคุณมีอุปกรณ์ที่ไม่ได้เตรียมการไว้คุณสามารถเรียกใช้คำสั่งต่อไปนี้จาก adb ( ไม่จำเป็นต้องรูท )

adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver

เพื่อหลีกเลี่ยงไม่ให้ Android ขอสิทธิ์ผู้ใช้เพื่อตรึงแอปของคุณคุณต้องเรียก setLockTaskPackages

ในที่สุด!

@Override
public void onResume(){
    super.onResume();
    DevicePolicyManager mDevicePolicyManager = (DevicePolicyManager) getSystemService(
            Context.DEVICE_POLICY_SERVICE);
    ComponentName mAdminComponentName = new ComponentName(getApplicationContext(), MyDeviceAdminReceiver.class);
    mDevicePolicyManager.setLockTaskPackages(mAdminComponentName, new String[]{getPackageName()});
    startLockTask();
}
@Override
public void finish(){
    stopLockTask();
    super.finish();
}

5

Google เพิ่งเปิดตัวAndroid Management APIซึ่งช่วยให้สามารถตั้งค่าโหมดคีออสก์สำหรับอุปกรณ์ Android ที่ใช้ Android 5.1 ขึ้นไปและยังกำหนดนโยบายอื่น ๆ ได้อีกด้วย


การค้นหาที่ยอดเยี่ยม นี่คือลิงก์โดยตรงไปยังข้อมูลโหมดคีออสก์: developers.google.com/android/management/policies/…
Robert Liberatore

3

ตั้งค่าหน้าอุปกรณ์วัตถุประสงค์เดียวของนักพัฒนา Android ได้อธิบายสิ่งนี้คุณสามารถทำความรู้จักสิ่งต่างๆได้อย่างง่ายดายจากที่นั่น

ตอนนี้การกำหนดค่าAndroid 6.0 Marshmallow และอุปกรณ์ที่ใหม่กว่าเป็นอุปกรณ์แบบใช้ครั้งเดียว (COSU) ขององค์กรเป็นเรื่องง่าย


2

พบอีกเทคนิคที่เป็นไปได้ในโพสต์ฟอรัมนี้ อ้างถึงโพสต์นั้น:

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/10839-android-kiosk-mode-tutorial.html

ใช้วิธีการต่อไปนี้คุณสามารถสร้างแอปพลิเคชันที่จะป้องกันไม่ให้ผู้ใช้ "ปกติ" เล่นกับสิ่งอื่นนอกเหนือจากแอปพลิเคชันของคุณ

แอปพลิเคชันประกอบด้วยสองโมดูล กิจกรรมหลักและบริการ บริการได้รับการกำหนดค่าให้เริ่มต้นเมื่อบูต เมื่อบริการเริ่มทำงานจะตรวจสอบว่ากิจกรรมกำลังทำงานอยู่หรือไม่ หากไม่ทำงานจะใช้ตัวจับเวลาเพื่อเริ่มกิจกรรมหลัก

เมื่อหยุดกิจกรรมชั่วคราวจะกำหนดเวลาให้บริการเริ่มในหนึ่งวินาที: รหัส:

Sub Activity_Pause (UserClosed As Boolean)
    If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)    
End Sub

หากผู้ใช้กดที่หน้าจอหลักหน้าจอหลักจะปรากฏขึ้นเป็นเวลาหลายวินาที อย่างไรก็ตามแอปพลิเคชันของคุณจะกลับไปที่ด้านหน้าหลังจากนั้นไม่กี่วินาทีและผู้ใช้จะไม่สามารถโต้ตอบกับแอปพลิเคชันอื่น ๆ หรือเปลี่ยนแปลงการตั้งค่าได้

บริการถูกกำหนดให้เป็นบริการเบื้องหน้า วิธีนี้ป้องกันไม่ให้ Android ฆ่าบริการของเรา กดปุ่ม Stop เพื่อปิดใช้งานโหมดคีออสก์

ดูเหมือนว่าจะมีตัวอย่างไฟล์ ZIP รหัสโหมดคีออสก์ให้ดาวน์โหลดด้วย


2

Xposed frameworkสามารถทำได้ จำเป็นต้องรูทและมีความเป็นไปได้ที่จะใช้ไม่ได้กับทุกแพลตฟอร์ม มองหาปิดการใช้งาน ()วิธีการในชั้นเรียนandroid.app.StatusBarManager

ที่นี่ในซอร์สโค้ด Android

ดูวิธีการเขียนโมดูลของคุณเองที่นี่: บทช่วยสอนการพัฒนา Xposed

ง่ายกว่าที่คิดในตอนแรก โชคดี!


โมดูล Xposed ใดที่คุณคิดว่าทำเช่นนี้
Firelord

0

นอกเหนือจากการตั้งค่าแอปพลิเคชันของคุณด้วยเครื่องรับ BOOT และคำตอบนี้เพื่อป้องกันการขยายแถบสถานะโซลูชันนี้ทำงานบน 4.4 ขึ้นไปเป็นแอปคีออสก์ที่สมบูรณ์:

วางใน onCreate () ของคุณ:

    final View view = (View) findViewById(android.R.id.content);
    if (view != null) {
        //"hides" back, home and return button on screen. 
        view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
                                   View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                                   View.SYSTEM_UI_FLAG_IMMERSIVE |
                                   View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
                                   View.SYSTEM_UI_FLAG_FULLSCREEN);
        view.setOnSystemUiVisibilityChangeListener
                (new View.OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                        // Note that system bars will only be "visible" if none of the
                        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
                        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                            view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
                                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                                    View.SYSTEM_UI_FLAG_IMMERSIVE |
                                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
                                    View.SYSTEM_UI_FLAG_FULLSCREEN);
                        }
                    }
                });
    }

สิ่งนี้จะซ่อนปุ่มย้อนกลับแอพและปุ่มโฮมอย่างสมบูรณ์


แล้วแถบการแจ้งเตือนล่ะ
Elshan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.