Android系統開發 獲取userId

前言

  userId是Android4.2之後的版本的新功能,多用戶概念下的產物。用來確定當前使用設備的用戶id。此功能可以在原生設置-系統-高級-多用戶中查看到。如果你想驗證id的變化可以通過創建新用戶後切換用戶。

  一般應用開發的情況下,我們是不會使用到這種功能的。但是在系統開發的情況下處理設置相關功能會涉及到此功能。一些framework庫與settingslib庫的api需要我們傳入當前用戶的userId。userId一共有三種獲取方式,下面會一一舉例

通過反射UserHandle的系統方法myUserId獲得

public static int getCurrentUserId() {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        try {
            @SuppressLint("DiscouragedPrivateApi") final Method m = android.os.UserHandle.class.getDeclaredMethod("myUserId");
            m.setAccessible(true);
            final Object o = m.invoke(null);
            if (o instanceof Integer) {
                return (Integer) o;
            }
        } catch (Exception ignored) {
        }
    }
    return -1;
}

通過反射ActivityManager的getCurrentUser方法獲取

注意!getCurrentUser方法是系統級API,所以反射此方法需要系統簽名

public static int getCurrentUserId2() {
    try {
        @SuppressLint("DiscouragedPrivateApi") final Method m = android.app.ActivityManager.class.getDeclaredMethod("getCurrentUser");
        m.setAccessible(true);
        final Object o = m.invoke(null);
        if (o instanceof Integer) {
            return (Integer) o;
        }
    } catch (Exception ignored) {
    }
    return -1;
}

最簡單的方法通過android.os.Process獲取

public static int getCurrentUserId3(){
    return android.os.Process.myUid()/100000;
}

這方式感覺有點莫名其妙?爲什麼要除以100000?其實只要閱讀一下UserHandle的myUserId源碼立刻能明白,下面貼出源碼。 但是,個人是建議反射UserHandle獲得userId,因爲怕asop搞幺蛾子在後續版本上改掉數值。

源碼1

源碼2

 

End

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章