Youtube API Key

Federico Blumetto picture Federico Blumetto · Sep 17, 2016 · Viewed 6.9k times · Source

When I try to use YouTube API for Search, I get this error:

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.

In the MainActivity I have this code:

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

In the cloud console I have an ApiKey for Android, with the package name set and the SHA-1 number obtained with keytool command.

Answer

Ayman Al-Absi picture Ayman Al-Absi · Apr 17, 2017

At last I found a solution for this problem :)

After creating API_KEY in Google Developer Console and restrict it with "Package name" and "SHA-1 certificate fingerprint", You have to provide these data in every youtube api request. Below the steps:

1- get Package Name:

String packageName = context.getPackageName();

2- get 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- Prepare 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- Build your youtube api query as you like: For example to search for video:

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

then process returned search results.