Chế độ kiosk trong Android


114

Tôi đang trong quá trình đánh giá xem có thể chuyển ứng dụng doanh nghiệp CF .NET để chạy trên thiết bị Android hay không. Ứng dụng trên điện thoại Windows Mobile được chạy ở chế độ kiosk nơi ứng dụng tự khởi động ở chế độ toàn màn hình sau khi khởi động và người dùng không thể vô tình hoặc cố ý truy cập bất kỳ phần nào khác của điện thoại.

Có thể trên Android chỉ có một ứng dụng tự động khởi động sau khi khởi động và ngăn người dùng vô tình (hoặc cố ý) truy cập vào bất kỳ phần nào khác của thiết bị Android không?


Bạn có giải quyết được vấn đề của bạn không?
Menna-Allah Sami

3
Có, nó là có thể. Tôi đã tạo một bài đăng trên blog (rất) dài về điều này: andreas-schrade.de/2015/02/16/…
funcoder

Tôi cũng đã tạo một bài đăng blog về vấn đề này (một phần) sử dụng Lollipop - nó không bao gồm thu khởi động phần mặc dù: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi

Tôi đã trả lời một câu hỏi tương tự tại đây về các phương pháp khác nhau để tạo các thiết bị sử dụng một lần bị khóa: stackoverflow.com/a/43644803/2888763
Trevor Halvorson

Câu trả lời:


29

Bạn có thể tự động khởi động các ứng dụng khi khởi động bằng cách lắng nghe android.intent.action.BOOT_COMPLETEDý định trong BroadcastReceiver và bắt đầu Hoạt động của bạn từ đó. Trong Hoạt động, bạn có thể tự đăng ký làm màn hình chính mặc định mới [1] và xử lý các phím.

Tôi nghĩ rằng có một số trường hợp mà bạn không thể xử lý nếu không sửa đổi khuôn khổ (như longpress trên Trang chủ để hiển thị Ứng dụng hiện đang hoạt động) - Tuy nhiên, tôi cũng có thể nhầm lẫn.

Nhưng đối với một nguyên mẫu có thể là đủ.

Vui vẻ mày mò!

[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
Bạn cũng cần phải ghi đè lên onbackpressed của acitivty đầu tiên khác khi bạn nhấn nút quay lại bạn đi đến launcher
ademar111190

Làm thế nào để đạt được hộp thoại hệ thống n thông báo thanh tàn tật thông qua mã
Gnanam R

1
@GnanamR: kiểm tra câu trả lời của tôi tại: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

@Rinkalkumar Chạy ứng dụng ở chế độ toàn màn hình.
John61590,

17

Bạn có thể tùy chỉnh điều này (vô hiệu hóa quyền truy cập vào menu, giới hạn thêm ứng dụng, v.v.) để kích hoạt kiosk. http://code.google.com/p/android-launcher-plus/


7
Tôi có thể biết tại sao điều này bị phản đối không? Tôi đã viết ứng dụng Android kiosk chính thức, hiện đã được triển khai của mình bằng cách chỉnh sửa và phát triển trên android launcher plus.
rbot 10/12/12

1
Trong trường hợp đó, tôi ủng hộ cả câu trả lời của bạn và nhận xét của bạn ;-)
Mawg nói hãy khôi phục Monica vào

@rbot bạn đã làm điều đó như thế nào? Tôi đã cố gắng xây dựng một ứng dụng kiosk cho nhiều lứa tuổi và tôi đã giải quyết gần như mọi thứ khác ngoại trừ việc đảm bảo khay thông báo không mở.
Wakka02

1
@ Wakka02 Tôi nghĩ rằng tôi đang tìm kiếm sự kiện onwindowchanged hoặc một số sự kiện tương tự (có thể cho biết đang mở Khay thông báo) và đóng khay. Mình đã làm cách đây khá lâu rồi nên không nhớ chi tiết cụ thể.
rbot

@ Wakka02: kiểm tra câu trả lời của tôi tại: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

17

Trong bản Android L Preview mới, Google đã công bố tính năng Khóa tác vụ , thực hiện chính xác điều đó. Tuy nhiên, nó dường như cần root.

Bản xem trước dành cho nhà phát triển L giới thiệu một API khóa tác vụ mới cho phép bạn tạm thời hạn chế người dùng rời khỏi ứng dụng của bạn hoặc bị gián đoạn bởi các thông báo. Ví dụ: điều này có thể được sử dụng nếu bạn đang phát triển một ứng dụng giáo dục để hỗ trợ các yêu cầu đánh giá mức cổ phần cao trên Android. Sau khi ứng dụng của bạn kích hoạt chế độ này, người dùng sẽ không thể xem thông báo, truy cập các ứng dụng khác hoặc quay lại Màn hình chính cho đến khi ứng dụng của bạn thoát khỏi chế độ này.

Để ngăn việc sử dụng trái phép, chỉ những ứng dụng được phép mới có thể kích hoạt khóa tác vụ. Hơn nữa, ủy quyền khóa tác vụ phải được cấp bởi ứng dụng dành cho chủ sở hữu thiết bị được định cấu hình đặc biệt thông qua android.app.admin.DevicePolicyManager.setLockTaskComponents()phương thức này.

Để thiết lập chủ sở hữu thiết bị, hãy làm theo các bước sau:

  • Đính kèm thiết bị chạy bản userdebugdựng Android vào máy phát triển của bạn.
  • Cài đặt ứng dụng chủ sở hữu thiết bị của bạn.
  • Tạo một device_owner.xmltập tin và lưu nó vào /data/systemthư mục trên thiết bị.
$ 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

Trước khi sử dụng API khóa tác vụ trong ứng dụng của bạn, hãy xác minh rằng hoạt động của bạn được ủy quyền bằng cách gọi DevicePolicyManager.isLockTaskPeriled ().

Để kích hoạt khóa tác vụ, hãy gọi android.app.Activity.startLockTask() từ hoạt động được ủy quyền của bạn.

Khi khóa tác vụ đang hoạt động, hành vi sau có hiệu lực:

  • Thanh trạng thái trống và thông báo của người dùng và thông tin trạng thái bị ẩn.
  • Các nút Trang chủ và Ứng dụng gần đây bị ẩn.
  • Các ứng dụng khác có thể không khởi chạy các hoạt động mới.
  • Ứng dụng hiện tại có thể bắt đầu các hoạt động mới, miễn là làm như vậy không tạo ra nhiệm vụ mới.
  • Người dùng vẫn bị khóa trên ứng dụng của bạn cho đến khi một hoạt động được ủy quyền gọi đến Activity.stopLockTask().

3
developer.android.com/guide/topics/admin/device-admin.html - về việc triển khai Ứng dụng quản trị thiết bị.
Toshe

2
Đây là bài viết của tôi về Khóa tác vụ với đầy đủ thiết lập algoritm pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan

9

Sau khi tìm kiếm điều này trong một thời gian, tôi đã đưa ra một giải pháp tốt. Mặc dù vậy, tính năng này chỉ hoạt động trên các thiết bị đã root, nhưng tôi đoán nếu nó chỉ dành cho một ứng dụng này thì việc root nó sẽ không thành vấn đề.

Ngoài ra, hãy xem http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ để biết cách khác


5

Khởi động ứng dụng của bạn khi khởi động

cách TỐT NHẤT để thực hiện điều này là đặt ứng dụng của bạn làm trình khởi chạy

<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>

Khóa ứng dụng của bạn

cách đáng tin cậy nhất là sử dụng thiết bị có Lollipop trở lên và tận dụng

startLockTask

trước tiên, bạn phải đặt ứng dụng của mình làm chủ sở hữu thiết bị. NB thiết bị của bạn phải được cấp phép: nếu bạn đã đăng ký, bạn nên khôi phục cài đặt gốc và bỏ qua đăng ký tài khoản.

để có thể đăng ký ứng dụng của mình, trước tiên bạn phải thiết lập thành phần 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!
    }
}

khi bạn có một thiết bị chưa được cấp phép, bạn có thể khởi chạy lệnh sau từ adb ( không cần root )

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

để tránh việc android yêu cầu quyền người dùng ghim ứng dụng của bạn, bạn phải gọi setLockTaskPackages

cuối cùng!

@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();
}


3

Thiết lập thiết bị một mục đích Trang của nhà phát triển Android đã mô tả những điều này, bạn có thể dễ dàng biết thêm nhiều điều từ đó.

Giờ đây, có thể dễ dàng định cấu hình các thiết bị Android 6.0 Marshmallow trở lên làm thiết bị sử dụng một lần (COSU) do công ty sở hữu.


2

Tìm thấy một kỹ thuật khả thi khác trong bài đăng trên diễn đàn này . Trích dẫn bài đăng đó:

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

Sử dụng các phương pháp sau, bạn có thể xây dựng một ứng dụng ngăn người dùng "thông thường" chơi với bất kỳ thứ gì khác ngoài ứng dụng của bạn.

Ứng dụng này được làm bằng hai mô-đun. Hoạt động chính và một dịch vụ. Dịch vụ được cấu hình để bắt đầu khi khởi động. Khi dịch vụ được khởi động, nó sẽ kiểm tra xem hoạt động có đang chạy hay không. Nếu nó không chạy, nó sử dụng bộ hẹn giờ để bắt đầu hoạt động chính.

Khi hoạt động bị tạm dừng, nó sẽ lập lịch để dịch vụ bắt đầu sau một giây:

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

Nếu người dùng nhấn vào màn hình chính, màn hình chính sẽ xuất hiện trong vài giây. Tuy nhiên, ứng dụng của bạn sẽ trở lại mặt trước sau một vài giây và người dùng sẽ không thể tương tác với bất kỳ ứng dụng nào khác hoặc thay đổi cài đặt.

Dịch vụ này được thiết lập để trở thành một dịch vụ tiền cảnh. Điều này ngăn không cho Android giết chết dịch vụ của chúng tôi. Nhấn vào nút Dừng để tắt chế độ kiosk.

Có vẻ như cũng có một tệp ZIP code ở chế độ kiosk mẫu để tải xuống .


2

Xposed framework có thể làm được điều này. Nó cần root và có khả năng nó sẽ không hoạt động trên mọi nền tảng. Tìm phương thức disable () trong lớp android.app.StatusBarManager .

Đây trong mã nguồn Android

Xem ở đây về cách viết mô-đun của riêng bạn: Hướng dẫn phát triển Xposed

Nó dễ dàng hơn nhiều so với bạn nghĩ ở cái nhìn đầu tiên. Chúc may mắn!


Bất kỳ mô-đun Xposed nào mà bạn nghĩ làm được điều này?
Firelord

0

Cùng với việc thiết lập ứng dụng của bạn với bộ thu BOOT và câu trả lời này để ngăn chặn mở rộng thanh trạng thái, giải pháp này hoạt động trên 4.4 trở lên như một ứng dụng kiosk hoàn chỉnh:

Đặt vào onCreate () của bạn:

    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);
                        }
                    }
                });
    }

Thao tác này sẽ ẩn hoàn toàn nút quay lại, ứng dụng và nút trang chủ.


còn thanh thông báo thì sao?
Elshan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.