2012-05-29 37 views
6

Tôi đang phát triển một ứng dụng cần có tài khoản Google cho các tùy chọn nhất định. Tùy chọn bị tắt khi không có tài khoản nào được phát hiện, nhưng tôi trình bày cho người dùng thêm tài khoản bằng cách yêu cầu qua cửa sổ bật lên, nếu người dùng nhấp vào có, hoạt động sẽ bắt đầu. Nó hoạt động tốt để hiển thị trang "Thêm tài khoản" toàn cầu, nhưng tôi muốn bỏ qua bước đó chưa được thêm cho bước bổ sung. Sau khi tất cả, tại sao người nào đó có tùy chọn thêm tài khoản Exchange nếu cần tài khoản Google, điều đó chỉ gây nhầm lẫn. Vì vậy, tôi muốn đặt mặc định thành trang thiết lập tài khoản Google mới.Bắt đầu lập trình hoạt động 'Thêm tài khoản Google' theo cách lập trình trong Android

Java

try { 
    Intent intent = new Intent(); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.setClassName("com.google.android.gsf", "com.google.android.gsf.login.AccountIntroActivity"); 

    //if(getApplicationContext().getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) { 
     getApplicationContext().startActivity(intent); 
    //} else { 
     //getApplicationContext().startActivity(new Intent(Settings.ACTION_ADD_ACCOUNT).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 
    //} 
} catch (ActivityNotFoundException e) { 
    e.printStackTrace(); 
} 

Khi tôi chạy này, exeception sau được ném:

05-29 18: 24: 50,741: W/System.err (10.875): android.content .ActivityNotFoundException: Không thể tìm thấy lớp hoạt động rõ ràng {com.google.android.gsf/com.google.android.gsf.login.AccountIntroActivity}; bạn đã tuyên bố hoạt động này trong tệp AndroidManifest.xml của mình chưa?

AndroidManifest.xml

<activity 
     android:name="com.google.android.gsf.login.AccountIntroActivity"/> 

HỎI: những gì tôi thiếu ở đây?

EDIT:

Tôi đã thử một cách khác nhau sử dụng addAccount, điều này không làm việc, không có gì xảy ra, không có lỗi được ném, không có hoạt động mới bắt đầu để thêm tài khoản Google. Nhân tiện, toàn bộ khối try try trong phiên bản gốc là trong một AlertDialog/listener.

AccountManager acm = AccountManager.get(); 
acm.addAccount("com.google", null, null, null, null, null, null);   

Trả lời

6

Ok, sự cố khi sử dụng cách quản lý tài khoản là ngữ cảnh hoạt động không được tôi sử dụng trong cuộc gọi phương thức hoặc không chính xác. Căn cứ vào thực tế nó đã được sử dụng trong một DialogInterface, công trình này:

private void popup() { 
    AlertDialog.Builder helpBuilder = new AlertDialog.Builder(this); 
    helpBuilder.setTitle("Add Gmail account"); 
    helpBuilder.setMessage("These options rely on a Gmail account, but you 
    don't seem to have one configured. Would you like to configure one now?"); 

    helpBuilder.setPositiveButton("Yes", 
    new DialogInterface.OnClickListener() { 
     //@Override 
     public void onClick(DialogInterface dialog, int which) { 
      //try/ catch block was here 
      AccountManager acm = AccountManager.get(getApplicationContext()); 
      acm.addAccount("com.google", null, null, null, thisclassname.this, 
      null, null); 
      } 
    }); 

    helpBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // close the dialog, return to activity 
     } 
    });  

    AlertDialog helpDialog = helpBuilder.create(); 
    helpDialog.show(); 
}//end method 

này có lẽ cần một số công việc nhiều hơn để có thể thực sự sử dụng tên tài khoản cấu hình, nhưng bây giờ, đây trả lời cho Q.

Đáng buồn thay, điều này đòi hỏi sự cho phép, nhưng tôi đoán đó là cách mọi thứ là

+0

Tôi cảm thấy như một d ***, nhưng tôi đoán tôi phải gắn cờ câu trả lời của riêng tôi như đã trả lời ngay bây giờ. Cảm ơn tất cả sự kiên nhẫn và giúp đỡ của bạn @Nikolay Elenkov! – slinden77

+0

Có phải "thisclassname" là một lớp thực tế không? –

4

Bạn đang cố gắng sử dụng API riêng tư - tên lớp của hoạt động thêm tài khoản Google có thể thay đổi hoặc có thể khác trên các phiên bản Android khác nhau. Nó nằm trong một trong các gói dịch vụ của Google và bạn chắc chắn không nên thêm tên của nó vào tệp kê khai của bạn. Trong ngắn hạn, đây là một hack, không làm điều đó. Không AccountManager.addAcount("com.google",...) có phù hợp với bạn không (bạn cần sự cho phép của MANAGE_ACCOUNTS)?

+0

Tôi biết bạn nói đúng, nhưng tôi vẫn thích cách của tôi hơn. Tôi đã thử phương thức addAccount, nhưng thẳng thắn, nó không hoạt động cho tôi. Bên cạnh đó, điều này đòi hỏi một sự cho phép thêm, mà đối với tôi có vẻ vô nghĩa. Tôi có thể hiểu quyền này cho phương thức addAccountExplicitly, vì điều này sẽ thêm một tài khoản, nhưng tất cả addAccount đều gọi một hoạt động mới, xử lý nó, không có gì được quản lý/sửa đổi/tạo ra bởi chính ứng dụng đó. Nhưng hãy giả sử tôi thay đổi ý định của tôi, bạn có thể đăng một ví dụ mà nên làm việc? Tôi đã thử nó, với loại com.google và phần còn lại của null, không làm việc – slinden77

+0

Tôi thấy quan điểm của bạn, nhưng bạn thực sự là _adding_ một tài khoản, mặc dù tương tác với người dùng, do đó, nó có ý nghĩa.Tôi biết nó có thể đánh lừa một số người dùng mặc dù. Tôi sẽ phải kiểm tra lại, nhưng IIRC, miễn là bạn có sự cho phép, "com.google" và phần còn lại 'null' sẽ hoạt động. Lỗi gì bạn nhận được. –

+0

Bạn nói đúng, trang web dành cho nhà phát triển Android nêu rõ các quyền được yêu cầu để khởi chạy hoạt động mới. Tôi đã loại bỏ được sự cố của mình bằng cách thay đổi intent.setClassName (com.google.android.gsf, ...) thành (com.google.android.gsf.login). Đầu mối của tôi là trong giao diện điều khiển, nơi tôi đã cố gắng tìm ra những gì đang xảy ra khi tôi sử dụng bước bổ sung, trang thêm tài khoản toàn cầu. Bây giờ tôi có một vấn đề mới, nó yêu cầu tôi cho một mật khẩu và hiển thị một lỗi ngay lập tức về việc không thể giao tiếp với các máy chủ của Google. Tôi không nhận được lỗi khi tôi sử dụng phương thức addAccount ... nhưng nó vẫn không hoạt động ... thx! – slinden77

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