目錄
Connecting toREST APIs
Maintainstate while resolving an error
Communicate with Google Services
首頁 資料庫 mysql教程 GoogleServices之GooglePlayService Accessing Google APIS(访

GoogleServices之GooglePlayService Accessing Google APIS(访

Jun 07, 2016 pm 03:42 PM

GoogleServices之GooglePlayService Accessing Google APIS( 访问 谷歌APIS) 官方 文档 翻译 AccessingGoogle APIs( 访问 谷歌 APIS) 当你想要连接到一个GoogleplayService库中提供的API,(比如:google,Games,或者drive),你需要创建一个 GoogleApiClient 的

 GoogleServices之GooglePlayService  Accessing Google APIS(访问谷歌APIS)官方文档翻译

    AccessingGoogle APIs(访问谷歌APIS)

         当你想要连接到一个GoogleplayService库中提供的API,(比如:google+,Games,或者drive),你需要创建一个<span>GoogleApiClient</span>的实例。Google API Client提供了一个公共的入口点给所有的谷歌服务以及在用户设备和每个谷歌服务之间管理网络连接。

       这个指南示例你如何使用Google API Client

1, 连接到一个或者多个Googleplayservice是异步的和失败处理。

2,  执行同步和异步API调用很多Google APIClient

注意:如果你已经有先有的应用使用子类<span>GooglePlayServicesClient</span>连接到Googleplayservice,你应当尽可能迁移到<span>GoogleApiClient</span>


GoogleServices之GooglePlayService  Accessing Google APIS(访

1.一个插图显示了Google APS客户端是如何给连接和调用许多有效的Google Play services 提供接口,像 GamesDrive

Connecting toREST APIs

如果你想使用GoogleAPI,但不包括Google Play services,你可以适当的RESTAPI连接,但是你必须获取一个 OAuth 2.0的令牌。获取更多信息,请阅读:Authorizing with Google for REST APIs.

 

开始前,你必须先安装GooglePlay services库(版本号为15或者更高)为你的安卓SDK。如果你还没有准备好,请按照以下说明去做:Set Up Google Play Services SDK.

Start a Connection 开始连接

一旦你的项目引用Google Play services 库,你就可以使用<span>GoogleApiClient.Builder</span> APIs在你的activityoncreate方法里创建<span>GoogleApiClient</span>实例。 <span>GoogleApiClient.Builder</span>这个类提供的方法允许你指定你想使用的Google APIs和你想得到的OAuth 2.0作用域。例如:这里是一个<span>GoogleApiClient</span> 使用Google Drive service连接的实例。

<span>GoogleApiClient</span> mGoogleApiClient=new <span>GoogleApiClient</span>.Builder(this)
    .addApi(Drive.API)
    .addScope(Drive.SCOPE_FILE)
    .build();

你可以通过追加<span>addApi()</span>  <span>addScope()</span>.添加多个APIS和多个scopes给相同的 <span>GoogleApiClient</span>

重点:为了避免客户端在没有安装Android Wear app的设备上连接错误,请使用一个单独的 <span>GoogleApiClient</span>实例仅仅访问 <span>Wearable</span> API。获取更多的信息,请看:Access the Wearable API

在开始连接之前你要调用<span>GoogleApiClient</span><span>connect()</span> 方法,你必须为回调接口 <span>ConnectionCallbacks</span> and <span>OnConnectionFailedListener</span>指定一个实现。当连接Google Play services成功,失败或者暂停时这些接口会接受异步方法<span>connect()</span>的回调。

例如:这里是一个实现了回调接口并且将他们添加到GoogleAPI客户端的activity

 

import gms.common.api.*;
import gms.drive.*;
import android.support.v4.app.FragmentActivity;

public classMyActivityextendsFragmentActivity
        implements ConnectionCallbacks, OnConnectionFailedListener {
    private <span>GoogleApiClient</span> mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        // Create a GoogleApiClient instance
        mGoogleApiClient = new <span>GoogleApiClient</span>.Builder(this)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        ...
    }

    @Override
    public void onConnected(Bundle connectionHint){
        // Connected to Google Play services!
        // The good stuff goes here.
    }

    @Override
    public void onConnectionSuspended(int cause){
        // The connection has been interrupted.
        // Disable any UI components that depend on Google APIs
        // until onConnected() is called.
    }

    @Override
    public void onConnectionFailed(<span>ConnectionResult</span> result){
        // This callback is important for handling errors that
        // may occur while attempting to connect with Google.
        //
        // More about this in the next div.
        ...
    }
}

定义了回调接口,你将准备调用<span>connect()</span>为了优雅的管理连接的生命周期,你应该调用<span>connect()</span>activityonStart()方法(除非你想晚一点连接)然后调用<span>disconnect()</span>在onStop()方法中。例如:

@Override
    protected void onStart(){
        super.onStart();
        if (!mResolvingError){  // more about this later
            mGoogleApiClient.connect();
        }
    }

    @Override
    protected void onStop(){
        mGoogleApiClient.disconnect();
        super.onStop();
    }

但是,如果您运行这段代码时,很有可能会失败,应用程序将接收调用onConnectionFailed()并发生SIGN_IN_REQUIRED错误,因为没有指定的用户帐户,下一节将展示如何处理这个错误等等。

Handleconnection failures(处理连接失败)

当你接收回调调用<span>onConnectionFailed()</span>,你应该调用<span>ConnectionResult</span> 对象提供的 <span>hasResolution()</span>方法。如果返回true,你可以请求用户立即采取行动通过调用ConnectionResult对象的<span>startResolutionForResult()</span>方法处理错误。这个 <span>startResolutionForResult()</span>方法的行为跟<span><span>startActivityForResult()</span></span> 比较相似,并启动适当的activity为用户解决错误(比如像一个选择账户的acticity

       如果<span>hasResolution()</span>返回false,你应该通过错误代码调用 <span>GooglePlayServicesUtil.getErrorDialog()</span>,它会通过GooglePlayServices适当的错误给你返回一个dialog.         这个对话框                                                                                                                                                                                                                  提供了一个简单的错误解释信息,但他也有肯呢过提供一个action去启动一个activity去解决错误(比如当用户需要安装新版本的GoogleplayService)

比如,你应该像这样调用 <span>onConnectionFailed()</span>

public class MyActivity extends FragmentActivity
        implements ConnectionCallbacks, OnConnectionFailedListener {

    // Requestcode to use when launching the resolution activity
    private staticfinalint REQUEST_RESOLVE_ERROR=1001;
    // Uniquetag for the error dialog fragment
    private staticfinalString DIALOG_ERROR="dialog_error";
    // Bool totrack whether the app is already resolving an error
    private boolean mResolvingError=false;

    ...

    @Override
    public void onConnectionFailed(<span>ConnectionResult</span> result){
        if (mResolvingError){
            // Already attempting to resolve an error.

               //如果正在解决这个错误,什么也不做
            return;
        } elseif(result.hasResolution()){
            try {
                mResolvingError = true;
                result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
            } catch(SendIntentException e){
                // There was an error with theresolution intent. Try again.
                mGoogleApiClient.connect();
            }
        } else{
            // Show dialog usingGooglePlayServicesUtil.getErrorDialog()
            showErrorDialog(result.getErrorCode());
            mResolvingError = true;
        }
    }

    // The restof this code is all about building the error dialog

    /* Creates adialog for an error message */
    private void showErrorDialog(int errorCode){
        // Create a fragment for the error dialog
        ErrorDialogFragment dialogFragment = new ErrorDialogFragment();
        // Pass the error that should be displayed
        Bundle args = new Bundle();
        args.putInt(DIALOG_ERROR, errorCode);
        dialogFragment.setArguments(args);
        dialogFragment.show(getSupportFragmentManager(),"errordialog");
    }

    /* Calledfrom ErrorDialogFragment when the dialog is dismissed. */
    public void onDialogDismissed(){
        mResolvingError = false;
    }

    /* Afragment to display an error dialog */
    public staticclassErrorDialogFragmentextendsDialogFragment{
        public ErrorDialogFragment(){}

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState){
            // Get the error code and retrieve theappropriate dialog
            int errorCode = this.getArguments().getInt(DIALOG_ERROR);
            return GooglePlayServicesUtil.getErrorDialog(errorCode,
                    this.getActivity(), REQUEST_RESOLVE_ERROR);
        }

        @Override
        public void onDismiss(DialogInterface dialog){
            ((MainActivity)getActivity()).onDialogDismissed();
        }
    }
}

一旦用户通过提供的 <span>startResolutionForResult()</span> or<span>GooglePlayServicesUtil.getErrorDialog()</span>完成解决,你的activity会在onActivityResult()方法里接受处理结果码<span><span>RESULT_OK</span></span> 。你可以继续调用<span>connect()</span> 比如:

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    if (requestCode== REQUEST_RESOLVE_ERROR){
        mResolvingError = false;
        if (resultCode== RESULT_OK){
            // Make sure the app is not alreadyconnected or attempting to connect
            if (!mGoogleApiClient.isConnecting()&&
                    !mGoogleApiClient.isConnected()){
                mGoogleApiClient.connect();
            }
        }
    }
}

在上面的代码中,你可能注意到布尔变量mResolvingError。他追踪应用状态当用户正在解决错误时避免重复尝试解决相同的问题。例如,当选择用户的对话框正在展现解决<span>SIGN_IN_REQUIRED</span>这个错误,用户有可能旋转屏幕。就会再次调用OnStart()重新展现你的activity,这个时候再次调用 <span>connect()</span>。就会有一次调用<span>startResolutionForResult()</span>返回相同的结果并创建有一个账户选择对话框展现在已存在的对话框前面。

这个布尔值会有效的在activity切换时被保存起来,下一节将做进一步解释。

Maintainstate while resolving an error

解决错误并维护状态

为了避免之前尝试解决错误时又执行 <span>onConnectionFailed()</span>中的代码,你需要保留一个布尔变量来跟踪你的应用当前是否在解决这个问题。

上面的代码示例,你应该在每次调用 <span>startResolutionForResult()</span>或者从<span>GooglePlayServicesUtil.getErrorDialog()</span>得到一个显示的对话框都要设置一个布尔值为true.知道你在onActivityResult()方法中接收到处理结果为 <span><span>RESULT_OK</span></span> 时再次将布尔值设置为false.

为保持布尔值在acticity重启时不会变化,应该将布尔值保存在<span><span>onSaveInstanceState()</span></span>:

private static final String STATE_RESOLVING_ERROR = "resolving_error";

@Override
protected void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    outState.putBoolean(STATE_RESOLVING_ERROR, mResolvingError);
}

然后在oncreat()中恢复保存的状态:

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    ...
    mResolvingError = savedInstanceState != null
            && savedInstanceState.getBoolean(STATE_RESOLVING_ERROR,false);
}

 

现在你可以安全的运行你的应用并连接到googleplayservice.如何使用 <span>GoogleApiClient</span>去执行读取和写入请求 Google Play services,下一节讨论:

Accessthe Wearable API(方位穿戴API

在没有安装Android Wear app的设备上,连接请求包含 <span>Wearable</span> API 会发生错误,错误码为<span>API_UNAVAILABLE</span>。如果你的应用除了访问其他的Google APIs 还要访问<span>Wearable</span> API ,使用一个单独的<span>GoogleApiClient</span>实例去访问<span>Wearable</span> API。这个方法使您在不用搭配穿戴设备上能够访问其他的Google APIs

当你使用单独的<span>GoogleApiClient</span> 实例仅仅去访问Wearable API,你要确定Android Wear app在设备上是否已经安装。

// Connection failed listener method for a client thatonly
// requestsaccess to the Wearable API
@Override
public void onConnectionFailed(<span>ConnectionResult</span> result){
    if (result.getErrorCode()==<span>ConnectionResult</span>.API_UNAVAILABLE){
        // The Android Wear app is not installed
    }
    ...
}

Communicate with Google Services

与谷歌服务通信

一旦连接,你的客户端就能使用特定的服务APIS为你的应用授权读写调用。按照特定的API和范围你添加你的 <span>GoogleApiClient</span>实例。

 

注意:之前调用特定的谷歌服务,你可能首先需要在谷歌开发者控制台注册你的APP.特定的说明请参考适合你所用的API入门指南。诸如:Google Drive or Google+

 

当你使用Google API Client,执行读写请求的时候,他立即作为一个<span>PendingResult</span> 对象返回。这是一个表示请求的对象,他还没有交付给谷歌服务。

例如:这是一个从 Google Drive请求读取文件提供的<span>PendingResult</span> 对象,

Query query = new Query.Builder()
        .addFilter(Filters.eq(SearchableField.TITLE, filename));
<span>PendingResult</span> result = Drive.DriveApi.query(mGoogleApiClient, query);

一旦你有了这个 <span>PendingResult</span>,你可以继续使用同步或者异步请求。

Usingasynchronous calls 使用异步调用

为了使用异步请求,<span>PendingResult</span>需要调用 <span>setResultCallback()</span>并提供一个实现<span>ResultCallback</span>接口的实现类。例如,这是执行异步请求:

private void loadFile(String filename){
    // Create aquery for a specific filename in Drive.
    Query query =newQuery.Builder()
            .addFilter(Filters.eq(SearchableField.TITLE, filename))
            .build();
    // Invokethe query asynchronously with a callback method
    Drive.DriveApi.query(mGoogleApiClient, query)
            .setResultCallback(new<span>ResultCallback</span>DriveApi.<span>MetadataBufferResult</span>>(){
        @Override
        public void onResult(DriveApi.<span>MetadataBufferResult</span> result) {
            // Success! Handle the query result.
            ...
        }
    });
}

当你的应用在 <span>onResult()</span>方法中收到一个<span>Result</span>对象时,他将按照你使用的Api交付相应子类的实例,比如:<span>DriveApi.MetadataBufferResult</span>.

Usingsynchronous calls 使用同步调用

如果你想要你的代码按照你严格定义的顺序运行,或许因为一个调用的结果是另一个需要的参数,你可以使用 <span>PendingResult</span>. <span>await()</span>方法进行同步请求。这个阻塞线程会交付一个你使用API的子类实例直到请求完成后返回结果。如:<span>MetadataBufferResult</span>

因为调用await()会阻塞线程知道结果返回,重点是你永远不要在你的UI线程中调用执行。所以你想执行同步请求Googleplayservices,你应该创建一个新的线程,比如使用AsyncTask执行这个请求。例如:这里是如何使用同步请求googlepalyservice访问相同的文件。

private void loadFile(String filename){
    new GetFileTask().execute(filename);
}

private classGetFileTaskextendsAsyncTaskString,Void,Void> {
    protected void doInBackground(String filename){
        Query query = new Query.Builder()
                .addFilter(Filters.eq(SearchableField.TITLE, filename))
                .build();
        // Invoke the query synchronously
        DriveApi.<span>MetadataBufferResult</span> result=
                Drive.DriveApi.query(mGoogleApiClient, query).await();

        // Continue doing other stuff synchronously
        ...
    }
}

小提示:你也可以队列阅读请求而不用连接 Google Play services.。例如:不管Google API Client是否连接,执行一个方法从Google Drive读取文件,然后一旦确立了连接,就会执行读取请求并接收结果。然而,当你的Google API Client 没有连接的时候如果你调用他们进行写入请求将会发生错误。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
MySQL的角色:Web應用程序中的數據庫 MySQL的角色:Web應用程序中的數據庫 Apr 17, 2025 am 12:23 AM

MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

說明InnoDB重做日誌和撤消日誌的作用。 說明InnoDB重做日誌和撤消日誌的作用。 Apr 15, 2025 am 12:16 AM

InnoDB使用redologs和undologs確保數據一致性和可靠性。 1.redologs記錄數據頁修改,確保崩潰恢復和事務持久性。 2.undologs記錄數據原始值,支持事務回滾和MVCC。

MySQL:世界上最受歡迎的數據庫的簡介 MySQL:世界上最受歡迎的數據庫的簡介 Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

MySQL的位置:數據庫和編程 MySQL的位置:數據庫和編程 Apr 13, 2025 am 12:18 AM

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

為什麼要使用mysql?利益和優勢 為什麼要使用mysql?利益和優勢 Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

MySQL與其他編程語言:一種比較 MySQL與其他編程語言:一種比較 Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

MySQL:從小型企業到大型企業 MySQL:從小型企業到大型企業 Apr 13, 2025 am 12:17 AM

MySQL適合小型和大型企業。 1)小型企業可使用MySQL進行基本數據管理,如存儲客戶信息。 2)大型企業可利用MySQL處理海量數據和復雜業務邏輯,優化查詢性能和事務處理。

MySQL索引基數如何影響查詢性能? MySQL索引基數如何影響查詢性能? Apr 14, 2025 am 12:18 AM

MySQL索引基数对查询性能有显著影响:1.高基数索引能更有效地缩小数据范围,提高查询效率;2.低基数索引可能导致全表扫描,降低查询性能;3.在联合索引中,应将高基数列放在前面以优化查询。

See all articles