Вы не ясно указываете, какая у вас версия Android, однако я могу подтвердить, что флэш-плагин загружается, а проигрыватель фильмов интилируется с графикой в форме кружка. Я могу включить его в полноэкранный режим. Я также могу воспроизводить онлайн-видео, но не из папки ресурсов приложения, однако у меня есть обходной путь.
В вашем файле manifest.xml требуются следующие разрешения:
<uses-permission android:name="android.permission.INTERNET"></uses-permission> <!-- where required -->
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
Интересно, что я обнаружил, что смог запустить проигрыватель SWF только из папки ресурсов, когда html был статически загружен, т.е. когда я создал файл html и загрузил его непосредственно из папки ресурсов с помощью loadUrl (). Кажется, что-то блокирует доступ к каталогу приложения, когда HTML-данные загружаются с использованием метода loadDataBaseUrl.
Чтобы успешно воспроизвести видео с локального устройства, статический html-файл должен располагаться на SD-карте. Мой единственный вывод заключается в том, что папка активов не может быть использована встроенным плагином по соображениям безопасности.
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Log.d(TAG, "No SDCARD");
} else {
webView.loadUrl("file://"+Environment.getExternalStorageDirectory()+"/FLVplayer/index.html");
}
А вот и файл html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body style="margin:0; pading:0; background-color: black;">
<embed
style="width:100%; height:100%"
src="./FLVPlayer.swf?fullscreen=true&video=./expression_sad.flv"
autoplay="true"
quality="high"
bgcolor="#000000"
name="VideoPlayer"
align="middle"
allowScriptAccess="*"
allowFullScreen="true"
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer">
</embed>
</body>
</html>
Это 100% рабочее решение, но вам нужно записать html-файл на SD-карту перед вызовом loadUrl, чтобы динамически заменить имя видеофайла. Кроме того, вы должны скопировать видео из вашей папки ресурсов в тот же путь на SD-карте (как вы можете видеть из моего примера, я создал папку с именем FLVplayer.
Тест выполнен на Samsung Galaxy Tab под управлением Froyo (2.2)
UPDATE
Я включаю полное задание, которое было проверено и работает. Это предполагает, что копия Flash player, FLV-файл и файл index.html будут помещены в папку с именем «FLVplayer» в корне вашей SD-карты, которую вы можете скопировать через проводник. Вы можете редактировать различные служебные функции, чтобы изменить поведение для копирования файлов из вашей папки сборок
package com.FLVplayer;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.webkit.WebView;
import android.widget.FrameLayout;
public class FLVplayerActivity extends Activity {
private static final String TAG="FLVplayer";
private static WebView webView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webView = (WebView)findViewById(R.id.webview);
//WebView webview = new WebView(this);
//setContentView(webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setPluginsEnabled(true);
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Log.d(TAG, "No SDCARD");
} else {
//prepare the directory
File flvDirectory = new File(Environment.getExternalStorageDirectory(),"FLVplayer");
if(!flvDirectory.exists())
try {
flvDirectory.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//specify the html file name to use
File flvHtml = new File(flvDirectory,"index.html");
//copy what you need
copySwfAsset(flvDirectory, "FLVPlayer.swf");
copyFlvAsset(flvDirectory, "20051210-w50s.flv");
//render the html
createVideoHtml(flvHtml, "20051210-w50s.flv");
//load the content into the webview
webView.loadUrl(Uri.fromFile(flvHtml).toString());
//sit back, watch FLV and eat popcorn
}
}
private void createVideoHtml(File htmlFile, String htmlFileName)
{
//TODO render your own html file to sdcard
}
private void copySwfAsset(File flvDirectory, String flashFileName)
{
//TODO copy your own SWF video player file from assets
}
private void copyFlvAsset(File flvDirectory, String videoFileName)
{
//TODO copy your oown FLV file from asset folder
}
@Override
protected void onPause(){
super.onPause();
callHiddenWebViewMethod("onPause");
webView.pauseTimers();
if(isFinishing()){
webView.loadUrl("about:blank");
setContentView(new FrameLayout(this));
}
}
@Override
protected void onResume(){
super.onResume();
callHiddenWebViewMethod("onResume");
webView.resumeTimers();
}
private void callHiddenWebViewMethod(String name){
// credits: /2861923/kak-priostanovit-flash-kontent-v-android-webview-kogda-moya-aktivnost-ne-vidna content-in-an-android-webview-when-my-activity-isnt-visible
if( webView != null ){
try {
Method method = WebView.class.getMethod(name);
method.invoke(webView);
} catch (NoSuchMethodException e) {
//Lo.g("No such method: " + name + e);
} catch (IllegalAccessException e) {
//Lo.g("Illegal Access: " + name + e);
} catch (InvocationTargetException e) {
//Lo.g("Invocation Target Exception: " + name + e);
}
}
}
}
ADENDUM
Я полагаю, что может быть способ обойти проблемы безопасности, перехватывая URL-адреса различных файлов и возвращая данные непосредственно из папки ресурсов с помощью WebViewClient.shouldInterceptRequest () , но для этого требуется API 11, поэтому не подходит в качестве общего решения.