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.