0

0

GoogleServices之GooglePlayService Accessing Google APIS(访

php中文网

php中文网

发布时间:2016-06-07 15:42:38

|

2641人浏览过

|

来源于php中文网

原创

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连接的实例。

GoogleApiClient mGoogleApiClient=new GoogleApiClient.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 GoogleApiClient mGoogleApiClient;

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

        // Create a GoogleApiClient instance
        mGoogleApiClient = new GoogleApiClient.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(ConnectionResult 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(ConnectionResult 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

解决错误并维护状态

BeatBot
BeatBot

Splash的AI音乐生成器,AI歌曲制作人!

下载

为了避免之前尝试解决错误时又执行 <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(ConnectionResult result){
    if (result.getErrorCode()==ConnectionResult.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));
PendingResult 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(newResultCallbackDriveApi.MetadataBufferResult>(){
        @Override
        public void onResult(DriveApi.MetadataBufferResult 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.MetadataBufferResult 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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

28

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

23

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

27

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

16

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

18

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

2

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

164

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

8

2026.02.27

AO3官网直接进入
AO3官网直接进入

AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

309

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号