2012-05-18 37 views
14

Tôi đang làm việc trên một ứng dụng Android sử dụng AccountManager để lưu trữ thông tin đăng nhập &. Một vấn đề tôi gặp phải là mặc dù tôi chuyển một loạt các giá trị String vào gói dữ liệu addAccountExplicitly của AccountManager.AccountManager getUserData trả về null mặc dù nó được đặt

Tôi đã kiểm tra để đảm bảo rằng gói là không rỗng và rằng nó chứa giá trị trước khi thêm tài khoản. Và hầu hết thời gian này là trường hợp, nhưng mỗi một lần trong một thời gian tôi nhận được null khi tôi truy vấn các giá trị này.

Giá trị trả lại null thường phổ biến hơn sau khi tôi vừa xóa tài khoản và thêm lại.

tôi đang làm truy vấn của tôi bên trong onAccountsUpdated phương pháp của một thực hiện OnAccountsUpdateListener, vì vậy tài khoản nên được bổ sung và tốt để đi, phải không?

Nhờ sự giúp đỡ

AuthenticatorActivity

// in the AuthenticatorActivity 
Bundle userData = new Bundle(); 
userData.put (k1, v1); 
userData.put (k2, v2); 
userData.put (k3, v3); 
userData.put (k4, v4); 
userData.put (k1, v1); 

Account a = new Account ("acc name", "com.account.type"); 
AccountManager am = AccountManager.get(this); 

OnAccountsUpdateListener listener = new OnAccountsUpdateListener() { 

     @Override 
     public void onAccountsUpdated(Account[] accounts) { 
      Account mine = findAccount(accounts, account); // match account name 
      notifySignedIn(mine); // tell the world you're signed in 
      am.removeOnAccountsUpdatedListener(this); 
     } 
    }; 

am.addOnAccountsUpdatedListener(listener, handler, false); 
am.addAccountExplicitly(a, "themostsecurepwintheworld", userData); 

Một số chủ đề khác

AccountManager am = AccountManager.get(mContext); 
final string value2 = am.getUserData(mAccount, k2); 

if (TextUtils.isEmpty(value2)) { 
    Log.d("WTF", "value is empty"); 
} 
+1

Một số mã xin vui lòng. – kichik

+0

Có quá nhiều mã để sao chép + pase, nhưng tôi sẽ chỉnh sửa câu hỏi bằng một số mã cơ bản. Có rất nhiều đồng thời và luồng, nhưng tất cả mọi thứ được bắt đầu thông qua _onAccountsUpdatedListener_. – copolii

Trả lời

8

tôi biết một lỗi trong Honeycomb cộng có thể gây ra vấn đề của bạn. Nếu bạn cố gắng để getUserData của tài khoản trước khi nó được đăng ký tất cả các cuộc gọi getUserData tiếp theo sẽ trả về null.

Nếu bạn xem mã. AccountManager có bộ nhớ đệm trong bộ nhớ được hỗ trợ bởi cơ sở dữ liệu sqlite. Gọi getUserData sẽ điền dữ liệu người dùng bộ nhớ cache trong bộ nhớ, ngay cả khi nó chưa được đăng ký. Nếu nó không được đăng ký, nó sẽ giải thích rằng không có userdata. Việc đăng ký một tài khoản chỉ điền vào cơ sở dữ liệu và không làm mất hiệu lực kho lưu trữ trong bộ nhớ.

Điều này có thể gây ra sự cố của bạn.

Giải pháp thay thế là xóa tài khoản trước khi gọi addAccountExplicitly.

Sự cố này gây ra sự cố và là một lỗi HUGE trong AccountManger IMO và cho phép các bên thứ ba thực thi DOS ứng dụng của bạn.

+0

Cảm ơn. Tôi đã kể từ khi thiết kế lại mã để có được nó, nhưng nếu tôi nhớ chính xác nó đã xảy ra trên các thiết bị pre-honeycomb cũng như các thiết bị ICS quá (Nexus 1, Nexus S, HTC Evo, Samsung Skyrocket, và một vài hơn). – copolii

+0

Xin chào, bạn đã viết mã như thế nào? – fr1550n

+0

gọi removeAccount trên tài khoản của bạn trước khi gọi addAccountExplicitly. Đồng thời kiểm tra xem tài khoản đó có tồn tại trước khi gọi getUserData – Bishnu

3

Bạn đang sử dụng một thiết bị HTC với Android 4? Tôi nhận được nhiều báo cáo về vấn đề này từ người dùng ứng dụng đồng bộ hóa của tôi. Tất cả trong số họ đã sử dụng thiết bị HTC có cấp SDK 15.

Trông giống như lỗi HTC cho tôi.

Một số người dùng báo cáo rằng sự cố đã biến mất sau khi khởi động lại.

Cập nhật: Trong khi đó chúng ta tìm thấy một workaround thích hợp, xem https://stackoverflow.com/a/29776224/1558654

+0

Tài khoản trước đóNhững người dùng đã được hỗ trợ một cách ngây thơ bởi một cơ sở dữ liệu sqlite (tất cả các cuộc gọi được đọc từ đĩa). Điều này đã được thay đổi trong HoneyComb, tuy nhiên bộ nhớ cache trong bộ nhớ có lỗi. Khởi động lại thiết bị sẽ xóa bộ nhớ cache trong bộ nhớ và cho phép thiết bị đọc từ đĩa (và do đó dữ liệu người dùng ban đầu do người dùng đặt). – Bishnu

+0

Tôi đã nhận được khoảng 25 báo cáo về sự cố này từ người dùng HTC và ** không có báo cáo ** từ người dùng không phải HTC. Điều đó không giống như trùng hợp với tôi. – Marten

+0

Điều này không giới hạn ở các thiết bị HTC. Thiết bị thử nghiệm chính của tôi là Nexus S chạy 2.3.7, CM7, 4.0.4 và CM9. Nó cũng đã xảy ra với các mức độ khác nhau trên các thiết bị khác. – copolii

0

Tôi gặp sự cố tương tự, nhưng sự cố của tôi hóa ra là cố lưu trữ giá trị userData dài thay vì Chuỗi. Chuyển đổi của tôi dài thành một chuỗi để lưu trữ, và phân tích nó thành một lần nữa một lần nữa khi kéo nó ra đã làm các trick cho tôi.

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