目录
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

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++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教程
1659
14
CakePHP 教程
1416
52
Laravel 教程
1310
25
PHP教程
1258
29
C# 教程
1233
24
与MySQL中使用索引相比,全表扫描何时可以更快? 与MySQL中使用索引相比,全表扫描何时可以更快? Apr 09, 2025 am 12:05 AM

全表扫描在MySQL中可能比使用索引更快,具体情况包括:1)数据量较小时;2)查询返回大量数据时;3)索引列不具备高选择性时;4)复杂查询时。通过分析查询计划、优化索引、避免过度索引和定期维护表,可以在实际应用中做出最优选择。

可以在 Windows 7 上安装 mysql 吗 可以在 Windows 7 上安装 mysql 吗 Apr 08, 2025 pm 03:21 PM

是的,可以在 Windows 7 上安装 MySQL,虽然微软已停止支持 Windows 7,但 MySQL 仍兼容它。不过,安装过程中需要注意以下几点:下载适用于 Windows 的 MySQL 安装程序。选择合适的 MySQL 版本(社区版或企业版)。安装过程中选择适当的安装目录和字符集。设置 root 用户密码,并妥善保管。连接数据库进行测试。注意 Windows 7 上的兼容性问题和安全性问题,建议升级到受支持的操作系统。

mysql:简单的概念,用于轻松学习 mysql:简单的概念,用于轻松学习 Apr 10, 2025 am 09:29 AM

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

mysql 和 mariadb 可以共存吗 mysql 和 mariadb 可以共存吗 Apr 08, 2025 pm 02:27 PM

MySQL 和 MariaDB 可以共存,但需要谨慎配置。关键在于为每个数据库分配不同的端口号和数据目录,并调整内存分配和缓存大小等参数。连接池、应用程序配置和版本差异也需要考虑,需要仔细测试和规划以避免陷阱。在资源有限的情况下,同时运行两个数据库可能会导致性能问题。

RDS MySQL 与 Redshift 零 ETL 集成 RDS MySQL 与 Redshift 零 ETL 集成 Apr 08, 2025 pm 07:06 PM

数据集成简化:AmazonRDSMySQL与Redshift的零ETL集成高效的数据集成是数据驱动型组织的核心。传统的ETL(提取、转换、加载)流程复杂且耗时,尤其是在将数据库(例如AmazonRDSMySQL)与数据仓库(例如Redshift)集成时。然而,AWS提供的零ETL集成方案彻底改变了这一现状,为从RDSMySQL到Redshift的数据迁移提供了简化、近乎实时的解决方案。本文将深入探讨RDSMySQL零ETL与Redshift集成,阐述其工作原理以及为数据工程师和开发者带来的优势。

Bangla 部分模型检索中的 Laravel Eloquent ORM) Bangla 部分模型检索中的 Laravel Eloquent ORM) Apr 08, 2025 pm 02:06 PM

LaravelEloquent模型检索:轻松获取数据库数据EloquentORM提供了简洁易懂的方式来操作数据库。本文将详细介绍各种Eloquent模型检索技巧,助您高效地从数据库中获取数据。1.获取所有记录使用all()方法可以获取数据库表中的所有记录:useApp\Models\Post;$posts=Post::all();这将返回一个集合(Collection)。您可以使用foreach循环或其他集合方法访问数据:foreach($postsas$post){echo$post->

mysql用户和数据库的关系 mysql用户和数据库的关系 Apr 08, 2025 pm 07:15 PM

MySQL 数据库中,用户和数据库的关系通过权限和表定义。用户拥有用户名和密码,用于访问数据库。权限通过 GRANT 命令授予,而表由 CREATE TABLE 命令创建。要建立用户和数据库之间的关系,需创建数据库、创建用户,然后授予权限。

MySQL:初学者的数据管理易用性 MySQL:初学者的数据管理易用性 Apr 09, 2025 am 12:07 AM

MySQL适合初学者使用,因为它安装简单、功能强大且易于管理数据。1.安装和配置简单,适用于多种操作系统。2.支持基本操作如创建数据库和表、插入、查询、更新和删除数据。3.提供高级功能如JOIN操作和子查询。4.可以通过索引、查询优化和分表分区来提升性能。5.支持备份、恢复和安全措施,确保数据的安全和一致性。

See all articles