Kindle Fire и ссылки на Youtube в WebView - PullRequest
3 голосов
/ 17 января 2012

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

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», и на обычный каталог видео для всего остального.Я также изменил распределение веб-просмотров, чтобы использовать 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, которая устарела (это старый код),Я работаю над обновлением базового кода, который он использует для реализации фрагментов ...

Затем у меня есть 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>

Ответы [ 2 ]

1 голос
/ 24 января 2012

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

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

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

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

1 голос
/ 17 января 2012

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

....<br>catch(ActivityNotFoundException e){<br> url = YOUR_URL_STARTING_WITH_HTTP;<br>startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));<br>}</p> <p></i>



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

...