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

  1. In the Package name field, enter your Android app's package name

  2. 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

  1. 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();

然后处理返回搜索结果。