5

当我尝试使用YouTube API的搜索,我得到这个错误:的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编号。

+0

您是否找到解决您的问题的方法? – Exception

回答

10

大量的试验和错误,之后并最终为我工作的事情是从API Manager控制台改变API KEY限制,而不是的Android,只是保存。 enter image description here

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

+1

这是当时唯一适合我的解决方案。 –

+3

这可以被认为是一种解决方法,它可以工作,但受限密钥的主要问题仍未解决 – Choletski

+0

@Exception此解决方案不适用于发布版本,它仅适用于调试阶段。如何解决它的发布版本? – sasuke

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.

密钥工具-exportcert -alias androiddebugkey -keystore路径到调试或生产,密钥存储-list -v

  1. Paste the SHA1 fingerprint into the form where requested.

这里我也发现了这个SO question由Google员工回答说一用户必须通过OAuth2。因为Data API v3不支持服务帐户。

8

最后我找到了这个问题:)

的解决方案在谷歌开发者控制台创建API_KEY,并以“包名”和“SHA-1证书指纹”限制后,您必须提供这些数据每一个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标头:

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

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

+0

你从哪里找到将包装和sha1指纹放在那里的信息? – PrisonMike

+0

当您为您的项目创建Android Client密钥时,需要包名称和SHA-1。 –

+0

好的,这解决了我的问题,谢谢 – PrisonMike