Autore Topic: Youtube API [ Search Video]  (Letto 342 volte)

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Youtube API [ Search Video]
« il: 17 Dicembre 2015, 17:10:09 CET »
0
Ciao Ragazzi,
ho sviluppato un'app android che mediante le API di Youtube CERCA un video a partire da una Keyword è mostra la lista di video.
Il problema è che quando provo ad eseguire il codice ho un errore a runtime che non riesco a gestire.

SEARCH ACTIVITY
Codice (Java): [Seleziona]
public class SearchActivity extends Activity
{

    private EditText searchInput;
    private ListView videosFound;

    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);

        searchInput = (EditText)findViewById(R.id.search_input);
        videosFound = (ListView)findViewById(R.id.videos_found);

        handler = new Handler();

        searchInput.setOnEditorActionListener(new TextView.OnEditorActionListener()
        {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
            {
                if(actionId == EditorInfo.IME_ACTION_DONE)
                {
                    searchOnYoutube(v.getText().toString());
                    return false;
                }
                return true;
            }
        });

    }

    private List<VideoItem> searchResults;

    private void searchOnYoutube(final String keywords){
        new Thread(){
            public void run()
            {
                YoutubeConnector yc = new YoutubeConnector(SearchActivity.this);
                searchResults = yc.search(keywords); //è null
                handler.post(new Runnable()
                {
                    public void run()
                    {
                        updateVideosFound();
                    }
                });
            }
        }.start();
    }

    private void updateVideosFound()
    {
        ArrayAdapter<VideoItem> adapter = new ArrayAdapter<VideoItem>(getApplicationContext(), R.layout.video_item, searchResults){
            @Override
            public View getView(int position, View convertView, ViewGroup parent)
            {
                if(convertView == null)
                {
                    convertView = getLayoutInflater().inflate(R.layout.video_item, parent, false);
                }

                ImageView thumbnail = (ImageView)convertView.findViewById(R.id.video_thumbnail);
                TextView title = (TextView)convertView.findViewById(R.id.video_title);
                TextView description = (TextView)convertView.findViewById(R.id.video_description);


                VideoItem searchResult = searchResults.get(position);


//                Picasso.with(getApplicationContext()).load(searchResult.getThumbnailURL()).into(thumbnail);
                title.setText(searchResult.getTitle());
                description.setText(searchResult.getDescription());

                Log.e("SearchAcrivity", "title => " + title + " Descr => " + description);
                return convertView;
            }
        };

        videosFound.setAdapter(adapter);
    }

    private void addClickListener(){
        videosFound.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> av, View v, int pos,
                                    long id) {
                Intent intent = new Intent(getApplicationContext(), PlayerActivity.class);
                intent.putExtra("VIDEO_ID", searchResults.get(pos).getId());
                startActivity(intent);
            }

        });
    }

}

PLAYER ACTIVITY
Codice (Java): [Seleziona]
public class PlayerActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener {

    private YouTubePlayerView playerView;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);

        setContentView(R.layout.activity_player);

        playerView = (YouTubePlayerView)findViewById(R.id.player_view);
        playerView.initialize(Config.DEVELOPER_KEY, this);
    }

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider,
                                        YouTubeInitializationResult result) {
        Toast.makeText(this, "Failed", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
                                        boolean restored) {
        if(!restored){
            player.cueVideo(getIntent().getStringExtra("VIDEO_ID"));
        }
    }
}

VIDEO ITEM
Codice (Java): [Seleziona]
public class VideoItem
{
    String title;
    String description;
    String thumbnailURL;
    String id;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getThumbnailURL() {
        return thumbnailURL;
    }

    public void setThumbnailURL(String thumbnailURL) {
        this.thumbnailURL = thumbnailURL;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}


YOUTUBE CONNECTOR AND SEARCH
Codice (Java): [Seleziona]
class YoutubeConnector
{
    private YouTube youtube;
    private YouTube.Search.List query;

    public YoutubeConnector(Context context)
    {
        youtube = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), new HttpRequestInitializer()
        {
            @Override
            public void initialize(HttpRequest hr) throws IOException {
            }
        }).setApplicationName("youtube-cmdline-search-sample").build();



        try {
            query = youtube.search().list("id,snippet");
            query.setKey(Config.DEVELOPER_KEY);
            query.setType("video");
            query.setFields("items(id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url)");

            Log.e("YoutubeConnection","query => "+query.toString());
        } catch (IOException e) {
            Log.d("YC", "Could not initialize: " + e);
        }
    }

    public List<VideoItem> search(String keywords)
    {
        Log.e("Connection","Cerco il video con keywords => "+keywords);
        query.setQ(keywords);
        try {
            SearchListResponse response = query.execute();
            List<SearchResult> results = response.getItems();

            List<VideoItem> items = new ArrayList<VideoItem>();
            for (SearchResult result : results) {
                VideoItem item = new VideoItem();
                item.setTitle(result.getSnippet().getTitle());
                item.setDescription(result.getSnippet().getDescription());
                item.setThumbnailURL(result.getSnippet().getThumbnails().getDefault().getUrl());
                item.setId(result.getId().getVideoId());
                items.add(item);

                Log.e("Search","Description => "+result.getSnippet().getDescription()+"\n Title => "+result.getSnippet().getTitle());
            }
            return items;
        } catch (IOException e) {
            Log.d("YC", "Could not search: " + e);
            return null;
        }
    }
}


Il file di log riporta il seguente errore :
Codice (Java): [Seleziona]
D/YC: Could not search: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
                                                                      {
                                                                        "code" : 403,
                                                                        "errors" : [ {
                                                                          "domain" : "usageLimits",
                                                                          "message" : "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed.",
                                                                          "reason" : "ipRefererBlocked",
                                                                          "extendedHelp" : "https://console.developers.google.com"
                                                                        } ],
                                                                        "message" : "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your API key configuration if request from this IP or referer should be allowed."
                                                                      }

La key che ho generato è una API KEY ( ho provato anche con una OAuth) che ha abilitato :
YouTube Data API
YouTube Analytics API
YouTube Reporting API
in pratica tutte le voci relative alla voce youtube APIs.

Ho controllato nella lista degli errori riportati nella guida ufficiale di youtube https://developers.google.com/youtube/v3/docs/core_errors in cui alla voce del mio errore dice "The requested operation is forbidden and cannot be completed.".

Avete un'idea su come potrei risolvere il problema?
Sinceramente non so più cosa fare :(

Offline tonno16

  • Utente storico
  • *****
  • Post: 1227
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Youtube API [ Search Video]
« Risposta #1 il: 17 Dicembre 2015, 17:28:44 CET »
0
A me sembra molto facile.
Hai raggiunto il limite di richieste oppure hai degli ip con restrizioni.
Il campo reason specifica proprio che hai delle restrizioni.

Io se non ricordo male avevo tale errore anche dopo avere attivato la api. Ho aspettato 12 ore e andava