Intent.ACTION_VIEW URL видео не работает на Ice Cream Sandwhich - PullRequest
5 голосов
/ 28 ноября 2011

У меня есть следующий код для просмотра удаленного видеофайла:

startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse(article.getLink())));

, где getLink() возвращает URL видео, связанного со статьей.

Этот подход сработалнормально на устройствах вплоть до Gingerbread, но я недавно тестировал приложение на ICS и обнаружил проблему.Браузер ICS начинает загружать URL, и я вижу его в навигационной панели, но затем почти сразу же браузер закрывается, и я возвращаюсь к активности моего приложения.

Я получаю следующую трассировку стека, когда онаслучается:

11-28 10:24:44.488: E/SurfaceTexture(116): [com.mypackage.myapp/com.mypackage.myapp.MyVideoActivity] connect: already connected (cur=2, req=2)
11-28 10:24:44.488: E/ViewRootImpl(25384): IllegalArgumentException locking surface
11-28 10:24:44.488: E/ViewRootImpl(25384): java.lang.IllegalArgumentException
11-28 10:24:44.488: E/ViewRootImpl(25384):  at android.view.Surface.lockCanvasNative(Native Method)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at android.view.Surface.lockCanvas(Surface.java:76)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at android.view.ViewRootImpl.draw(ViewRootImpl.java:1924)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1613)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at android.os.Looper.loop(Looper.java:137)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at android.app.ActivityThread.main(ActivityThread.java:4340)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at java.lang.reflect.Method.invokeNative(Native Method)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at java.lang.reflect.Method.invoke(Method.java:511)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-28 10:24:44.488: E/ViewRootImpl(25384):  at dalvik.system.NativeStart.main(Native Method)

Кто-нибудь еще видел такое поведение / знает об исправлении?

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

Я попробовал несколько вещей и обнаружил, явно устанавливая тип данных данных в рамках предполагаемой работы.

Intent videoIntent =new Intent(Intent.ACTION_VIEW);
videoIntent.setDataAndType(Uri.parse(article.getLink()), "video/*");
startActivity(videoIntent);

Примечание: я также столкнулся с подобной ошибкой в ​​Gingerbread 2.3.6.

0 голосов
/ 01 декабря 2011

Не видел этого, но обходной путь мог бы заключаться в том, чтобы явно вызывать приложение youtube (если оно установлено), а не позволять браузеру обрабатывать его.

/**
 * @param context
 * @param url To display, such as http://www.youtube.com/watch?v=t_c6K1AnxAU
 * @return an Intent to start the YouTube Viewer. If it is not found, will
 *         return a generic video-play intent, and system will display a
 *         chooser to ther user.
 */
public static Intent getYouTubeIntent(Context context, String url) {
  Intent videoIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
  final PackageManager pm = context.getPackageManager();
  List<ResolveInfo> activityList = pm.queryIntentActivities(videoIntent, 0);
  for (int i = 0; i < activityList.size(); i++) {
    ResolveInfo app = activityList.get(i);
    if (app.activityInfo.name.contains("youtube")) {
      videoIntent.setClassName(app.activityInfo.packageName, app.activityInfo.name);
      return videoIntent;
    }
  }
  return videoIntent;
}

Код от @Guy -> https://stackoverflow.com/a/6674637/31751

...