首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android youtube api v3在发布版本上不起作用

android youtube api v3在发布版本上不起作用
EN

Stack Overflow用户
提问于 2020-08-21 17:54:44
回答 1查看 198关注 0票数 2

首先,让我们从我的代码开始,我用它来根据用户的搜索请求获取视频列表

代码语言:javascript
复制
public class YouTubeVideoLoader extends AsyncTask<String, Void, List<YouTubeVideo>>
{
private static final String TAG = LogHelper.makeLogTag(YouTubeVideoLoader.class);

private Context context;
private YouTube youtube;

private YouTube.Search.List searchList;

private String keywords;
private String currentPageToken;
private String nextPageToken;

private YouTubeVideoReceiver youTubeVideoReceiver;

private String language;

public YouTubeVideoLoader(Context context)
{
    getInstance(context);
    this.context = context;
    this.youtube = getYouTube();
    this.keywords = null;
    this.currentPageToken = null;
    this.nextPageToken = null;
    this.youTubeVideoReceiver = null;
    this.language = Locale.getDefault().getLanguage();
}

@Override
protected List<YouTubeVideo> doInBackground(String... params)
{
    if (keywords == null) return null;
    try {
        return searchVideos();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

@Override
protected void onPostExecute(List<YouTubeVideo> ytVideos)
{
    youTubeVideoReceiver.onVideosReceived(ytVideos, currentPageToken, nextPageToken);
}

/**
 * Start the search.
 *
 * @param keywords - query
 */
public void search(String keywords)
{
    this.keywords = keywords;
    this.currentPageToken = null;
    this.nextPageToken = null;
    this.execute();
}

/**
 * Start the search.
 *
 * @param keywords         - query
 * @param currentPageToken - contains the Page Token
 */
public void search(String keywords, String currentPageToken)
{
    this.keywords = keywords;
    this.currentPageToken = currentPageToken;
    this.nextPageToken = null;
//        this.execute();
    this.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}

public void setYouTubeVideoReceiver(YouTubeVideoReceiver youTubeVideoReceiver)
{
    this.youTubeVideoReceiver = youTubeVideoReceiver;
}

/**
 * Search videos for a specific query
 */
private List<YouTubeVideo> searchVideos()
{

    
    List<YouTubeVideo> ytVideos = new ArrayList<>();
    try {
        searchList = youtube.search().list(YOUTUBE_SEARCH_LIST_PART);
        searchList.setKey(Config.YOUTUBE_API_KEY);
        searchList.set("key",Config.YOUTUBE_API_KEY);
        searchList.setQ(keywords);
        searchList.setType(YOUTUBE_SEARCH_LIST_TYPE); //TODO ADD PLAYLISTS SEARCH
        searchList.setMaxResults(Config.MAX_VIDEOS_RETURNED);
        searchList.setFields(YOUTUBE_SEARCH_LIST_FIELDS);
        searchList.set(YOUTUBE_LANGUAGE_KEY, language);
        if (currentPageToken != null) {
            searchList.setPageToken(currentPageToken);
        }


       

        final Pattern pattern = Pattern.compile(YT_REGEX);
        final Matcher matcher = pattern.matcher(keywords);

        if (matcher.find()) {

            Log.e(TAG, "YouTube ID: " + matcher.group(1));

            YouTube.Videos.List singleVideo = youtube.videos().list(YOUTUBE_VIDEO_PART);
            singleVideo.setKey(Config.YOUTUBE_API_KEY);
            searchList.set("key",Config.YOUTUBE_API_KEY);
            singleVideo.setFields(YOUTUBE_VIDEO_FIELDS);
            singleVideo.set(YOUTUBE_LANGUAGE_KEY, language);
            singleVideo.setId(matcher.group(1));
            VideoListResponse resp = singleVideo.execute();
            List<Video> videoResults = resp.getItems();

            for (Video videoResult : videoResults) {
                YouTubeVideo item = new YouTubeVideo();

                if (videoResult != null) {
                    // SearchList list info
                    item.setTitle(videoResult.getSnippet().getTitle());
                    item.setThumbnailURL(videoResult.getSnippet().getThumbnails().getDefault().getUrl());
                    item.setId(videoResult.getId());

                    // Video info
                    if (videoResult.getStatistics() != null) {
                        BigInteger viewsNumber = videoResult.getStatistics().getViewCount();
                        String viewsFormatted = NumberFormat.getIntegerInstance().format(viewsNumber) + " views";
                        item.setViewCount(viewsFormatted);
                    }
                    if (videoResult.getContentDetails() != null) {
                        String isoTime = videoResult.getContentDetails().getDuration();
                        String time = Utils.convertISO8601DurationToNormalTime(isoTime);
                        item.setDuration(time);
                    }
                } else {
                    item.setDuration("NA");
                }

                // Add to the list
                ytVideos.add(item);
            }
        } else {

            YouTube.Videos.List videosList = youtube.videos().list(YOUTUBE_VIDEO_LIST_PART);

            videosList.setKey(Config.YOUTUBE_API_KEY);
            searchList.set("key",Config.YOUTUBE_API_KEY);
            videosList.setFields(YOUTUBE_VIDEO_LIST_FIELDS);

            videosList.set(YOUTUBE_LANGUAGE_KEY, language);


            
            final SearchListResponse searchListResponse = searchList.execute();

       

           
            Log.e(TAG, "Printed " + searchListResponse.getPageInfo().getResultsPerPage() +
                    " out of " + searchListResponse.getPageInfo().getTotalResults() +
                    ".\nCurrent page token: " + searchList.getPageToken() + "\n" +
                    "Next page token: " + searchListResponse.getNextPageToken() +
                    ".\nPrev page token: " + searchListResponse.getPrevPageToken());

             
            final List<SearchResult> searchResults = searchListResponse.getItems();

            // Stores the nextPageToken
            nextPageToken = searchListResponse.getNextPageToken();
            
            // Finds video list
            videosList.setId(Utils.concatenateIDs(searchResults));
            VideoListResponse resp = videosList.execute();
            List<Video> videoResults = resp.getItems();

            // Create the ytVideos list to be displayed in the UI
            

            int index = 0;
            for (SearchResult result : searchResults) {
                if (result.getId() == null) {
                    continue;
                }

                YouTubeVideo item = new YouTubeVideo();

                String title = StringUtils.unescapeHtml3(result.getSnippet().getTitle());
                LogHelper.e(TAG, "Title: " + title);
                // SearchList list info
                item.setTitle(title);
                item.setThumbnailURL(result.getSnippet().getThumbnails().getDefault().getUrl());
                item.setId(result.getId().getVideoId());

                // Video info
                Video videoResult = videoResults.get(index);
                if (videoResult != null) {
                    if (videoResult.getStatistics() != null) {
                        BigInteger viewsNumber = videoResult.getStatistics().getViewCount();
                        String viewsFormatted = NumberFormat.getIntegerInstance().format(viewsNumber) + " views";
                        item.setViewCount(viewsFormatted);
                    }
                    if (videoResult.getContentDetails() != null) {
                        String isoTime = videoResult.getContentDetails().getDuration();
                        String time = Utils.convertISO8601DurationToNormalTime(isoTime);
                        item.setDuration(time);
                    }
                } else {
                    item.setDuration("NA");
                }

                // Add to the list
                ytVideos.add(item);
                index++;

            }
        }
    } catch (Exception e) {
        Log.e(TAG, "catch Could not initialize: " + e);
        e.printStackTrace();
    }

    Log.e(TAG, "LoadInBackground: return " + ytVideos.size());
    return ytVideos;
}

}

这段代码在我的应用程序的调试版上运行没有任何问题关于控制台开发者youtube api我将其设置为无

无论如何,当我更改我的应用程序以发布Youtube搜索代码时,我得到了这个错误

代码语言:javascript
复制
    {
  "error": {
    "code": 403,
    "message": "The request is missing a valid API key.",
    "errors": [
      {
        "message": "The request is missing a valid API key.",
        "domain": "global",
        "reason": "forbidden"
      }
    ],
    "status": "PERMISSION_DENIED"
  }
 }

我看我的api是有效的

try and catch错误中,我获得了http url及其

代码语言:javascript
复制
https://www.googleapis.com/youtube/v3/search?p=pageInfo,nextPageToken,items(id/videoId,snippet/title,snippet/thumbnails/default/url)&q=WWWWWWCuoKigBEzKx-a1NowWWWJFNEvMAZtd0GM&r=id,snippet&s=50&u=D8%AA%D9%&v=video&hl=en

WWWWWWCuoKigBEzKx-a1NowWWWJFNEvMAZtd0GM是我的api key的地方,出于安全性考虑,我做了很少的更改。

正如我所看到的,key=没有参数

因此相同的url我将q=更改为key=并在浏览器中打开相同的url,我得到了响应

所以我补充说

代码语言:javascript
复制
 searchList.set("key",Config.YOUTUBE_API_KEY);

添加到我的代码中,但在发布版本中的List<Video> videoResults = resp.getItems();结果中仍然为null

我确实搜索了一天,但我没有找到导致这个问题的原因,为什么它在调试和发布中不起作用

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-22 09:22:04

一天后,我找到了解决方案,参数名称在发布版本中发生了变化

接口必须有带Key=的参数,但发布版本修改为q=,并修改其他参数名称

所以我发现它通过添加useProguard true来启用防护的解决方案

在gradle中就像这样

代码语言:javascript
复制
  buildTypes {
    release {
        
        minifyEnabled true
        useProguard true

        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }
}

然后在proguard-rules.pro中添加下面这几行

代码语言:javascript
复制
-keep class com.google.api.** { *; }

如果您在其他软件包上遇到问题,可以使用其他软件包名称更改com.google.api.**

此外,我还添加了以下几行

代码语言:javascript
复制
-keepparameternames
-ignorewarnings
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63520586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档