2014-08-29 76 views
0

我想在android應用程序上搜索youtube視頻。我使用YouTube數據api v3。我使用示例代碼https://developers.google.com/youtube/v3/code_samples/java#search_by_keywordyoutube data api v3 android抽象googleclientrequest.execute()ioexception

我得到IOException異常在這條線:

// Call the API and print results. 
SearchListResponse searchResponse = search.execute(); 

我主要胡亞蓉:

package com.yasin_alm.bestsongsplaylistsyoutube; 

import java.io.IOException; 
import java.util.List; 

import android.os.Bundle; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 

import com.astuetz.PagerSlidingTabStrip; 
import com.google.android.youtube.player.YouTubeInitializationResult; 
import com.google.android.youtube.player.YouTubePlayer; 
import com.google.android.youtube.player.YouTubePlayer.OnInitializedListener; 
import com.google.android.youtube.player.YouTubePlayer.Provider; 
import com.google.api.client.googleapis.json.GoogleJsonResponseException; 
import com.google.api.client.http.HttpRequest; 
import com.google.api.client.http.HttpRequestInitializer; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.youtube.YouTube; 
import com.google.api.services.youtube.model.SearchListResponse; 
import com.google.api.services.youtube.model.SearchResult; 

public class MainActivity extends ActionBarActivity implements OnInitializedListener { 

    public static final String DEVELOPER_KEY="my api key from console.developer.com"; 
    public static final String TAG="bestsongs"; 

    private ViewPager pager;  
    private TabsPagerAdapter pagerAdapter; 
    private PagerSlidingTabStrip tabs; 
    private String searchQuery="pop songs"; 

    private static final long NUMBER_OF_VIDEOS_RETURNED = 25; 

    /** 
    * Define a global instance of a Youtube object, which will be used 
    * to make YouTube Data API requests. 
    */ 
    private static YouTube youtube; 

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

     doSearch(); 

     NowPlayingFragment nowPlayingFragmentFragment = NowPlayingFragment.newInstance("nCgQDjiotG0"); 
     //getSupportFragmentManager().beginTransaction().replace(R.layout.fragment_nowplaying, nowPlayingFragmentFragment).commit(); 

     // Initialise the ViewPager and set an adapter 
     pager = (ViewPager) findViewById(R.id.pager_main); 
     pager.setOffscreenPageLimit(3); //# of fragments loading 
     pagerAdapter=new TabsPagerAdapter(getSupportFragmentManager(),getResources().getStringArray(R.array.tab_titles)); 
     pagerAdapter.add(nowPlayingFragmentFragment); 
     pager.setAdapter(pagerAdapter); 

     // Bind the tabs to the ViewPager 
     tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs); 

     tabs.setViewPager(pager); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onInitializationFailure(Provider provider, 
      YouTubeInitializationResult error) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, 
      boolean wasRestored) { 
     if (!wasRestored) { 
      player.cueVideo("nCgQDjiotG0"); 
     } 
    } 

    /** 
    * Initialize a YouTube object to search for videos on YouTube. Then 
    * display the name and thumbnail image of each video in the result set. 
    * 
    * @param args command line args. 
    */ 
    public void doSearch() { 

     try { 
      // This object is used to make YouTube Data API requests. The last 
      // argument is required, but since we don't need anything 
      // initialized when the HttpRequest is initialized, we override 
      // the interface and provide a no-op function. 
      youtube = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), new HttpRequestInitializer() { 
       public void initialize(HttpRequest request) throws IOException { 
       } 
      }).setApplicationName("BestSongsPlaylistsYoutube").build(); 

      Log.d(TAG, "a"); 
      // Define the API request for retrieving search results. 
      YouTube.Search.List search = youtube.search().list("id,snippet"); 

      // Set your developer key from the Google Developers Console for 
      // non-authenticated requests. See: 
      // https://console.developers.google.com/ 
      search.setKey(DEVELOPER_KEY); 
      search.setQ(searchQuery); 

      // Restrict the search results to only include videos. See: 
      // https://developers.google.com/youtube/v3/docs/search/list#type 
      search.setType("video"); 

      // To increase efficiency, only retrieve the fields that the 
      // application uses. 
      search.setFields("items(id/kind,id/videoId,snippet/title,snippet/thumbnails/default/url)"); 
      search.setMaxResults(NUMBER_OF_VIDEOS_RETURNED); 

      Log.d(TAG, "b"); 
      // Call the API and print results. 
      SearchListResponse searchResponse = search.execute(); 
      Log.d(TAG, "c"); 
      List<SearchResult> searchResultList = searchResponse.getItems(); 
      if (searchResultList != null) { 
       //prettyPrint(searchResultList.iterator(), queryTerm); 
       Log.d(TAG,"video: "+searchResultList.get(0).getId().getVideoId()); 
      } 
     } catch (GoogleJsonResponseException e) { 
      Log.e(TAG,"There was a service error: " + e.getDetails().getCode() + " : " 
        + e.getDetails().getMessage()); 
     } catch (IOException e) { 
      Log.e(TAG,"IOException: " + e.getCause() + " : " + e.getMessage() +" : "+ e.getLocalizedMessage()); 
      e.printStackTrace(); 
     } 
    } 
} 

我logcat的輸出:

08-30 01:55:14.659: D/bestsongs(14223): a 
08-30 01:55:14.689: D/bestsongs(14223): b 
08-30 01:55:14.726: E/bestsongs(14223): IOException: null : null : null 

我檢查了類似的問題,我已經:

  • 試圖爲服務器應用程序,而不是重點重點Android應用程序
  • 試圖爲主要瀏覽器應用程序,而不是主要的Android應用程序
  • 檢查SHA1和包名

有什麼建議?我想要做的就是在Android應用程序的YouTube上搜索視頻。提前致謝。

回答

3

解決:您需要使用瀏覽器鍵訪問YouTube數據API。 Android密鑰僅用於Youtube Player。

另外:

您可以嘗試刪除你的項目和重置谷歌開發者控制檯上的一切從頭開始。

我在asynctask中實現了搜索功能。

+1

你救了我一命謝謝 – 2014-10-10 10:30:42