2011-04-27 147 views
9

我編寫了一個代碼,使用getAuthToken()從賬戶管理器請求一個AuthToken。在第一次 - 用戶需要「允許」身份驗證,但稍後沒有必要。撤銷應用的帳戶權限

我想知道是否有撤銷該許可,使用Android系統或代碼,以幫助我調試我的程序(我跑出來的帳戶:))的方式。卸載該應用程序無濟於事。

謝謝

烏迪

回答

10

我發現,當你刪除並重新添加帳戶,由許可被撤銷,你必須再次允許它。

這是我發現,我這標誌着作爲答案,除非我會得到一個更好的一個最簡單的方法。

+0

刪除並重新添加帳戶,然後權限被撤銷......其錯誤! – 2015-04-13 07:24:04

+0

你是神。這是在查看完所有內容之後爲我工作的唯一方法。謝謝。 – 0x4B1D 2015-04-23 03:39:26

0

你可能需要做一個完整的卸載/重新安裝,以有效撤銷它。另外,如果您使用特定的sharedUserId,則可以在卸載後更改sharedUserId,使其看起來像不同的帳戶。最後,你可以用不同的證書籤名。這正是我能夠避開的,但是一個乾淨的API(甚至只是一個Activity)會很好。

+0

嗯,我也完全卸載/重裝,那沒沒有幫助。我也沒有使用sharedUserId。 – Udinic 2011-04-27 14:32:22

+0

是的,你可能需要嘗試設置sharedUserId來強制操作系統爲其分配一個不同的用戶ID。 – Femi 2011-04-27 14:34:46

0

我嘗試使用反射(僅用於測試目的)。 不幸的是,它拋出一個SecurityException因爲Android的檢查,來電者是一個系統的應用...

僅供參考,這裏是代碼:

/** 
    * Revoke the fact that current app is allowed to retrieve an authToken for an account. 
    * @param accountName The account whose permissions are being revoked 
    * @param context current context 
    * @return true if revoked successfully, false otherwise 
    */ 
    public static boolean revokeAppPermission(String accountName, Context context) { 
     if (accountName == null) { 
      Log.w(TAG, "revokeAppPermission: abort, account missing."); 
      return false; 
     } 

     AccountManager accountManager = AccountManager.get(context); 
     Account[] accounts = accountManager.getAccounts(); 
     Account accountToRevoke = null; 
     for (Account account : accounts) { 
      if (accountName.equals(account.name)) { 
       accountToRevoke = account; 
       break; 
      } 
     } 

     if (accountToRevoke == null) { 
      Log.w(TAG, "revokeAppPermission: abort, no account found."); 
      return false; 
     } 

     try { 
      // public void updateAppPermission(Account account, String authTokenType, int uid, boolean value) { 
      Method updateAppPermissionMethod = AccountManager.class.getDeclaredMethod("updateAppPermission", 
        Account.class, String.class, int.class, boolean.class); 
      updateAppPermissionMethod.setAccessible(true); 
      updateAppPermissionMethod.invoke(accountManager, // Instance to invoke the method on 
        accountToRevoke, // account 
        "oauth2:https://www.googleapis.com/auth/somegoogleservice", // authTokenType 
        context.getApplicationInfo().uid, // uid 
        false); // false to revoke 
     } catch (Exception e) { 
      Log.w(TAG, "revokeAppPermission: Failed:" + e.getMessage()); 
      e.printStackTrace(); 
      return false; 
     } 

     return true; 
    } 
相關問題