2012-01-12 26 views
9

Tôi đã triển khai trình xác thực tài khoản của mình và dịch vụ và toàn bộ giao dịch và tất cả đều có vẻ hoạt động tốt.Không cho phép nhiều tài khoản trong AccountManager

Tuy nhiên, có một vấn đề nhỏ: Tôi chỉ muốn một tài khoản duy nhất cho ứng dụng của mình tồn tại trong trình quản lý tài khoản, nhưng dường như không thể tìm cách giới hạn điều này.

Giải pháp duy nhất của tôi là thực hiện tìm kiếm và xóa tài khoản hiện tại (theo loại) trước khi thêm tài khoản mới?

mã hiện tại của tôi:

private void removeAccounts() 
{ 
    Account [] accounts = mAcctMgr.getAccountsByType (mAccountType); 

    if (accounts.length == 0) return; 

    final Handler handler = new Handler(); 

    AccountManagerCallback<Boolean> callback = new AccountManagerCallback<Boolean>() 
    { 
     @Override 
     public void run(AccountManagerFuture<Boolean> arg0) 
     { 
      // nada 
     } 
    }; 

    for (Account a : accounts) { 
     mAcctMgr.removeAccount (a, callback, handler); 
    } 
} 

tôi không bằng bất kỳ phương tiện gọi đây là một giải pháp tao nhã, nhưng tại thời điểm này có vẻ là điều duy nhất mà hoạt động.

+0

Điều gì nói chống lại việc tìm kiếm tài khoản và xóa hoặc ghi đè nếu đã tồn tại một –

+3

Vì nếu có cách giới hạn tài khoản thành một tài khoản, thì rõ ràng đó là cách * thích hợp để thực hiện. Bạn đã làm điều này chưa? Tôi không thể ghi đè tài khoản, khi bạn tải tài khoản, các trường là cuối cùng. Xóa là không đồng bộ và sử dụng giao diện không phải là tất cả tài liệu. Việc để trống phương thức giao diện dường như hoạt động, nhưng vì những lý do hiển nhiên, tôi không muốn làm điều đó. – copolii

+0

Tôi đã sử dụng AccountManager và tôi không biết cách nào khác để hạn chế tài khoản thành một tài khoản duy nhất. Tôi nghĩ bạn nên nhắc người dùng bằng một hộp thoại nếu anh ta muốn xóa người cũ và sau đó để anh ta tạo một cái mới. Tôi không nghĩ rằng có một cách thanh lịch hơn để làm điều đó. –

Trả lời

5

Trong hàm addAccount của lớp Authenticator (lớp mở rộng AbstractAccountAuthenticator), trước tiên hãy kiểm tra xem tài khoản có tồn tại hay không. Nếu một tài khoản đã tồn tại, chỉ cần trả về null (Và có thể hiển thị một thông báo chúc mừng). Nếu không có tài khoản, chỉ cần trả lại gói như bạn đã làm trước đây.

 if(AccountHelper.accountExists(mContext)) { 
     mHandler.post(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(mContext, "Only one account allowed", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     return null; 
    } 
+4

Trả về null trên addAccount: "null nếu kết quả được trả về thông qua phản hồi". Bạn có thể chụp thông báo Bánh mì nướng nhưng phải trả lại Gói với: "KEY_ERROR_CODE và KEY_ERROR_MESSAGE để cho biết lỗi". [AbstractAccountAuthenticator] (http://developer.android.com/reference/android/accounts/AbstractAccountAuthenticator.html) – SysHex

+0

Làm cách nào để kiểm tra xem tài khoản có tồn tại không? –

12

mỗi sự javadocs for addAccount(), nếu một điều kiện lỗi xảy ra khi tạo tài khoản, bạn nên trả về một bó có chứa các thông số KEY_ERROR_CODEKEY_ERROR_MESSAGE,

if (accountExists) { 
     final Bundle result = new Bundle(); 
     result.putInt(AccountManager.KEY_ERROR_CODE, ERROR_CODE_ONE_ACCOUNT_ALLOWED); 
     result.putString(AccountManager.KEY_ERROR_MESSAGE, context.getString(R.string.one_account_allowed)); 

     handler.post(new Runnable() { 

      @Override 
      public void run() { 
       RepeatSafeToast.show(context, R.string.one_account_allowed); 
      } 
     }); 
     return result; 
    } 

Trở nullkhông nghĩa thất bại, nó có nghĩa là kết quả sẽ được truyền thông qua tham số đáp ứng theo phương thức addAccount().

+1

Tuy nhiên, nó không hiển thị 'Toast' – Manjunath

+0

Làm cách nào để tôi giải quyết cho tài khoảnExists? Tôi không biết cách phát hiện xem một Loại tài khoản cụ thể có tồn tại trong Trình quản lý tài khoản Android hay không. –

0

Liên kết đó cho biết cách đổi tên tài khoản, có thể tương đương với yêu cầu của bạn renameAccount on developer.Android. Tuy nhiên nó chỉ có sẵn từ API cấp 21. Nếu ai đó có một cách để làm cho nó cho các thiết bị trước đó, xin vui lòng chia sẻ!

Các vấn đề liên quan