如果您能够让我知道使用Google API Client Library for Java检索youtube缩略图的方法,我将不胜感激,类似于我们使用gdata获取缩略图的方式.
List<String> thumbnails = new LinkedList<String>();
for (MediaThumbnail mediaThumbnail : mediaGroup.getThumbnails()) {
thumbnails.add(mediaThumbnail.getUrl());
}
Run Code Online (Sandbox Code Playgroud)
期待,问候,Rony
我正在尝试使用OAuth 1.0a将Android应用程序迁移到OAuth 2.0.(根据我的OAuth 2.0需要使用适用于Java/Android的Google API客户端库).
在Android平台上使用OAuth 2.0访问Google API的最佳/首选解决方案是什么,同时考虑了可用性方面.用户应该能够以简单的方式自动化访问,与我的Android应用程序无缝集成.
该应用程序当前正在使用OAuth 1.0基于Web的流程,我的应用程序弹出浏览器以允许用户授权访问,并且使用自定义重定向URI,我的应用程序能够检索访问令牌.它工作得很好,但我不喜欢这样的事实,我需要离开我的应用程序才能弹出一个浏览器来显示一个网页.我当时认为OAuth 2.0可以解决这个问题,并提供更好的用户体验.
我开始关注Google IO中概述的Adroid AccountManager-OAuth2集成,因为它不涉及webbrowser,并且与Android更紧密地结合,但它根本不按预期的方式运行.它没有记录,也不清楚它是否仍然是未来可行的选择.
我现在开始研究标准的OAuth 2.0 Web流程.
在这里,我似乎有两个选择:
将OAuth 2.0客户端配置为已安装的应用程序,并使用urn:ietf:wg:oauth:2.0:oob重定向URI.
不是很干净的解决方案,因为我不会让我的用户将一些代码复制粘贴到我的应用程序中.这根本不是用户友好的.
在使用OAuth 2.0访问谷歌的API文档提到,有投票的某种方式的页面解析出URL的冠军,但我也看到了很多与可用性问题,并没有真正想写这种管道代码.如果存在可以为我做的那个客户端库,我会很乐意进一步调查,但是现在,我已经放弃了这个选项.
将OAuth 2.0客户端配置为webapp,并使用重定向URI.
在这里,我注意到OAuth 2.0中禁止使用非标准方案.以前,可以使用类似xoauth://回调的东西,但不再允许这样做.在配置像http://mysite.com/oauth2/callback这样的重定向URI时,我无法在Google OAuth 2.0页面重定向时打开我的活动,尽管已为其设置了正确的意图过滤器.该http://mysite.com/oauth2/callback简单地显示在浏览器中.
以下工作正常
Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("http://mysite.com/oauth2/callback"));
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
但是,当Google OAuth 2页面重定向到同一个网址时,它只会显示在浏览器中.
即使这样可行,用户仍会看到一个选择器弹出窗口(在浏览器中打开或使用我的Android Activity打开).从可用性的角度来看,这也是不可接受的.
我正在寻找比这里概述的解决方案更好的解决方案.
此致,戴维
我想基于保存在数据库中的"刷新令牌"获取新的"访问令牌".
这是我写的代码:
GoogleCredential.Builder credentialBuilder = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT).setJsonFactory(JSON_FACTORY)
.setClientSecrets(CLIENT_ID, CLIENT_SECRET);
credentialBuilder.addRefreshListener(new MyCredentialRefreshListener());
credential = credentialBuilder.build();
credential.setRefreshToken("saved_refresh_token_from_database");
try {
credential.refreshToken();
} catch (IOException e) {
e.printStackTrace();
}
class MyCredentialRefreshListener implements CredentialRefreshListener {
public void onTokenResponse(Credential cr, TokenResponse tr) {
System.out.println("Credential was refreshed successfully.");
}
public void onTokenErrorResponse(Credential cr, TokenErrorResponse tr) {
System.out.println(tr);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到这条消息:
com.google.api.client.auth.oauth2.TokenResponseException:400 Bad
请求{"错误":"invalid_grant"}
我在php脚本中使用相同的CLIENT_ID,CLIENT_SECRET和"刷新令牌",当"访问令牌"到期时,我设法使用"刷新令牌"获取新的"访问令牌".
我根据javadoc.google-oauth-java-client编写了代码.
这里的任何人都知道如何修改代码以获取新的访问令牌?
提前致谢.
更新:问题是我在数据库中保存了refresh_token而没有对它执行json_decode,它包含一个"\",在JSON中被视为转义字符.
我正在使用 Google API Java 客户端http://code.google.com/p/google-api-java-client/并且能够成功获取 Android 的访问令牌。
// Google Accounts
credential = GoogleAccountCredential.usingOAuth2(this, CalendarScopes.CALENDAR);
SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
credential.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
Run Code Online (Sandbox Code Playgroud)
由于我希望我的 Web 服务器进行离线 API 调用,因此我需要一个刷新令牌。我一直在广泛搜索,但还没有想出如何做到这一点。
理想情况下,我更喜欢在 WebView 上使用 Google API Java 客户端来获取刷新令牌(无需输入用户名或密码)。
任何帮助,将不胜感激!
google-api-java-client google-oauth google-oauth-java-client
有一个如何使用Drive API https://developers.google.com/drive/quickstart-android的示例.它运行良好,但我在尝试从后台服务实现上传文件到GDrive时遇到了一些麻烦.
在我发现的所有示例中,如果我们收到,UserRecoverableAuthException我们需要使用来自该Exception(UserRecoverableAuthException#getIntent())的Intent启动新的Activity,以将用户带到OAuth2权限页面.
当我们从Activity执行此操作时,我们只是使用startActivityForResult,结果我们可以使用onActivityResult知道用户完成了他的交互,我们可以重试.
但是,如果我想从Service使用Drive API,并且需要用户交互,我所能做的就是向PendingIntent的用户提供通知.当用户关闭OAuth2权限页面时,我无法回复任何回调.
你能建议任何方法吗?也许我想念一些东西?也许有一些我必须要播放的广播等等?
谢谢.
我有一个Java ClientRequest到Google API,它返回一个json,其中包含一个基于access_token的配置文件.该网址为:
https://www.googleapis.com/oauth2/v1/userinfo?access_token = ya29.1.AADtN_VALuuUTBm8ENfNTz8s ...
响应是:
{
"id": "111223344556677889900",
"email": "myemail@gmail.com",
"verified_email": true,
"name": "My Name",
"given_name": "My",
"family_name": "Name",
"link": "plus.google.com/111223344556677889900",
"picture": "photo.jpg",
"gender": "male",
"locale": "en"
}
一些要点:
1我想使用java库来避免挂载http请求,保留google服务器url和其他一些小问题.
2我不需要授权的步骤,因为此时我的方法接收访问令牌(所有的oauth步骤都在之前完成).
3在这种方法中,我们没有(并且到目前为止还不需要)客户端ID和秘密.
4我不需要Google+范围.其实我更喜欢不去那里.到目前为止,只找到了使用Plus库的示例.
总而言之,我需要google api java库中的某些内容完全等同于现在使用的http请求.
非常感谢你提前!
java google-app-engine google-api userinfo google-api-java-client
我正在使用 YouTube API 以编程方式将视频上传到 YouTube。我的一些视频需要标记年龄限制,所以我想指定 AgeGating 视频属性。当指定 video.setAgeGating(gating) 时,还必须提供适当的部分名称,否则我会收到以下错误
{
"code" : 400,
"errors" : [ {
"domain" : "youtube.part",
"location" : "part",
"locationType" : "parameter",
"message" : "ageGating",
"reason" : "unexpectedPart"
} ],
"message" : "ageGating"
}
Run Code Online (Sandbox Code Playgroud)
该文件指出以下可用的部分:
片段、内容详细信息、文件详细信息、实时流媒体详细信息、播放器、处理详细信息、录制详细信息、统计信息、状态、建议和主题详细信息。
在我的情况下,它们都不起作用,仍然返回相同的unexpectedPart错误消息,因此我尝试了自定义ageGating部件名称,尽管这次响应是:
{
"code" : 403,
"errors" : [ {
"domain" : "youtube.common",
"message" : "Forbidden",
"reason" : "forbidden"
} ],
"message" : "Forbidden"
}
Run Code Online (Sandbox Code Playgroud)
YouTube API 错误文档页面中未列出此错误类型。
这是我的代码示例:
Video videoMetadata = …Run Code Online (Sandbox Code Playgroud) @Override
protected List< String > doInBackground( Void... params )
{
try
{
//This line below is the cause of the insufficient permissions error
ListMessagesResponse messagesWithLabels = mService.users().messages().list("me").setQ("label:inbox").execute();
/*for( Message m : messagesWithLabels.getMessages( ) )
{
if( m.size( ) > MAXSIZE )
{
List<MessagePartHeader> headers = m.getPayload( ).getHeaders( );
for ( MessagePartHeader header : headers )
{
if ( header.getName( ).equals("From") || header.getName().equals("Date")
|| header.getName().equals("Subject") || header.getName().equals("To")
|| header.getName().equals("CC")) {
messageDetails.put( header.getName( ).toLowerCase( ), header.getValue( ) );
}
}
messageDetails.put("snippet", m.getSnippet()); …Run Code Online (Sandbox Code Playgroud) 我在 java web 应用程序中使用以下代码来尝试获取组的所有用户:
GoogleCredential credential = GoogleCredential.fromStream(Util.class.getResourceAsStream("[credential_file].json")).createScoped(SCOPES);
Directory directory = new Directory.Builder(httpTransport, JSON_FACTORY, credential).build();
Directory.Members dirMem = directory.members();
Members members = dirMem.list("[group_email]").execute();
Run Code Online (Sandbox Code Playgroud)
这会导致最后一行 ( dirMem.list...)出现异常 403(未授权访问此资源/API )。
从文档(https://developers.google.com/admin-sdk/directory/v1/guides/delegation)和其他帖子中,我看到解决方案是使用setServiceAccountUser(). 但是,这意味着我必须使用 p12 文件而不是 json 文件(Google 建议在创建密钥时使用 json 文件)。
有什么办法可以在仍然使用 json 文件的同时解决这个问题(它还涉及更少的代码)。
谢谢。
google-api google-api-java-client google-oauth google-admin-sdk
在尝试列出权利时,我会:
403 Forbidden
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Insufficient Permission",
"reason" : "insufficientPermissions"
} ],
"message" : "Insufficient Permission"
}
Run Code Online (Sandbox Code Playgroud)
我正在使用client_secrets json的"WithInstalledApplication"授权.
重要提示:任何其他列表都正常工作(apks,inapproducts,...).我只有这个权利问题.
我也确定我的源代码是正确的,但仅供参考:
final AndroidPublisher service = AndroidPublisherHelper.init(appName, null);
final AndroidPublisher.Entitlements entitlements = service.entitlements();
EntitlementsListResponse entList = entitlements.list(pkgName).execute();
System.out.println("Entiltments: " + entList.toString());
Run Code Online (Sandbox Code Playgroud)
谢谢你的建议.
android google-api-java-client google-play-services google-play-console
android ×5
google-oauth ×3
java ×3
google-api ×2
access-token ×1
api ×1
gmail-api ×1
oauth-2.0 ×1
userinfo ×1
video ×1
youtube ×1
youtube-api ×1