2015-12-15 15 views
13

Có thể tích hợp với Google Drive mà không cần tạo hoạt động của riêng mình hay không, thay vì chỉ sử dụng hoạt động hiện tại cho ứng dụng mà không gây ô nhiễm với mã liên quan đến Google Drive?Tích hợp Google Drive bằng hoạt động hiện tại

Tôi có một "dịch vụ" nền (không phải là dịch vụ Android - chỉ là một lớp học bất khả tri giao diện người dùng) có trách nhiệm tải một số dữ liệu từ Google Drive. Là một dịch vụ, nó không có kinh doanh thực sự là một hoạt động. Tuy nhiên, samples for Drive integration có ghi đè onActivityResult để xử lý tình huống cần xác thực. Tôi không chắc chắn làm thế nào tôi sẽ có được một tổ chức của thông tin này nếu dịch vụ của tôi không được thực hiện như là một hoạt động.

Giả sử tôi có thể tham chiếu đến Activity hiện tại từ "dịch vụ" của tôi, có cách nào để tôi có thể triển khai tích hợp Google Drive theo cách hoàn toàn khép kín không?

+0

làm ứng dụng của bạn có google plus đăng nhập –

+0

@war_Hero: um, tên đăng nhập là vụ phải được xúi giục bởi các API của Google Drive. Đó là loại điểm của câu hỏi của tôi - làm thế nào để xử lý một cách rõ ràng từ bên ngoài bối cảnh của một hoạt động. –

+0

lý do y tôi hỏi là để biết nếu bạn có đăng nhập g + sau đó lại auth là không cần thiết –

Trả lời

6

Tôi đã thực hiện điều gì đó tương tự từ một ứng dụng có Hoạt động và SyncService. Bạn thực sự có thể thấy rất nhiều chức năng trong số demo here. Bản trình diễn này không sử dụng dịch vụ, nhưng ý tưởng vẫn giữ nguyên.

1/Tạo một lớp đơn (GDAA trong trường hợp này) với phương thức init() chấp nhận ngữ cảnh hoạt động của bạn. Điều này init() sẽ khởi tạo một địa phương tĩnh GoogleApiClient mà vẫn còn sống miễn là bạn không cần phải chuyển đổi tài khoản (giải thích sau).
init() được gọi với ngữ cảnh hoạt động khi bắt đầu hoặc khi cần chuyển sang tài khoản người dùng khác (GooDrive khác cho người dùng khác). Hoạt động chuyển vào ngữ cảnh của nó và cung cấp các cuộc gọi lại onConnFail(), onConnOK().
Vì mục đích hoàn chỉnh, cũng phải có quy định cho onConnectionSuspended() trong trường hợp kết nối bị gián đoạn (không phải kết nối WIFI/CELL bị giảm, nhưng bị tạm ngưng GooPlaySvcs).

  • onConnFail() gọi lại chuyển quyền kiểm soát cho GooPlaySvcs để xác thực/ủy quyền có kết quả trở lại trong onActivityResult(). Kết nối lại, rửa, rửa lại, lặp lại ...
  • Gọi lại onConnOK() cho biết hoạt động của bạn là mọi thứ đã sẵn sàng.

Như tôi đã chỉ ra, bạn sẽ phải gọi init() một lần nữa nếu bạn xử lý nhiều tài khoản GooDrive để tạo ra một mới GoogleApiClient cho một tài khoản mới. Chỉ cần đi theo đường dẫn 'REQ_ACCPICK' here. Bạn cũng sẽ phải quản lý tài khoản của mình như bạn có thể thấy trong trình quản lý tài khoản 'AM' lớp here. Hầu hết các điệu nhảy này có thể được nhìn thấy trong số MainActivity.
Để hoàn tất, tôi cũng nên đề cập rằng bạn có thể để quản lý tài khoản cho GooPlaySvcs bằng cách bỏ qua setAccountName(email) trong GoogleApiClient.Builder() và sử dụng clearDefaultAccountAndReconnect() để đặt lại chọn tài khoản. Nhưng ứng dụng của bạn sẽ không biết ai là người dùng hiện tại. Tuy nhiên, quản lý tài khoản khác có thể được xử lý bằng phương tiện của PlusApi (hoặc bất cứ điều gì nó được gọi, không bao giờ được sử dụng nó). Nhưng tôi lạc đề.

2/Khi khởi tạo xong và static tĩnh GoogleApiClient mGAC là không rỗng và được kết nối, các phương pháp tĩnh GDAA có thể được tham chiếu từ bất kỳ đâu trong ứng dụng của bạn, bao gồm dịch vụ. Các phương pháp chắc chắn sẽ thất bại nếu GoogleApiClient không hoạt động hoặc không được kết nối.

Trong bản trình diễn được đề cập ở đây, tất cả các cuộc gọi GDAA đều có hương vị 'chờ đợi()' (đồng bộ). Nó không phải là một vấn đề nếu chúng được gọi từ một chủ đề không phải UI như một dịch vụ. Chúng có thể dễ dàng được chuyển thành các phiên bản không đồng bộ như trong ví dụ này:

DriveFile df = ...; 
// sync version 
DriveContentsResult rslt = df.open(mGAC, DriveFile.MODE_READ_ONLY, null).await(); 
if ((rslt != null) && rslt.getStatus().isSuccess()) { 
    DriveContents cont = rslt.getDriveContents(); 
    InputStream is = cont.getInputStream(); 
    cont.discard(mGAC); // or cont.commit(); they are equiv if READONLY 
} 
// async version 
df.open(mGAC, DriveFile.MODE_READ_ONLY, null).setResultCallback(
    new ResultCallback<DriveContentsResult>() { 
    @Override 
    public void onResult(DriveContentsResult rslt) { 
    if ((rslt != null) && rslt.getStatus().isSuccess()) { 
     DriveContents cont = rslt.getDriveContents(); 
     InputStream is = cont.getInputStream(); 
     cont.discard(mGAC); // or cont.commit(); they are equiv if READONLY 
    } 
    } 
}); 

Hương vị tùy thuộc vào nhu cầu của ứng dụng (mã spaghetti với giá trị trả lại tiêu thụ so với xử lý không đồng bộ).

Cần lưu ý rằng bản trình diễn này sử dụng phiên bản GDAA của Api. Có một REST Api cũng có thể được xử lý theo cùng một cách (chỉ có hương vị đồng bộ). Một bản trình diễn thay thế sử dụng chính xác cùng một logic và phương thức có sẵn here. Bạn thậm chí có thể kết hợp cả hai thành một lớp đơn với cả hai số
com.google.api.services.drive.Drivecom.google.android.gms.common.api.GoogleApiClient hiện tại. Tuy nhiên, rất nguy hiểm khi trộn GDAA và REST Api, vì bạn chắc chắn sẽ gặp phải các vấn đề về thời gian do GDAA đồng bộ hóa theo lịch riêng của nó, trong khi REST nằm dưới sự kiểm soát của bạn.

Hy vọng nó sẽ giúp, Good Luck

2

Tôi nghĩ rằng bạn có thể đạt được hiệu quả mong muốn bằng cách sử dụng Google Drive REST API gọi https://developers.google.com/drive/v2/reference/

Đây là cách bạn có thể tiến hành. Vì bạn nhận được bối cảnh, bạn có thể thực hiện các cuộc gọi api để lái xe. Để xác thực vì google theo dõi OAuth 2.0, bạn có thể sử dụng các lệnh gọi api này để đạt được xác thực https://developers.google.com/identity/

6

Đường dẫn mã onActivityResult chỉ được sử dụng khi có sự thất bại xác thực yêu cầu người dùng can thiệp. Vì vậy, theo định nghĩa, nó không thể đơn giản được xử lý "trong nền" bởi dịch vụ của bạn.

Trong trường hợp dịch vụ nền, tôi nghĩ một cách thích hợp để xử lý lỗi xác thực là hiển thị thông báo cho biết ảnh hưởng của "Bạn cần xác thực để tiếp tục". Bạn có thể đính kèm Ý định vào thông báo để nó khởi chạy "ResolveAuthActivity" của riêng bạn khi người dùng chạm vào thông báo. ResolveAuthActivity này chỉ cố gắng kết nối với API, xử lý lỗi trong onConnectionFailed, và sau đó khởi chạy Intent độ phân giải. Khi lỗi được giải quyết, ResolveAuthActivity của bạn có thể ping dịch vụ của bạn để cố gắng kết nối lại với API.

+0

Mẫu có vẻ mâu thuẫn với tuyên bố đầu tiên của bạn. Nghĩa là, nó đang xử lý xác thực _successful_ - không phải thất bại. https://github.com/googledrive/android-demos/blob/master/app/src/main/java/com/google/android/gms/drive/sample/demo/BaseDemoActivity.java#L98 –

+0

Đó là để xử lý độ phân giải xác thực thành công * sau * lỗi kết nối trước đó. Nếu bạn nhận thấy, REQUEST_CODE_AUTHENTICATION được khởi chạy từ bên trong onConnectionFailed và onActivityResult được gọi khi REQUEST_CODE_AUTHENTICATION hoàn tất. Vì vậy, dòng mã đầy đủ là: 1. Hãy thử kết nối bằng GoogleApiClient.connect, 2. Nếu kết nối không thành công (tức là onConnectionFailed được gọi), hãy khởi chạy độ phân giải xác thực, 3. Xử lý kết quả của độ phân giải trong onActivityResult. Nếu bạn không nhận được bất kỳ lỗi nào trên (1), bạn sẽ không đi đến luồng onActivityResult chút nào. – Prima

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