Good day! When trying to play video from VK, I encountered the following problem:

android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) at java.net.InetAddress.lookupHostByName(InetAddress.java:391) at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) at java.net.InetAddress.getAllByName(InetAddress.java:220) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) at com.dctua.vkontakte.video.VideoHelper.getVideoPlayerHTML(VideoHelper.java:124) at com.dctua.vkontakte.video.VideoHelper.openVideo(VideoHelper.java:30) 

Code:

 public class VideoGetting { public static void openVideo(Video selectedVideo, Activity activity) { String playerHTML; String error = null; try { if (selectedVideo.getPlayer() != null) { playerHTML = getVideoPlayerHTML(selectedVideo.getPlayer()); if (playerHTML.contains("youtube")) { playerHTML = playerHTML.substring(playerHTML.indexOf("embed") + 6, playerHTML.indexOf("?")); playerHTML = "http://www.youtube.com/watch?v=" + playerHTML; activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(playerHTML))); } else if (playerHTML.contains("vimeo")) { playerHTML = playerHTML.substring(playerHTML.indexOf("vimeo"), playerHTML.indexOf("?")); playerHTML = playerHTML.substring(playerHTML.lastIndexOf("video") + 6); playerHTML = "http://vimeo.com/" + playerHTML; activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(playerHTML))); } else if (playerHTML.contains("rutube")) { playerHTML = playerHTML.substring(playerHTML.indexOf("video.rutube.ru") + 16, playerHTML.indexOf(",", playerHTML.indexOf("video.rutube.ru")) - 1); playerHTML = getRutubeVideoLink(playerHTML); activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(playerHTML))); } else if (playerHTML.contains("<param name=\"flashvars\"")) { String flvString = playerHTML.substring(playerHTML.indexOf("no_flv") + 7, playerHTML.indexOf("&", playerHTML.indexOf("no_flv"))); if (flvString.equals("1")) { playerHTML = playerHTML.substring(playerHTML.indexOf("<param name=\"flashvars\""), playerHTML.indexOf("</param>", playerHTML.indexOf("<param name=\"flashvars\""))); playerHTML = createVideoUrl(playerHTML); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(playerHTML), "video/mp4"); activity.startActivity(intent); } else if (flvString.equals("0")) { playerHTML = "http://vkontakte.ru/video" + selectedVideo.getOwnerId() + "_" + selectedVideo.getVid(); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(playerHTML)); activity.startActivity(intent); } } } } catch (ParseException e) { error = activity.getResources().getString(R.string.network_error); e.printStackTrace(); } catch (IOException e) { error = activity.getResources().getString(R.string.network_error); e.printStackTrace(); } finally { if (error != null) { Toast.makeText(activity, error, Toast.LENGTH_LONG).show(); } } } private static String createVideoUrl(String flashVars) { String urlString; urlString = flashVars.substring(flashVars.indexOf("host") + 5, flashVars.indexOf("&", flashVars.indexOf("host"))); urlString = urlString + "/u"; urlString = urlString + flashVars.substring(flashVars.indexOf("uid") + 4, flashVars.indexOf("&", flashVars.indexOf("uid"))); urlString = urlString + "/video/"; urlString = urlString + flashVars.substring(flashVars.indexOf("vtag") + 5, flashVars.indexOf("&", flashVars.indexOf("vtag"))) + "."; String resolutionString = flashVars.substring(flashVars.indexOf("hd") + 3, flashVars.indexOf("&", flashVars.indexOf("hd"))); int res = Integer.parseInt(resolutionString); switch (res) { case 0: urlString = urlString + 240; break; case 2: urlString = urlString + 360; break; case 3: urlString = urlString + 480; break; case 4: urlString = urlString + 720; break; default: break; } urlString = urlString + ".mp4"; return urlString; } public static String getRutubeVideoLink(String videoId) throws IOException { String link; link = "http://rutube.ru/" + videoId; HttpParams params = new BasicHttpParams(); params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); HttpClient client = new DefaultHttpClient(params); HttpGet get = new HttpGet(link); HttpResponse response = client.execute(get); link = EntityUtils.toString(response.getEntity()); String ownerId = link.substring(link.indexOf("\n"), link.indexOf(",")).trim(); link = "http://rutube.ru/tracks/" + ownerId + ".html?v=" + videoId; return link; } public static String getVideoPlayerHTML(String player) throws org.apache.http.ParseException, IOException { HttpParams params = new BasicHttpParams(); params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); HttpClient client = new DefaultHttpClient(params); HttpGet get = new HttpGet(player); HttpResponse response = client.execute(get); return EntityUtils.toString(response.getEntity()); } 

}

Googling, came to the conclusion that you need juzat asinktask, only the question: what exactly is it to put? Thanks for the answer.

  • all web work: request, wait, buffering - Gorets
  • that is, the last two methods? - ricky

1 answer 1

  1. First you need to debug without AsyncTask and only then remove under an asynchronous call
  2. Check what exactly the URL is sent to the player, judging by the logs, the problem is in the URL syntax. Put the logs displaying url and everything will become clear