Youtube Playlist shown in ListView

2019-02-14 04:10发布

问题:

I have a GDATA link that I want to use in my App. This link contains a playlist and I want that playlist to be displayed in a ListView. The user will then select the video he/she wants and will then be able to play it in side the app using the local Youtube App.

Please point me to a tutorial that is intuitive. I know that the YouTube API page contains all the info, but I can make heads or tails of it.

回答1:

I hope this will give you an idea try this (just a sample) and if you have better solutions pls let me know too.

 package com.test.utubevdo;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.ArrayList;

    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONArray;
    import org.json.JSONObject;

    import android.app.Activity;
    import android.app.Dialog;
    import android.app.ListActivity;
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.ContextMenu;
    import android.view.ContextMenu.ContextMenuInfo;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.WindowManager;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.Button;
    import android.widget.Gallery;
    import android.widget.ListView;
    import android.widget.VideoView;


    public class AndroidThumbnailList extends Activity{
        ArrayList <YTBVideo> videos = new ArrayList<YTBVideo>();

    ProgressDialog progressDialog = null;
    VideoView vdovw_1 = null;
    String vdoURL = "";
    ListView listview = null;
    Gallery gallery = null;
    Dialog noDataAlert = null;


    Handler imageLoaderHandler = new Handler() {
        public void handleMessage(final Message msg) {
            progressDialog.dismiss();
            if(msg.what == 1){

                showErrorMessage("Communication Error", "Error Occured while retrieving the data from Youtube.\n Please try again");

            }else{
            System.out.println("videos  ::"+videos.size());
            //listview.setAdapter(new VideoViewAdapter(AndroidThumbnailList.this, videos));
            gallery.setAdapter(new VideoViewAdapter1(AndroidThumbnailList.this, videos));
            }

        }
    };



    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


         getWindow().setFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        //setContentView(R.layout.imagelist_layout);
        //listview = (ListView)findViewById(R.id.listView1);
         setContentView(R.layout.gallery_imagelist_layout);
         gallery  = (Gallery) findViewById(R.id.galleryView);

         gallery.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView parent, View view, int position, long id) {
                    Intent videoDisplayIntent =  new Intent("com.test.utubevdo.VIEW_VIDEO");
                    System.out.println("String.valueOf(view.getTag())  :::"+((YTBVideo)videos.get(position)).getId());
                    videoDisplayIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    videoDisplayIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                    videoDisplayIntent.putExtra("VIDEO_ID", ((YTBVideo)videos.get(position)).getId());
                    startActivity(videoDisplayIntent);
                }
                });
        progressDialog = ProgressDialog.show(this, "Loading Video Images", "Loading Video Images", true, false);
        //  setListAdapter(new MyThumbnaildapter(AndroidThumbnailList.this, R.layout.row, videoFileList));
    }


    /*@Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        super.onCreateContextMenu(menu, v, menuInfo);

    }*/

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        try{
            DownloaderTAsk downloaderTAsk = (DownloaderTAsk) new DownloaderTAsk().execute(getApplicationContext());


        }catch (Exception e) {
            // TODO: handle exception
        }
    }


    class DownloaderTAsk extends AsyncTask{

        @Override
        protected Object doInBackground(Object... arg0) {
            // TODO Auto-generated method stub
            try{
                printVideoFEEJSONString("http://gdata.youtube.com/feeds/api/videos?alt=jsonc&q=football+-soccer&orderby=published&start-index=11&max-results=10&v=2");
                //printVideoFEEJSONString("https://gdata.youtube.com/feeds/api/videos?alt=json&q=football+-soccer&orderby=published&start-index=11&max-results=10&v=2");
                imageLoaderHandler.sendEmptyMessage(0);
            }catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();

                imageLoaderHandler.sendEmptyMessage(1);

            }
            return null;
        }
        @Override
        protected void onPostExecute(Object result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);

        }

    }



    public void printVideoFEEJSONString(String feedURL){
        BufferedReader bufferedReader = null;
        try{
            HttpClient client = new DefaultHttpClient();

            HttpGet request = new HttpGet(feedURL);
            HttpResponse response = client.execute(request);

            bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer jsonStringBuffer = new StringBuffer("");
            String line = "";
            String newLine = System.getProperty("line.separator");
            while ((line = bufferedReader.readLine()) != null) {
                jsonStringBuffer.append(line + newLine);
            }

            String appUpdatorJsonString = jsonStringBuffer.toString();
            System.out.println("YOUTUBE VIDEO FEED JSON :"+appUpdatorJsonString);

            JSONObject updaterAppJsonObject = new JSONObject(appUpdatorJsonString);
            System.out.println("YOUTUBE VIDEO FEED JSON OBJECT :"+updaterAppJsonObject);




            processYoutubeVideoFEEJSONObject(updaterAppJsonObject);



        }catch (Exception e) {
            e.printStackTrace();
            // TODO: handle exception
        }
    }


    public void processYoutubeVideoFEEJSONObject(JSONObject updaterAppJsonObject){
        JSONObject dataJSONObject = null;
        JSONArray itemsJSONArray = null;
        JSONObject itemsJSONObject = null;
        JSONObject linkJSONObject = null;
        String yvURL = "";
        YTBVideo yVideo = null;

        try{

            dataJSONObject = updaterAppJsonObject.getJSONObject("data");
            itemsJSONArray = dataJSONObject.getJSONArray("items");
            for(int i = 0; i < itemsJSONArray.length(); i++){
                yVideo = new YTBVideo();
                // for(int i = 0; i < 1; i++){
                itemsJSONObject = itemsJSONArray.getJSONObject(i);
                yVideo.setId(itemsJSONObject.getString("id"));
                yVideo.setThumbNailURL(itemsJSONObject.getJSONObject("thumbnail").getString("sqDefault"));
                yVideo.setVideoImageURL(itemsJSONObject.getJSONObject("player").getString("default"));
                yVideo.setTitle(itemsJSONObject.getString("title"));
                yvURL = itemsJSONObject.getJSONObject("player").getString("default");


                String videoURL = yvURL.substring(0,yvURL.indexOf("&"));
                vdoURL = videoURL;
                System.out.println("Youtube URL is ::"+videoURL);
                System.out.println("videoURL ::"+videoURL);
                yVideo.setThumbnailImage(preloadBitmap(yVideo));
                videos.add(yVideo);

            }

        }catch (Exception e) {
            e.printStackTrace();
            // TODO: handle exception
        }
    }



    private Bitmap preloadBitmap(YTBVideo  yTBVideo) throws MalformedURLException,IOException {
        Bitmap photoBitmap= null;
        try{

        BitmapFactory.Options  imageOptions = null;
        imageOptions = new BitmapFactory.Options();
        imageOptions.outHeight = 250;
        imageOptions.outHeight = 150;
        String FlickrPhotoPath = yTBVideo.getThumbNailURL();


        URL FlickrPhotoUrl = null;


        System.out.println("FlickrPhotoPath:::::::"+FlickrPhotoPath);
        //try {
        FlickrPhotoUrl = new URL(FlickrPhotoPath);

        HttpURLConnection httpConnection = (HttpURLConnection) FlickrPhotoUrl.openConnection();
        httpConnection.setDoInput(true);
        httpConnection.connect();
        InputStream inputStream = httpConnection.getInputStream();
        //photoBitmap = BitmapFactory.decodeStream(inputStream);
        photoBitmap = BitmapFactory.decodeStream(inputStream,null,imageOptions);
        System.out.println("photoBitmap:::::::"+photoBitmap);
        /*} catch (MalformedURLException e) {
                //e.printStackTrace();
            } catch (IOException e) {
                //e.printStackTrace();
            }*/
        }catch (Exception e) {
            // TODO: handle exception
            //showErrorMessage("communication error", "Unable to connect to Flickr Server");
            e.printStackTrace();
        }
        return photoBitmap;
    }

    protected void showErrorMessage(String messageLine1, String message)
    {       
        noDataAlert = Utiliy.getAlertMessage(getBaseContext(), this, messageLine1.toUpperCase()+":\n"+message, 1);
        noDataAlert.getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        noDataAlert.setCanceledOnTouchOutside(true);
        noDataAlert.setCancelable(true);
        Button yesButton = (Button)noDataAlert.findViewById(R.id.alert_popup_yes_button);
        yesButton.setText("  OK  ");
        yesButton.setTextSize(24);
        yesButton.setPadding(5, 5, 5, 5);
        yesButton.setVisibility(View.VISIBLE);
        yesButton.setOnClickListener(new OnClickListener(){
            public void onClick(View view){
                noDataAlert.dismiss();
                finish();
            }
        });
        noDataAlert.show();
    }
}

 package com.test.utubevdo;

    import java.util.List;

    import com.keyes.youtube.OpenYouTubePlayerActivity;

    import android.app.Activity;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.net.Uri;
    import android.os.Bundle;

    public class DisplayYoutubeVideo extends Activity {

    String vdoID = "";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        vdoID = (String) getIntent().getExtras().get("VIDEO_ID");

        System.out.println("vdoID   :::"+vdoID);
    }
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        startVideo(vdoID);
    }


    private void startVideo ( String videoID ) { // default youtube app
        Intent i = new Intent ( Intent . ACTION_VIEW , Uri . parse ( "vnd.youtube:" + videoID )); 
        List < ResolveInfo > list = getPackageManager (). queryIntentActivities ( i , PackageManager . MATCH_DEFAULT_ONLY ); 
        if ( list . size () == 0 ) {
            //write you own activity to display the video, if default youtube video display class is not available or else use the default class it self
            }

        System.out.println("Intent Actin :"+i.getAction());
        startActivity ( i );
    }
}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test.utubevdo"
      android:versionCode="1"
      android:versionName="1.0">

        <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />


    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8"/>


    <application android:icon="@drawable/icon" android:label="@string/app_name">

  <activity android:name="com.test.utubevdo.AndroidThumbnailList"
                  android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

  <activity android:name="com.test.utubevdo.DisplayYoutubeVideo"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.test.utubevdo.VIEW_VIDEO" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>