Android'de kiosk modu


114

Bir CF .NET kurumsal uygulamasının Android cihazlarda çalıştırılıp çalıştırılamayacağını ve nasıl taşınacağını değerlendirme sürecindeyim. Windows Mobile telefonlarındaki uygulama, uygulamanın başlatıldıktan sonra tam ekran modunda otomatik olarak başlatıldığı ve kullanıcıların yanlışlıkla veya isteyerek telefonun diğer bölümlerine erişemediği kiosk modunda çalıştırılır.

Android'de, önyüklemeden sonra tek bir uygulamanın otomatik olarak başlatılması ve kullanıcıların yanlışlıkla (veya isteyerek) Android cihazının diğer bölümlerine erişmesini engellemek mümkün müdür?


Problemini çözüyor musun?
Menna-Allah Sami

3
Evet mümkün. Bununla ilgili (çok) uzun bir blog yazısı oluşturdum: andreas-schrade.de/2015/02/16/…
funcoder

Ayrıca Lollipop'u kullanarak bununla ilgili (kısmen) bir blog yazısı oluşturdum - ancak önyükleme alıcısı kısmını hariç tutuyor: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi

Burada, kilitli tek kullanımlık cihazlar oluşturmak için farklı yöntemler hakkında benzer bir soruyu yanıtladım: stackoverflow.com/a/43644803/2888763
Trevor Halvorson

Yanıtlar:


29

android.intent.action.BOOT_COMPLETEDBir BroadcastReceiver'daki amacı dinleyerek ve oradan Aktivitenizi başlatarak önyükleme sırasında uygulamaları otomatik olarak başlatabilirsiniz. Aktivitede kendinizi yeni varsayılan ana ekran [1] olarak kaydedebilir ve tuşları kullanabilirsiniz.

Çerçeveyi değiştirmeden idare edemeyeceğiniz bazı durumlar olduğunu düşünüyorum (şu anda aktif Uygulamaları göstermek için Home'da longpress gibi) - Yine de yanılmış olabilirim.

Ancak yeterli olabilecek bir prototip için.

Tamir etmekte iyi eğlenceler!

[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
Ayrıca, başlatıcıya gittiğiniz geri düğmesine bastığınızda, başka bir ilk etkinliğin tekrar basılmasını geçersiz kılmanız gerekir
ademar111190

Sistem iletişim kutusu nasıl elde edilir n bildirim çubukları kodla devre dışı bırakılır
Gnanam R

1
@GnanamR: cevabımı şu adreste kontrol edin: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

@Rinkalkumar Uygulamayı tam ekran modunda çalıştırın.
John61590

17

Kiosk'u etkinleştirmek için bunu özelleştirebilirsiniz (menüye erişimi devre dışı bırakın, uygulama eklemeyi sınırlayın vb.). http://code.google.com/p/android-launcher-plus/


7
Bunun neden reddedildiğini öğrenebilir miyim? Tam teşekküllü, şu anda dağıtılmış olan Android kiosk uygulamamı, android launcher plus üzerinde düzenleyerek ve geliştirerek yazdım.
rbot

1
Bu durumda, hem cevabınızı hem de yorumunuzu
onaylıyorum

@rbot bunu nasıl yaptın? Yıllardır bir kiosk uygulaması oluşturmaya çalışıyorum ve hemen hemen her şeyi çözdüm, bildirim tepsisinin açılmamasını sağlamak dışında.
Wakka02

1
@ Wakka02 Sanırım pencere değiştirilmiş veya benzer bir olay arıyordum (muhtemelen Bildirim Tepsisinin açıldığını gösterebilir) ve tepsiyi kapatın. Uzun zaman önce yaptım, bu yüzden ayrıntıları hatırlamayın.
rbot

@ Wakka02: cevabımı şu adreste kontrol edin: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

17

Yeni Android L Önizlemesinde Google, tam olarak bunu yapan Görev Kilitlemeyi duyurdu . Bununla birlikte, kök ihtiyacı var gibi görünüyor.

L Developer Preview, kullanıcıların uygulamanızdan çıkmasını veya bildirimlerle kesintiye uğramasını geçici olarak kısıtlamanıza olanak tanıyan yeni bir görev kilitleme API'si sunar. Bu, örneğin, Android'de yüksek riskli değerlendirme gereksinimlerini desteklemek için bir eğitim uygulaması geliştiriyorsanız kullanılabilir. Uygulamanız bu modu etkinleştirdiğinde kullanıcılar, uygulamanız moddan çıkana kadar bildirimleri göremeyecek, diğer uygulamalara erişemeyecek veya Ana ekrana dönemeyecek.

Yetkisiz kullanımı önlemek için, yalnızca yetkili uygulamalar görev kilitlemeyi etkinleştirebilir. Ayrıca, görev kilitleme yetkisi, android.app.admin.DevicePolicyManager.setLockTaskComponents()yöntem aracılığıyla özel olarak yapılandırılmış bir cihaz sahibi uygulaması tarafından verilmelidir .

Bir cihaz sahibi ayarlamak için şu adımları izleyin:

  • userdebugGeliştirme makinenize Android derlemesi çalıştıran bir cihaz bağlayın .
  • Cihaz sahibi uygulamanızı yükleyin.
  • Bir device_owner.xmldosya oluşturun ve bunu /data/systemcihazdaki dizine kaydedin .
$ 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

Uygulamanızda görev kilitleme API'sini kullanmadan önce, DevicePolicyManager.isLockTaskPermitted () öğesini çağırarak etkinliğinizin yetkilendirildiğini doğrulayın.

Görev kilitlemeyi etkinleştirmek android.app.Activity.startLockTask() için yetkili faaliyetinizden arayın .

Görev kilitleme etkin olduğunda, aşağıdaki davranış etkili olur:

  • Durum çubuğu boştur ve kullanıcı bildirimleri ve durum bilgileri gizlidir.
  • Ana Sayfa ve Son Uygulamalar düğmeleri gizlidir.
  • Diğer uygulamalar yeni etkinlikler başlatmayabilir.
  • Mevcut uygulama, yeni görevler oluşturmadığı sürece yeni aktiviteler başlatabilir.
  • Yetkili bir etkinlik çağrılana kadar kullanıcı uygulamanızda kilitli kalır Activity.stopLockTask().

3
developer.android.com/guide/topics/admin/device-admin.html - Bir Cihaz Yönetici Uygulaması dağıtma hakkında.
Toshe

2
İşte tam kurulum algoritmasına sahip Görev Kilitleri ile ilgili makalem pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan

9

Bunu bir süre aradıktan sonra iyi bir çözüm buldum. Bu sadece köklü cihazlarda çalışıyor, ancak sanırım sadece bu tek uygulama içinse, o zaman köklendirme bir sorun olmamalı.

Ayrıca başka bir yol için http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ adresine bakın


5

Uygulamanızı önyüklemede başlatma

Bunu başarmanın EN İYİ yolu, uygulamanızı başlatıcı olarak ayarlamaktır

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

Uygulamanızı kilitleme

en güvenilir yol, Lollipop veya üstü bir cihazı kullanmak ve

startLockTask

öncelikle uygulamanızı cihaz sahibi olarak ayarlamalısınız. NB cihazınızın temel hazırlığı yapılmamış olmalıdır: Eğer cihazınızı kaydettirdiyseniz fabrika ayarlarına sıfırlamanız ve hesap kaydını atlamanız gerekir.

uygulamanızı kaydettirebilmek için önce bir DeviceAdminReceiver bileşeni kurmanız gerekir:

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

Hazırlanmamış bir cihaza sahip olduğunuzda, aşağıdaki komutu adb'den başlatabilirsiniz ( kök gerekmez )

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

android'in uygulamanızı sabitlemek için kullanıcı izinlerini istemesini önlemek için setLockTaskPackages

en sonunda!

@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

Tek Amaçlı Cihazları Kurma Android geliştiricisinin Sayfası , buradan daha fazla şeyi kolayca öğrenebileceğiniz bu şeyleri açıkladı.

Artık Android 6.0 Marshmallow ve sonraki sürümleri şirkete ait, tek kullanımlık (COSU) cihazlar olarak yapılandırmak çok kolay .


2

Bu forum gönderisinde başka bir olası teknik buldum . O gönderiden alıntı yapmak:

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

Aşağıdaki yöntemleri kullanarak, "normal" kullanıcıların uygulamanız dışında herhangi bir şeyle oynamasını engelleyecek bir uygulama oluşturabilirsiniz.

Uygulama iki modülden oluşmaktadır. Ana faaliyet ve bir hizmet. Hizmet, önyüklemede başlayacak şekilde yapılandırılmıştır. Servis başlatıldığında, aktivitenin çalışıp çalışmadığını kontrol eder. Çalışmıyorsa, ana etkinliği başlatmak için bir zamanlayıcı kullanır.

Etkinlik duraklatıldığında, hizmeti bir saniye içinde başlayacak şekilde planlar: Kod:

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

Kullanıcı ana ekranda basarsa, ana ekran birkaç saniye görünecektir. Ancak uygulamanız birkaç saniye sonra öne dönecek ve kullanıcı başka hiçbir uygulama ile etkileşime giremeyecek veya ayarları değiştiremeyecektir.

Hizmet, bir ön plan hizmeti olacak şekilde ayarlanmıştır. Bu, Android'in hizmetimizi sonlandırmasını engeller. Kiosk modunu devre dışı bırakmak için Durdur düğmesine basın.

Bir olduğu görülmektedir indirilebilir örnek kiosk modu kod ZIP dosyası da.


2

Xposed çerçevesi bunu yapabilir. Root'a ihtiyacı var ve her platformda çalışmama ihtimali var. Android.app.StatusBarManager sınıfında disable () yöntemini arayın .

İşte Android kaynak kodunda

Kendi modülünüzü nasıl yazacağınıza bakın: Xposed geliştirme eğitimi

İlk bakışta düşündüğünüzden çok daha kolay. İyi şanslar!


Bunu yaptığını düşündüğünüz herhangi bir Xposed modülü?
Firelord

0

Uygulamanızı bir BOOT alıcısı ile kurmanın yanı sıra ve durum çubuğu genişlemesini önlemek için bu yanıt , bu çözüm 4.4 ve üzerinde tam bir kiosk uygulaması olarak çalışır:

OnCreate () hesabınıza yerleştirin:

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

Bu, geri düğmesini, uygulamaları ve ana düğmeyi tamamen gizleyecektir.


peki ya bildirim çubuğu?
Elshan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.