2012-05-29 2 views
2

J'utilise OpenYoutubeActivity.jar pour lire des vidéos sur youtube comme celui-citube vidéos Vous ne jouez pas

Intent videoIntent = new Intent(null, Uri.parse("ytv://NG3WygJmiVs"), this,OpenYouTubePlayerActivity.class); 
    startActivity(videoIntent); 

OpenYouTubePlayerActivity.java est ici

public class OpenYouTubePlayerActivity extends Activity { 

public static final String SCHEME_YOUTUBE_VIDEO = "ytv"; 
public static final String SCHEME_YOUTUBE_PLAYLIST = "ytpl"; 

static final String YOUTUBE_VIDEO_INFORMATION_URL = "http://www.youtube.com/get_video_info?&video_id="; 
static final String YOUTUBE_PLAYLIST_ATOM_FEED_URL = "http://gdata.youtube.com/feeds/api/playlists/"; 

protected ProgressBar mProgressBar; 
protected TextView mProgressMessage; 
protected VideoView mVideoView; 

public final static String MSG_INIT = "com.keyes.video.msg.init"; 
protected String  mMsgInit  = "Initializing"; 

public final static String MSG_DETECT = "com.keyes.video.msg.detect"; 
protected String  mMsgDetect  = "Detecting Bandwidth"; 

public final static String MSG_PLAYLIST = "com.keyes.video.msg.playlist"; 
protected String  mMsgPlaylist = "Determining Latest Video in YouTube Playlist"; 

public final static String MSG_TOKEN = "com.keyes.video.msg.token"; 
protected String  mMsgToken  = "Retrieving YouTube Video Token"; 

public final static String MSG_LO_BAND = "com.keyes.video.msg.loband"; 
protected String  mMsgLowBand = "Buffering Low-bandwidth Video"; 

public final static String MSG_HI_BAND = "com.keyes.video.msg.hiband"; 
protected String  mMsgHiBand  = "Buffering High-bandwidth Video"; 

public final static String MSG_ERROR_TITLE = "com.keyes.video.msg.error.title"; 
protected String  mMsgErrorTitle = "Communications Error"; 

public final static String MSG_ERROR_MSG = "com.keyes.video.msg.error.msg"; 
protected String  mMsgError  = "An error occurred during the retrieval of the video. This could be due to network issues or YouTube protocols. Please try again later."; 

/** Background task on which all of the interaction with YouTube is done */ 
protected QueryYouTubeTask mQueryYouTubeTask; 

protected String mVideoId = null; 

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

    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    // create the layout of the view 
    setupView(); 

    // determine the messages to be displayed as the view loads the video 
    extractMessages(); 

    // set the flag to keep the screen ON so that the video can play without the screen being turned off 
    getWindow().setFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    mProgressBar.bringToFront(); 
    mProgressBar.setVisibility(View.VISIBLE); 
    mProgressMessage.setText(mMsgInit); 

    // extract the playlist or video id from the intent that started this video 

    Uri lVideoIdUri = this.getIntent().getData(); 

    if(lVideoIdUri == null){ 
     Log.i(this.getClass().getSimpleName(), "No video ID was specified in the intent. Closing video activity."); 
     finish(); 
    } 
    String lVideoSchemeStr = lVideoIdUri.getScheme(); 
    String lVideoIdStr  = lVideoIdUri.getEncodedSchemeSpecificPart(); 
    if(lVideoIdStr == null){ 
     Log.i(this.getClass().getSimpleName(), "No video ID was specified in the intent. Closing video activity."); 
     finish(); 
    } 
    if(lVideoIdStr.startsWith("//")){ 
     if(lVideoIdStr.length() > 2){ 
      lVideoIdStr = lVideoIdStr.substring(2); 
     } else { 
      Log.i(this.getClass().getSimpleName(), "No video ID was specified in the intent. Closing video activity."); 
      finish(); 
     } 
    } 

    /////////////////// 
    // extract either a video id or a playlist id, depending on the uri scheme 
    YouTubeId lYouTubeId = null; 
    if(lVideoSchemeStr != null && lVideoSchemeStr.equalsIgnoreCase(SCHEME_YOUTUBE_PLAYLIST)){ 
     lYouTubeId = new PlaylistId(lVideoIdStr); 
    } 

    else if(lVideoSchemeStr != null && lVideoSchemeStr.equalsIgnoreCase(SCHEME_YOUTUBE_VIDEO)){ 
     lYouTubeId = new VideoId(lVideoIdStr); 
    } 

    if(lYouTubeId == null){ 
     Log.i(this.getClass().getSimpleName(), "Unable to extract video ID from the intent. Closing video activity."); 
     finish(); 
    } 

    mQueryYouTubeTask = (QueryYouTubeTask) new QueryYouTubeTask().execute(lYouTubeId); 
} 

/** 
* Determine the messages to display during video load and initialization. 
*/ 
private void extractMessages() { 
    Intent lInvokingIntent = getIntent(); 
    String lMsgInit = lInvokingIntent.getStringExtra(MSG_INIT); 
    if(lMsgInit != null){ 
     mMsgInit = lMsgInit; 
    } 
    String lMsgDetect = lInvokingIntent.getStringExtra(MSG_DETECT); 
    if(lMsgDetect != null){ 
     mMsgDetect = lMsgDetect; 
    } 
    String lMsgPlaylist = lInvokingIntent.getStringExtra(MSG_PLAYLIST); 
    if(lMsgPlaylist != null){ 
     mMsgPlaylist = lMsgPlaylist; 
    } 
    String lMsgToken = lInvokingIntent.getStringExtra(MSG_TOKEN); 
    if(lMsgToken != null){ 
     mMsgToken = lMsgToken; 
    } 
    String lMsgLoBand = lInvokingIntent.getStringExtra(MSG_LO_BAND); 
    if(lMsgLoBand != null){ 
     mMsgLowBand = lMsgLoBand; 
    } 
    String lMsgHiBand = lInvokingIntent.getStringExtra(MSG_HI_BAND); 
    if(lMsgHiBand != null){ 
     mMsgHiBand = lMsgHiBand; 
    } 
    String lMsgErrTitle = lInvokingIntent.getStringExtra(MSG_ERROR_TITLE); 
    if(lMsgErrTitle != null){ 
     mMsgErrorTitle = lMsgErrTitle; 
    } 
    String lMsgErrMsg = lInvokingIntent.getStringExtra(MSG_ERROR_MSG); 
    if(lMsgErrMsg != null){ 
     mMsgError = lMsgErrMsg; 
    } 
} 

/** 
* Create the view in which the video will be rendered. 
*/ 
private void setupView() { 
    LinearLayout lLinLayout = new LinearLayout(this); 
    lLinLayout.setId(1); 
    lLinLayout.setOrientation(LinearLayout.VERTICAL); 
    lLinLayout.setGravity(Gravity.CENTER); 
    lLinLayout.setBackgroundColor(Color.BLACK); 

    LayoutParams lLinLayoutParms = new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 
    lLinLayout.setLayoutParams(lLinLayoutParms); 

    this.setContentView(lLinLayout); 


    RelativeLayout lRelLayout = new RelativeLayout(this); 
    lRelLayout.setId(2); 
    lRelLayout.setGravity(Gravity.CENTER); 
    lRelLayout.setBackgroundColor(Color.BLACK); 
    android.widget.RelativeLayout.LayoutParams lRelLayoutParms = new android.widget.RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 
    lRelLayout.setLayoutParams(lRelLayoutParms); 
    lLinLayout.addView(lRelLayout); 

    mVideoView = new VideoView(this); 
    mVideoView.setId(3); 
    android.widget.RelativeLayout.LayoutParams lVidViewLayoutParams = new android.widget.RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
    lVidViewLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); 
    mVideoView.setLayoutParams(lVidViewLayoutParams); 
    lRelLayout.addView(mVideoView); 

    mProgressBar = new ProgressBar(this); 
    mProgressBar.setIndeterminate(true); 
    mProgressBar.setVisibility(View.VISIBLE); 
    mProgressBar.setEnabled(true); 
    mProgressBar.setId(4); 
    android.widget.RelativeLayout.LayoutParams lProgressBarLayoutParms = new android.widget.RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
    lProgressBarLayoutParms.addRule(RelativeLayout.CENTER_IN_PARENT); 
    mProgressBar.setLayoutParams(lProgressBarLayoutParms); 
    lRelLayout.addView(mProgressBar); 

    mProgressMessage = new TextView(this); 
    mProgressMessage.setId(5); 
    android.widget.RelativeLayout.LayoutParams lProgressMsgLayoutParms = new android.widget.RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
    lProgressMsgLayoutParms.addRule(RelativeLayout.CENTER_HORIZONTAL); 
    lProgressMsgLayoutParms.addRule(RelativeLayout.BELOW, 4); 
    mProgressMessage.setLayoutParams(lProgressMsgLayoutParms); 
    mProgressMessage.setTextColor(Color.LTGRAY); 
    mProgressMessage.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); 
    mProgressMessage.setText("..."); 
    lRelLayout.addView(mProgressMessage); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    YouTubeUtility.markVideoAsViewed(this, mVideoId); 

    if(mQueryYouTubeTask != null){ 
     mQueryYouTubeTask.cancel(true); 
    } 

    if(mVideoView != null){ 
     mVideoView.stopPlayback(); 
    } 

    // clear the flag that keeps the screen ON 
    getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    this.mQueryYouTubeTask = null; 
    this.mVideoView = null; 

} 

public void updateProgress(String pProgressMsg){ 
    try { 
     mProgressMessage.setText(pProgressMsg); 
    } catch(Exception e) { 
     Log.e(this.getClass().getSimpleName(), "Error updating video status!", e); 
    } 
} 

private class ProgressUpdateInfo { 

    public String mMsg; 

    public ProgressUpdateInfo(String pMsg){ 
     mMsg = pMsg; 
    } 
} 

/** 
* Task to figure out details by calling out to YouTube GData API. We only use public methods that 
* don't require authentication. 
* 
*/ 
private class QueryYouTubeTask extends AsyncTask<YouTubeId, ProgressUpdateInfo, Uri> { 

    private boolean mShowedError = false; 

    @Override 
    protected Uri doInBackground(YouTubeId... pParams) { 
     String lUriStr = null; 
     // modified by Naushad Kasu - changed to 18 instead of 17 
     String lYouTubeFmtQuality = "18"; // 3gpp medium quality, which should be fast enough to view over EDGE connection 
     String lYouTubeVideoId = null; 

     if(isCancelled()) 
      return null; 

     try { 


      // if the intent is to show a playlist, get the latest video id from the playlist, otherwise the video 
      // id was explicitly declared. 
      if(pParams[0] instanceof PlaylistId){ 
       publishProgress(new ProgressUpdateInfo(mMsgPlaylist)); 
       lYouTubeVideoId = YouTubeUtility.queryLatestPlaylistVideo((PlaylistId) pParams[0]); 
      } 

      else if(pParams[0] instanceof VideoId){ 
       lYouTubeVideoId = pParams[0].getId(); 
      } 

      mVideoId = lYouTubeVideoId; 

      publishProgress(new ProgressUpdateInfo(mMsgToken)); 

      if(isCancelled()) 
       return null; 

      //////////////////////////////////// 
      // calculate the actual URL of the video, encoded with proper YouTube token 
      lUriStr = YouTubeUtility.calculateYouTubeUrl(lYouTubeFmtQuality, true, lYouTubeVideoId); 

      if(isCancelled()) 
       return null; 

      if(lYouTubeFmtQuality.equals("17")){ 
       publishProgress(new ProgressUpdateInfo(mMsgLowBand)); 
      } else { 
       publishProgress(new ProgressUpdateInfo(mMsgHiBand)); 
      } 

     } catch(Exception e) { 
      Log.e(this.getClass().getSimpleName(), "Error occurred while retrieving information from YouTube.", e); 
     } 

     if(lUriStr != null){ 
      return Uri.parse(lUriStr); 
     } else { 
      return null; 
     } 
    } 



    @Override 
    protected void onPostExecute(Uri pResult) { 
     super.onPostExecute(pResult); 

     try { 
      if(isCancelled()) 
       return; 

      if(pResult == null){ 
       throw new RuntimeException("Invalid NULL Url."); 
      } 

      mVideoView.setVideoURI(pResult); 

      if(isCancelled()) 
       return; 

      // TODO: add listeners for finish of video 
      mVideoView.setOnCompletionListener(new OnCompletionListener(){ 

       @Override 
       public void onCompletion(MediaPlayer pMp) { 
        if(isCancelled()) 
         return; 
        OpenYouTubePlayerActivity.this.finish(); 
       } 

      }); 

      if(isCancelled()) 
       return; 

      final MediaController lMediaController = new MediaController(OpenYouTubePlayerActivity.this); 
      mVideoView.setMediaController(lMediaController); 
      lMediaController.show(0); 
      //mVideoView.setKeepScreenOn(true); 
      mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 

       @Override 
       public void onPrepared(MediaPlayer pMp) { 
        if(isCancelled()) 
         return; 
        OpenYouTubePlayerActivity.this.mProgressBar.setVisibility(View.GONE); 
        OpenYouTubePlayerActivity.this.mProgressMessage.setVisibility(View.GONE); 
       } 

      }); 

      if(isCancelled()) 
       return; 

      mVideoView.requestFocus(); 
      mVideoView.start(); 
     } catch(Exception e){ 
      Log.e(this.getClass().getSimpleName(), "Error playing video!", e); 

      if(!mShowedError){ 
       showErrorAlert(); 
      } 
     } 
    } 

    private void showErrorAlert() { 

     try { 
      Builder lBuilder = new AlertDialog.Builder(OpenYouTubePlayerActivity.this); 
      lBuilder.setTitle(mMsgErrorTitle); 
      lBuilder.setCancelable(false); 
      lBuilder.setMessage(mMsgError); 

      lBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener(){ 

       @Override 
       public void onClick(DialogInterface pDialog, int pWhich) { 
        OpenYouTubePlayerActivity.this.finish(); 
       } 

      }); 

      AlertDialog lDialog = lBuilder.create(); 
      lDialog.show(); 
     } catch(Exception e){ 
      Log.e(this.getClass().getSimpleName(), "Problem showing error dialog.", e); 
     } 
    } 

    @Override 
    protected void onProgressUpdate(ProgressUpdateInfo... pValues) { 
     super.onProgressUpdate(pValues); 

     OpenYouTubePlayerActivity.this.updateProgress(pValues[0].mMsg); 
    } 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
} 
} 

avec le même code des vidéos jouent et certains ne sont pas. sa donne erreur comme ce

05-29 18:16:42.429: ERROR/QueryYouTubeTask(287): Error occurred while retrieving information from YouTube. 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287): java.lang.NullPointerException 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at java.net.URLDecoder.decode(URLDecoder.java:130) 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at java.net.URLDecoder.decode(URLDecoder.java:68) 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at com.controlledsenility.android.youtube.YouTubeUtility.calculateYouTubeUrl(YouTubeUtility.java:152) 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at com.ydemo.OpenYouTubePlayerActivity$QueryYouTubeTask.doInBackground(OpenYouTubePlayerActivity.java:392) 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at com.ydemo.OpenYouTubePlayerActivity$QueryYouTubeTask.doInBackground(OpenYouTubePlayerActivity.java:1) 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
05-29 18:16:42.429: ERROR/QueryYouTubeTask(287):  at java.lang.Thread.run(Thread.java:1096) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287): Error playing video! 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287): java.lang.RuntimeException: Invalid NULL Url. 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at com.ydemo.OpenYouTubePlayerActivity$QueryYouTubeTask.onPostExecute(OpenYouTubePlayerActivity.java:425) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at com.ydemo.OpenYouTubePlayerActivity$QueryYouTubeTask.onPostExecute(OpenYouTubePlayerActivity.java:1) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at android.os.AsyncTask.finish(AsyncTask.java:417) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at android.os.AsyncTask.access$300(AsyncTask.java:127) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at android.os.Looper.loop(Looper.java:123) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-29 18:16:42.449: ERROR/QueryYouTubeTask(287):  at dalvik.system.NativeStart.main(Native Method) 
+0

ajouter ici plus de code, cela ne suffit pas. – Sajmon

+0

Essayez de définir Intent.ACTION_VIEW au lieu de null –

+0

Dans 'doInBackground()' lUriStr est créé comme NULL et n'est jamais assigné par une valeur correcte, votre doInBackground() renvoie NULL dans tous les cas, onPoseExecute() est toujours exécuté avec un paramètre NULL pResult et donc déclencher 'throw new RuntimeException (" Url NULL invalide. ");' vous avez défini. – yorkw

Répondre

3

utilisent ce

Intent videoIntent = new Intent(null, Uri.parse("ytv:NG3WygJmiVs"), this,OpenYouTubePlayerActivity.class); 
startActivity(videoIntent); 
+0

pas d'hommes pas d'effet .... – Arpan24x7

0

utiliser ce code

startActivity(newIntent(Intent.ACTION_VIEW, Uri.parse("ytv://NG3WygJmiVs"))); 
+0

s'il vous plaît voir ma question complète –

Questions connexes