2013-02-07 125 views
6

我正在開發具有多用戶功能的平板電腦的最新Android版本(4.2.1 API-17級)的應用程序。Android用戶管理器:檢查用戶是否擁有者(管理員)

我要限制某些功能(如訪問該應用偏好)到平板電腦的擁有者(即誰可以添加和刪除其他用戶帳戶的用戶)

有沒有什麼辦法可以找到如果當前用戶是業主?

我通過UserManager和UserHandle API文檔讀取,但找不到允許我檢查它的函數。

我錯過了什麼或有另一種方式來做到這一點?

回答

9

類似,但沒有反映版本:

static boolean isAdminUser(Context context) 
{ 
    UserHandle uh = Process.myUserHandle(); 
    UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); 
    if(null != um) 
    { 
     long userSerialNumber = um.getSerialNumberForUser(uh); 
     Log.d(TAG, "userSerialNumber = " + userSerialNumber); 
     return 0 == userSerialNumber; 
    } 
    else 
     return false; 
} 
+0

好........... –

+0

注:這需要minSdk 17 –

+0

OU可以通過使用全球系統服務的定義,使得userManager和其他可用的Android系統服務在科特林代碼的任何地方進一步降低樣板是否也可以檢查爲哪些用戶安裝了哪些應用程序? –

2

經過進一步研究,我發現多用戶api功能尚未實現,它不能真正用於任何事情。有一個黑客雖然檢查,如果用戶使用的是反射店主:

public boolean isCurrentUserOwner(Context context) 
{ 
    try 
    { 
     Method getUserHandle = UserManager.class.getMethod("getUserHandle"); 
     int userHandle = (Integer) getUserHandle.invoke(context.getSystemService(Context.USER_SERVICE)); 
     return userHandle == 0; 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 

這對我的作品的的Nexus 7和Nexus 10採用Android 4.2.1 它非常髒。所以我wouldnt建議使用它,除非你正在做一個應用程序多數民衆贊成裝置和具體

0

可以在科特林創建一個擴展屬性,使其更簡單:

val UserManager.isCurrentUserDeviceOwner: Boolean 
    get() = if (SDK_INT >= M) isSystemUser 
    else if (SDK_INT >= 17) getSerialNumberForUser(Process.myUserHandle()) == 0L 
    else true 

然後,使用它是如以下那樣簡單:

val userManager = context.getSystemService(Context.USER_SERVICE) 
if (userManager.isCurrentUserDeviceOwner) TODO() else TODO() 

ÿ https://gist.github.com/LouisCAD/a7c3aabd0fa62e0c51e8fe0b53c37cbb

相關問題