2012-01-17 5 views
3

У нас есть несколько приложений на Android Market, которые мы также отправили Amazon в свой Appstore для Android. Все хорошо работало, пока не появился Kindle Fire. В нескольких наших приложениях мы запускаем видео Youtube со ссылкой на WebView. Вот соответствующий код из setOnClickListener, что толкает вид и обрабатывает ссылку Youtube:Kindle Fire и Youtube Ссылки в WebView

mWebView.setWebViewClient (new WebViewClient() { 
    @ Override public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith("vnd.youtube")){ 
      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); 
      return true; 
     } else{ 
      return false; 
     } 
    } 
}); 

Как я уже сказал, это прекрасно работает на всех Android устройств, которые мы тестировали, но мы получаем уведомление от Amazon, что они получают сбои при нажатии на ссылки на видео. Я предполагаю, что это происходит потому, что Fire не загружается с помощью приложения YouTube. Кто-нибудь еще сталкивался с подобными проблемами? Каким будет предпочтительный метод для воспроизведения видео с YouTube с веб-просмотра на Fire?

Вот LogCat поставляется Amazon:

01-09 12:28:32.715 W/dalvikvm(5805): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
01-09 12:28:32.715 D/ActivityManager(1372): Starting: Intent { act=android.intent.action.VIEW dat=vnd.youtube://XXXXXXXXXX } from pid 5805 
01-09 12:28:32.793 E/AndroidRuntime(5805): FATAL EXCEPTION: main 
01-09 12:28:32.793 E/AndroidRuntime(5805): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=vnd.youtube://XXXXXXXXXX } 
01-09 12:28:32.793 E/AndroidRuntime(5805): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1409) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1379) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at android.app.Activity.startActivityFromChild(Activity.java:3103) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at android.app.Activity.startActivityForResult(Activity.java:2883) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at android.app.Activity.startActivity(Activity.java:2969) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at com.XXXXXXXXXX.XXXXXXXXXX.VideoActivity$1$1.shouldOverrideUrlLoading(VideoActivity.java) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:216) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:323) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at android.os.Looper.loop(Looper.java:130) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at android.app.ActivityThread.main(ActivityThread.java:3683) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at java.lang.reflect.Method.invokeNative(Native Method) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at java.lang.reflect.Method.invoke(Method.java:507) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:850) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
01-09 12:28:32.793 E/AndroidRuntime(5805): at dalvik.system.NativeStart.main(Native Method) 

Редактировать

Я был в состоянии получить эту работу должным образом в настоящее время. В основном, я скопировал папку видео (которая содержит все html для видеостраниц) в активах в новый каталог video_fire. Я обновил фактический код, чтобы указать на каталог video_fire, если android.os.Build.MODEL - это «Kindle Fire» и обычный каталог видео для всех остальных. Я также изменил выделение webview, чтобы использовать getParent(), а не VideoActivity.this. Это зафиксировало проблему, которую я описал в комментариях о полноэкранных дисплеях. Ниже обновленный код, который я использовал (при нажатии на элемент в ListView отображается соответствующий HTML-страницы):

public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
    String contentsOfHtml; 
    try { 
     if (android.os.Build.MODEL.equals("Kindle Fire")) { 
      contentsOfHtml = readFileAsString("video_fire/"+htmlarray[position]); 
     } else { 
      contentsOfHtml = readFileAsString("video/"+htmlarray[position]); 
     } 
    } catch (IOException e) { 
     // Should never happen! 
     throw new RuntimeException(e); 
    } 
    WebView mWebView = new WebView(getParent()); 
    WebSettings webSettings = mWebView.getSettings(); 
    webSettings.setPluginsEnabled(true); 
    webSettings.setJavaScriptEnabled(true); 
    mWebView.setWebViewClient (new WebViewClient() { 
     @ Override public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith("vnd.youtube")){ 
      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); 
      return true; 
     } else{ 
      return false; 
     } 
     } 
    }); 
mWebView.loadDataWithBaseURL("file:///android_asset/", contentsOfHtml, "text/html", "utf-8", ""); 
ReflectionGroup.group.replaceView(mWebView); 
return; 
}); 

Да, я использую ActivityGroup, которая амортизируется (это старый код). Я работаю над обновлением базового кода, который использует это, чтобы реализовать Fragments ...

Я тогда HTML для обычных устройств:

<html> 
<head> 
    <link href="style.css" rel="stylesheet" type="text/css"> 
</head> 
<body> 
    <p class="title">Title</p> 
    <hr/> 
    <a href="vnd.youtube://XXXXX"><div><center><img src="images/video1.jpg" width="220" height="150"></center></div></a> 
    </center> 
    <p class="para">Text</p> 
    <hr/>  
</body> 
</html> 

И специфический HTML для Kindle Fire. Полагаю, я должен проверить, будет ли этот код работать и на других устройствах, но это нужно будет поместить в список дел.

<html> 
<head> 
    <link href="style.css" rel="stylesheet" type="text/css"> 
</head> 
<body> 
    <p class="title">Title</p> 
    <hr/> 
<iframe class="youtube-player" type="text/html" width="600" height="361" src="http://www.youtube.com/embed/XXXXXXXX" frameborder="0"> 
</iframe> 
    </center> 
    <p class="para">Text </p> 
    <hr/>  
</body> 
</html> 
+0

Вы нашли решение? – akkilis

+0

Я только что купил огонь разжигания сегодня, и я работаю над его тестированием. У меня есть видео для воспроизведения с использованием стандартного iframe, но при воспроизведении видео, если я нажму на кнопку полного экрана в кадре, он закроет: 01-23 21: 58: 27.093: E/AndroidRuntime (2485) : android.view.WindowManager $ BadTokenException: Не удается добавить оконный токен android.app.LocalActivityManager$LocalActivityRecord @ 405315a8 недействителен; работает ли ваша деятельность? – WookieLNX

+0

изменен мой ответ. Вы также должны обновить свой вопрос, добавив к нему эту новую проблему, чтобы увидеть его в списке и ответить на него – akkilis

ответ

1

Попытка поймать это исключение с определенным типом исключения, а затем написать код, чтобы запустить браузер по editting свой адрес (запустить его с «HTTP», иначе он не будет открыт в веб-браузере).

....
catch(ActivityNotFoundException e){
url = YOUR_URL_STARTING_WITH_HTTP;
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
}



Editted Раздел:
Теперь вот другая проблема, как правило, приходит, если вид называется или пытался показать/изменить после того, как деятельность закончена. Вы делаете что-то в onPostExecuted(), связанном с ui в любой из задач async? Это может произойти после того, как действие создало эту задачу.

+0

Какой смысл делать это, если он делает то же самое, что и пытался? – JoxTraex

1

если нет ничего, что могло бы обрабатывать ссылки на youtube. Тогда у вас уже есть проблема.

Эта ошибка ясно сказано:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=vnd.youtube://XXXXXXXXXX } 

Смысла ничего в системе может работать, я не думаю, что вы сделали что-то неправильно, но потом снова я не знаком с платформой разжигать огонь. Однако; с некоторым использованием PackageManager, вы можете понять это.

+0

Kindle Fire не поставляется с приложением YouTube, тогда как почти все устройства Android установлены по умолчанию. Фактически, в App Store Amazon нет официального приложения YouTube. Я думаю, что есть некоторая плохая кровь между Amazon и Google, которая мешает ей быть там ... – WookieLNX

+0

Если это действительно так, тогда вам придется зависеть от браузера, чтобы отображать ссылки на YouTube, которые, возможно, извлекут его из ваших рук если вы не измените webview как его запуск. – JoxTraex

+0

Вы можете посмотреть мое решение выше. Пока это работает хорошо, так как я просто встраиваю видео в веб-просмотр. – WookieLNX

Смежные вопросы