Youtube API密钥

Fed*_*tto 7 android youtube-api android-youtube-api android-studio youtube-data-api

当我尝试使用YouTube API for Search时,出现此错误:

出现服务错误:403:请求未指定任何Android程序包名称或签名证书指纹.请确保客户端正在发送它们或使用API​​控制台更新您的密钥限制.

在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();
Run Code Online (Sandbox Code Playgroud)

在云控制台中,我有一个Android的ApiKey,包名设置和使用keytool命令获得的SHA-1号.

Aym*_*bsi 18

最后我发现了这个问题的解决方案:)

在Google Developer Console中创建API_KEY并使用"包名称"和"SHA-1证书指纹"对其进行限制后,您必须在每个youtube api请求中提供这些数据.步骤如下:

1-获得包裹名称:

String packageName = context.getPackageName();
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

3-准备youtube api http标头:

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();
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

然后处理返回的搜索结果.

  • 您在哪里找到关于将包名称和SHA1指纹添加到请求标头中的热门文档? (4认同)
  • @Audumbar尝试以小写十六进制代码格式发送SHA1,例如:(AB:8A:CC:7R ....)作为(ab8acc7r ...)。为我工作。 (2认同)

Exc*_*ion 12

经过大量的反复试验,最终对我有用的事情是将API KEY限制从API Manager控制台更改为None而不是Android,只需保存即可. 在此输入图像描述

完成上述步骤后,我可以使用API​​ KEY从我的Android设备进行搜索API调用.

  • 这可以被认为是一种解决方法,它可以工作,但限制密钥的主要问题仍然没有解决 (3认同)
  • @Exception这个解决方案不适用于发布版本,它只适用于调试阶段.如何解决它的发布版本? (3认同)