Android 一體機模式:規則限制


Android Kiosk Mode: Rules for Restrictions

生活中我們隨處都可見到一體機,當然了我們在這談論的并不是賣冰激凌和檸檬水的售貨一體機,我們這篇文章是關于交互式信息一體機的。

電腦的終端就是一個典型的信息一體機,用戶可以使用它來執行一組有限的動作。其它常見的例子還有如 ATM 機、照相亭、自動售票機、自助登機服務終端系統、等等。

交互式信息一體機使用了各種技術:觸摸屏、紙幣識別器、相機、打印機、掃描儀、Wi-Fi、NFC 等等。它們的共同特點是對未經授權的活動有強有力的保障體系。這樣的終端下使用的軟件不允許用戶去改變系統的設置,重置或安裝其它應用程序。

移動一體機

移動技術 的快速發展也使一體機有了革命性的發展。智能手機和平板電腦是現在常用的一體機。移動一體機跟標準的終端相比有很多明顯的優勢:由于緊湊的尺寸和大量生產而更加便宜,但是也有更多的功能。移動一體機在餐館中被用作電子菜單,在商店和展廳中的銷售助手等等。無論目的是什么,重要的是當一個移動設備提供一體機的功能為目的時它就不應該被用于任何其它目的。

Share to Twitter: Mobile kiosks have a number of significant advantages over standard terminals

為了使設備在一體機模式(kiosk mode,或說展臺模式)下工作,需要運行一個程序,此程序會凍結掉操作系統的常見功能且它不允許用戶退出程序。一體機的應用程序可能有一個秘密隱藏的管理面板或者從服務器控制的遠程配置。你也可以配置系統報告:程序會將有關用戶行為的數據發送給服務器,并將相關狀態通知給管理員。

下面,我們將分享一些我們在 Android 一體機應用程序 方面的經驗。我們也會討論下開發中的一些陷阱和解決方案。

Android一體機模式

把一臺 Android 設備變為一體機,這是鎖定其所有按鍵和連接器的好方法。在這種情況下,最普通也最有效的解決辦法是把你的設備放置在一個防爆盒或者一個專門的地方中,然而這可能都是不可選的方法。此外,狀態欄,系統對話框和虛擬小鍵盤仍然可以由任何用戶訪問,并且設置也可以更改。 你如何避免這些問題?

Android 5.0: 期待已久的 API

讓我們先說個好消息開始吧:Android 5.0 中已有鎖住屏幕 API 的介紹了。這個 API “pins”(別針)別住屏幕并阻止用戶離開所選的應用程序。該功能可用于為職員創建的一體機,開發用于評估和審查的教育應用。

當你激活了屏幕固定模式,用戶不會被系統對話框和通知所打斷,同時不能打開其它應用程序,也不能回到主屏幕,狀態欄也不再可見。

你可以通過設置或者軟件來激活這一模式

  • 在設置中(安全 -> 屏幕固定)開啟屏幕固定模式,選擇所需的應用并確認你的選擇。

  • 軟件中激活則調用 startLockTask() 方法并確認列入鎖定模式。

Android 5.0 之前如何做到兼容?

在早些的 Android SDK 中并沒有提供一體機模式,也沒有綜合全面的 API 來凍結系統。因此,所有的不同組件應分別鎖住而且在不同的版本中也是不同的方法。

定制操作系統可以大大的簡化一體機模式的實現,但是我們想介紹在 Android 5.0 版本下不使用特殊固件或者 root 權限的情況下如何凍結掉不需要的東西。

重啟

當設備被凍結時用戶首先想到的就是重啟設備了。我們的任務是確保平板電腦或者智能手機重啟后,一體機應用應該自動啟動。

這并不算難:在 Manifest 中聲明廣播接收器,重啟后接受信息的權限,然后還有寫個繼承 Broadcastreceiver 的子類使你的程序跑起來。

AndroidManifest.xml:

<receiver android:name=".BootReceiver">  
    <intent-filter >  
        <action android:name=  
             "android.intent.action.BOOT_COMPLETED"/>  
   </intent-filter>  
</receiver>  

<uses-permission  
 android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

BootReceiver.java :

public class BootReceiver extends BroadcastReceiver {  

  @Override  
  public void onReceive(Context context, Intent intent) {  
    Intent myIntent = new Intent(context, MyKioskModeActivity.class);  
    myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    context.startActivity(myIntent);  
  }  
}  

返回鍵

返回鍵則重寫如下方法。

@Override
public void onBackPressed() {  
    // here we do nothing  
}  

HOME 鍵

HOME 鍵并不能截獲,因此為阻止它被按下時返回主屏幕,我們指定一體機程序作為 Launcher。在 Manifest 中添加 3 行:

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

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

完成以上工作后,當你按下 HOME 鍵時,系統會彈個窗口讓你選擇一個 launcher 作為默認的,然后選擇我們的程序就好了,HOME 鍵這一部分也完成了!

電源鍵

電源鍵的問題是最多的,解決掉這些問題的一個辦法是把一體機程序窗口設置為鎖屏屏幕。然而這個方法只能保證在 Android 4.0 版本下的系統中使用。

@Override  
public void onAttachedToWindow() {  
    getWindow().addFlags(  
        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);  
    getWindow().addFlags(  
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);  
}     

系統對話框

長按 HOME 或電源鍵將會彈出系統對話框,這可以讓你退出程序。此外還有系統升級和低電量提示窗口,這對一體機也是危險的因為可以訪問到系統設置。

為了徹底擺脫系統彈框的困擾,推薦如下方法:當 Activity 失去焦點時,發送一個關閉所有系統對話框的廣播。

@Override  
public void onWindowFocusChanged(boolean hasFocus) {  
  super.onWindowFocusChanged(hasFocus);  
  if(!hasFocus) {  
    Intent closeDialog =   
          new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);  
    sendBroadcast(closeDialog);  
  }  
}  

虛擬鍵盤

在虛擬鍵盤中可能有一個設置按鍵。如果鍵盤是需要的,最好的解決方案是實現自己的版本或者整合現有的但須限制功能。

狀態欄

狀態欄中存在許多可以讓你退出程序的機會,所以你必須避免它。首先要做的就是讓你的程序在全屏模式下工作。

在 Android 4.0 下的系統中你也可以指定窗口的類型為 TYPE_SYSTEM_ALERT - 這種情況下一體機程序將會顯示在所有系統元素的頂部。

另一個方法是當狀態欄一出現時就隱藏掉,做這個工作需要到 Manifest 中申請相應權限。

<uses-permission  
        android:name="android.permission.EXPAND_STATUS_BAR"/>  

@Override  
public void onWindowFocusChanged(boolean hasFocus)<br>  
{  
   if(!hasFocus)  
   {  
           Object service  = getSystemService("statusbar");  
           Class<?> statusbarManager =   
              Class.forName("android.app.StatusBarManager");  
           Method collapse = <br>  
              statusbarManager.getMethod("collapse");  
           collapse .setAccessible(true);  
           collapse .invoke(service);  
   }  
}  

Android 4.1 開始你可以使用 SDK 中隱藏狀態欄的方法。

View decorView = getWindow().getDecorView();  
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;  
decorView.setSystemUiVisibility(uiOptions);  
ActionBar actionBar = getActionBar();  
actionBar.hide(); 

另一個比較流行的方法是創建一個透明的視圖對象,攔截掉狀態欄上的點擊操作。實現它要求視圖有 SYSTEM_ALERT_WINDOW 標識(flag)。

以上這些在 Android 中鎖定系統元素的技術內容僅僅是幾個可選的方案。為了開發出不被用戶破解的一體機應用,開發者門經常發現或發明新的方法并分享它們的經驗給其它開發者

與我們一起分享你在開發 Android 一體機程序的 tips 吧。你有用到我們上面說到的方法嗎或者你知道其它有用的黑科技方法嗎?


所屬標簽

無標簽

25选5玩法中奖