Youtube API 键
Youtube API Key
当我尝试使用 YouTube API 进行搜索时,出现此错误:
There was a service error: 403 : The request did not specify any
Android package name or signing-certificate fingerprint. Please ensure
that the client is sending them or use the API Console to update your
key restrictions.
在 MainActivity 中我有这段代码:
youtube = new YouTube.Builder(new NetHttpTransport(), JSON_FACTORY, new HttpRequestInitializer() {
@Override
public void initialize(HttpRequest httpRequest) throws IOException {
}
}).setYouTubeRequestInitializer(new YouTubeRequestInitializer(apiKey)).setApplicationName("Some Name").build();
在云控制台中,我有一个用于 Android 的 ApiKey,其中设置了包名称和使用 keytool 命令获得的 SHA-1 编号。
尝试仔细检查您在创建 OAuth 凭据时是否正确遵循了设置。并确保在开发者控制台中启用 YouTube 数据 API。
这是您需要做的steps。
In the Package name field, enter your Android app's package
name
In a terminal, run the Keytool
utility to
get the SHA1 fingerprint for your digitally signed .apk file's public
certificate.
keytool -exportcert -alias androiddebugkey -keystore path-to-debug-or-production-keystore -list -v
- Paste the SHA1 fingerprint into the form where requested.
我还在这个 SO question 的 Google 员工的回答中发现,用户必须通过 OAuth2。因为 Data API v3.
不支持服务帐户
经过反复试验,最终对我有用的是将 API KEY 限制更改为 None 而不是 API 管理器控制台中的 Android 并保存。
完成上述步骤后,我可以使用 API KEY 从我的 Android 设备进行搜索 API 调用。
我终于找到了解决这个问题的方法:)
在 Google Developer Console 中创建 API_KEY 并使用 "Package name" 和 "SHA-1 certificate fingerprint" 对其进行限制后,您必须在每个 youtube api 中提供这些数据要求。下面的步骤:
1-获取包名:
String packageName = context.getPackageName();
2- 获取 SHA-1:
private String getSHA1(String packageName){
try {
Signature[] signatures = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures;
for (Signature signature: signatures) {
MessageDigest md;
md = MessageDigest.getInstance("SHA-1");
md.update(signature.toByteArray());
return BaseEncoding.base16().encode(md.digest());
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
3- 准备 youtube api http header:
youTube = new YouTube.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), new HttpRequestInitializer() {
@Override
public void initialize(HttpRequest request) throws IOException {
String packageName = context.getPackageName();
String SHA1 = getSHA1(packageName);
request.getHeaders().set("X-Android-Package", packageName);
request.getHeaders().set("X-Android-Cert",SHA1);
}
}).setApplicationName(appName).build();
4- 根据需要构建您的 youtube api 查询:
例如搜索视频:
YouTube.Search.List query;
query = youTube.search().list("id, snippet");
query.setKey(YOUR_API_KEY);
query.setType("video");
query.setFields("items(id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url)");
query.setQ(search keywords);
SearchListResponse response = query.execute();
List<SearchResult> results = response.getItems();
然后处理返回搜索结果。
当我尝试使用 YouTube API 进行搜索时,出现此错误:
There was a service error: 403 : The request did not specify any Android package name or signing-certificate fingerprint. Please ensure that the client is sending them or use the API Console to update your key restrictions.
在 MainActivity 中我有这段代码:
youtube = new YouTube.Builder(new NetHttpTransport(), JSON_FACTORY, new HttpRequestInitializer() {
@Override
public void initialize(HttpRequest httpRequest) throws IOException {
}
}).setYouTubeRequestInitializer(new YouTubeRequestInitializer(apiKey)).setApplicationName("Some Name").build();
在云控制台中,我有一个用于 Android 的 ApiKey,其中设置了包名称和使用 keytool 命令获得的 SHA-1 编号。
尝试仔细检查您在创建 OAuth 凭据时是否正确遵循了设置。并确保在开发者控制台中启用 YouTube 数据 API。
这是您需要做的steps。
In the Package name field, enter your Android app's package name
In a terminal, run the Keytool utility to get the SHA1 fingerprint for your digitally signed .apk file's public certificate.
keytool -exportcert -alias androiddebugkey -keystore path-to-debug-or-production-keystore -list -v
- Paste the SHA1 fingerprint into the form where requested.
我还在这个 SO question 的 Google 员工的回答中发现,用户必须通过 OAuth2。因为 Data API v3.
不支持服务帐户经过反复试验,最终对我有用的是将 API KEY 限制更改为 None 而不是 API 管理器控制台中的 Android 并保存。
完成上述步骤后,我可以使用 API KEY 从我的 Android 设备进行搜索 API 调用。
我终于找到了解决这个问题的方法:)
在 Google Developer Console 中创建 API_KEY 并使用 "Package name" 和 "SHA-1 certificate fingerprint" 对其进行限制后,您必须在每个 youtube api 中提供这些数据要求。下面的步骤:
1-获取包名:
String packageName = context.getPackageName();
2- 获取 SHA-1:
private String getSHA1(String packageName){
try {
Signature[] signatures = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures;
for (Signature signature: signatures) {
MessageDigest md;
md = MessageDigest.getInstance("SHA-1");
md.update(signature.toByteArray());
return BaseEncoding.base16().encode(md.digest());
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
3- 准备 youtube api http header:
youTube = new YouTube.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), new HttpRequestInitializer() {
@Override
public void initialize(HttpRequest request) throws IOException {
String packageName = context.getPackageName();
String SHA1 = getSHA1(packageName);
request.getHeaders().set("X-Android-Package", packageName);
request.getHeaders().set("X-Android-Cert",SHA1);
}
}).setApplicationName(appName).build();
4- 根据需要构建您的 youtube api 查询: 例如搜索视频:
YouTube.Search.List query;
query = youTube.search().list("id, snippet");
query.setKey(YOUR_API_KEY);
query.setType("video");
query.setFields("items(id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url)");
query.setQ(search keywords);
SearchListResponse response = query.execute();
List<SearchResult> results = response.getItems();
然后处理返回搜索结果。