- 浏览: 129091 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
newhxj:
03-21 10:56:35.850: E/Web Conso ...
Android简易Flash播放器[转] -
roiz:
谢谢 很好正需要这资料
精确监听AbsListView滚动至底部[转]
上一节,大体说了下在Android程序中嵌套Flash动画。这次按照上次的内容做个扩展,做个简易的flash播放器。
前提条件如上一节所说,需要Android2.2平台和安装flash的插件。
先看工程图和效果图:
工程源码:
package com.geolo.android.flash; import com.geolo.android.FileBrowser; import com.geolo.android.R; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.webkit.WebChromeClient; import android.webkit.WebSettings.PluginState; import android.webkit.WebView; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ProgressBar; public class FlashActivity extends Activity{ private WebView mWebView; private Button playButton,pauseButton,rewindButton,exitButton,fileButton; private ProgressBar mProgressBarHorizontal; private final static int PROGRESSBARSIZE = 0x0000; private final static int FLASH_START = 0x0001; private String flashName ; private boolean stopThread = false; private ProgressDialog mProgressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("Flash动画正在加载,请稍等......"); mProgressDialog.show(); Intent intent = this.getIntent(); String fileName = intent.getStringExtra("fileName"); if(fileName != null && !fileName.equals("")){ flashName = "file://"+fileName; //flashName = "javascript:setFlashPath(flashName)"; }else{ flashName = "file:///android_asset/sample/flash.swf"; } Log.d(this.getClass().getName(), flashName); mWebView = (WebView)findViewById(R.id.webView01); mProgressBarHorizontal = (ProgressBar)findViewById(R.id.progress_horizontal); this.setProgress(mProgressBarHorizontal.getProgress() * 100); //this.setSecondaryProgress(mProgressBarHorizontal.getSecondaryProgress() * 100); playButton = (Button)findViewById(R.id.playButton); pauseButton = (Button)findViewById(R.id.pauseButton); rewindButton = (Button)findViewById(R.id.rewindButton); exitButton = (Button)findViewById(R.id.exitButton); fileButton = (Button)findViewById(R.id.fileButton); playButton.setOnClickListener(buttonListener); pauseButton.setOnClickListener(buttonListener); rewindButton.setOnClickListener(buttonListener); exitButton.setOnClickListener(buttonListener); fileButton.setOnClickListener(buttonListener); mWebView.getSettings().setJavaScriptEnabled(true); //mWebView.getSettings().setPluginsEnabled(true); mWebView.getSettings().setPluginState(PluginState.ON); mWebView.setWebChromeClient(new WebChromeClient()); mWebView.addJavascriptInterface(new CallJava(), "CallJava"); mWebView.loadUrl("file:///android_asset/sample/index.html"); //mWebView.loadUrl("javascript:setFlashPath('"+flashName+"')"); startThread(); } Button.OnClickListener buttonListener = new Button.OnClickListener() { @Override public void onClick(View v) { int buttonID = v.getId(); switch (buttonID) { case R.id.playButton: mWebView.loadUrl("javascript:Play()"); showFlashProgress(5); break; case R.id.pauseButton: mWebView.loadUrl("javascript:Pause()"); break; case R.id.rewindButton: //mWebView.loadUrl(flashName); try { mWebView.loadUrl("about:blank"); mWebView.loadUrl("file:///android_asset/sample/index.html"); Thread.sleep(1000); mWebView.loadUrl("javascript:setFlashPath('"+flashName+"')"); } catch (InterruptedException e) { Log.e(this.getClass().getName(), "Flash Rewind error: ", e); } break; case R.id.fileButton: Intent intent = new Intent(); intent.setClass(FlashActivity.this, FileBrowser.class); startActivity(intent); stopThread = true; FlashActivity.this.finish(); break; case R.id.exitButton: quitDialog(); break; default: break; } } }; public void showFlashProgress(float progressSize){ int size = (int)progressSize; //Toast.makeText(this, size+"", Toast.LENGTH_SHORT).show(); mProgressBarHorizontal.setProgress(size); } private void quitDialog(){ new AlertDialog.Builder(this) .setMessage("没胆就不要退出") .setPositiveButton("比你有胆", new AlertDialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { stopThread = true; FlashActivity.this.finish(); } }) .setNegativeButton("怕你了", null) .show(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: quitDialog(); break; default: break; } return false; } @Override protected void onPause(){ super.onPause(); mWebView.pauseTimers(); if(isFinishing()){ mWebView.loadUrl("about:blank"); setContentView(new FrameLayout(this)); } } @Override protected void onResume(){ super.onResume(); mWebView.resumeTimers(); } private final class CallJava{ public void consoleFlashProgress(float progressSize){ showFlashProgress(progressSize); } } private void startThread(){ //通过线程来改变ProgressBar的值 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2000); Message message = new Message(); message.what = FlashActivity.FLASH_START; FlashActivity.this.myMessageHandler.sendMessage(message); } catch (InterruptedException e1) { Thread.currentThread().interrupt(); } while(!stopThread && !Thread.currentThread().isInterrupted()){ try { Thread.sleep(2000); Message message2 = new Message(); message2.what = FlashActivity.PROGRESSBARSIZE; FlashActivity.this.myMessageHandler.sendMessage(message2); } catch (Exception e) { Thread.currentThread().interrupt(); } } } }).start(); } Handler myMessageHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case FlashActivity.PROGRESSBARSIZE: mWebView.loadUrl("javascript:showcount()"); break; case FlashActivity.FLASH_START: mWebView.loadUrl("javascript:setFlashPath('"+flashName+"')"); Log.d(this.getClass().getName(),"Start flash : "+flashName); mProgressDialog.dismiss(); break; default: break; } super.handleMessage(msg); } }; }
package com.geolo.android; import java.io.File; import java.util.List; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class FileListAdapter extends ArrayAdapter<File>{ public FileListAdapter(Context context, int Resource,List<File> objects) { super(context,Resource,objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView view = (TextView)super.getView(position, convertView, parent); File file = getItem(position); if (position == 0){ view.setText("当前目录:/root" + file.getAbsolutePath()); }else if (position == 1 && !isRoot()){ view.setText("返回上一个目录"); }else{ view.setText(file.getName()); } return view; } public boolean isRoot() { return getItem(0).getParent() == null; } }
package com.geolo.android; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.List; import com.geolo.android.flash.FlashActivity; import android.app.ListActivity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.widget.ListView; public class FileBrowser extends ListActivity { private static final FileFilter FILTER = new FileFilter() { public boolean accept(File f) { //return f.isDirectory() || f.getName().matches("^.*?//.(jpg|png|bmp|gif)$"); return true; } }; private FileListAdapter fileList; public void onCreate(Bundle icicle) { super.onCreate(icicle); File sdcard = android.os.Environment.getExternalStorageDirectory(); fill(sdcard); } public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && !fileList.isRoot()) { fill(fileList.getItem(1)); Intent intent = new Intent(); intent.setClass(FileBrowser.this, FlashActivity.class); startActivity(intent); //return true; } return super.onKeyDown(keyCode, event); } private void fill(File folder) { List<File> files = new ArrayList<File>(); files.add(folder); if (folder.getParentFile() != null){ files.add(folder.getParentFile()); } for (File file : folder.listFiles(FILTER)) { files.add(file); } fileList = new FileListAdapter(this, android.R.layout.simple_list_item_1, files); setListAdapter(fileList); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { File file = fileList.getItem(position); Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); if (file.isDirectory()){ fill(file); }else if(file.getName().matches("^.*?//.(jpg|png|bmp|gif)$")){ intent.setDataAndType(Uri.fromFile(file), "image/*"); startActivity(intent); }else if(file.getName().matches("^.*?//.(swf)$")){ intent.setClass(FileBrowser.this, FlashActivity.class); intent.putExtra("fileName", file.getAbsolutePath().replace("/mnt", "")); startActivity(intent); FileBrowser.this.finish(); } } }
<mce:script src="play.js" mce_src="play.js"></mce:script> <table border="0" cellpadding="0" cellspacing="1" bgcolor="#000000"> <tr> <td> <object id="movie" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" align="middle"> <param name="movie" value="about:blank" /> <param name="quality" value="high" /> </object> </td> </tr> </table> <!-- <a href="javascript:CallJava.consoleFlashProgress(3)" mce_href="javascript:CallJava.consoleFlashProgress(3)">add Progress</a> <a href="#" mce_href="#" onClick="loadSWF('','testFlash.swf','800','480')">TestButton</a> --> <p id="geolo"></p> <mce:script type="text/javascript"><!-- //loadSWF("testFlash.swf","800","480"); //loadSWF("flash地址","宽度","高度") function setFlashPath(filePath){ var path = filePath; loadSWF(path,"800","480"); //loadSWF("flash地址","宽度","高度") //geolo.innerText = "abc: " + filePath.toString(); } // --></mce:script>
var total;//定义flash影片总桢数 var frame_number;//定义flash影片当前桢数 //以下是滚动条图片拖动程序 var dragapproved=false; var z,x,y //动态显示播放影片的当前桢/总桢数(进度条显示) function showcount(){ //已测可用CallJava.consoleFlashProgress(5); total = movie.TotalFrames; frame_number=movie.CurrentFrame(); frame_number++; var progressSize = 100*(frame_number/movie.TotalFrames()); CallJava.consoleFlashProgress(progressSize); } //播放影片 function Play(){ movie.Play(); } //暂停播放 function Pause(){ movie.StopPlay(); } //开始载入flash影片 function loadSWF(fsrc,fwidth,fheight){ movie.LoadMovie(0, fsrc); movie.width=fwidth; movie.height=fheight; frame_number=movie.CurrentFrame(); }
main.xml
<?xml version="1.0" encoding="utf-8"?> <!-- autor:geolo 声明:版权所有,违者必究 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <WebView android:id="@+id/webView01" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ProgressBar android:id="@+id/progress_horizontal" style="?android:attr/progressBarStyleHorizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:max="100" android:progress="0" android:secondaryProgress="0" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/playButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放" /> <Button android:id="@+id/pauseButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂停" /> <Button android:id="@+id/rewindButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="重播" /> <Button android:id="@+id/fileButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="打开文件" /> <Button android:id="@+id/exitButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="退出" /> </LinearLayout> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.geolo.android" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".flash.FlashActivity" android:label="@string/app_name" android:screenOrientation="landscape" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".FileBrowser" /> </application> <supports-screens android:resizeable="true" android:smallScreens="true" android:largeScreens="true" android:normalScreens="true" android:anyDensity="true"></supports-screens> </manifest>工程打包资源下载:http://download.csdn.net/source/2926306
评论
1 楼
newhxj
2013-03-21
03-21 10:56:35.850: E/Web Console(1254): Uncaught TypeError: Object #<an HTMLObjectElement> has no method 'LoadMovie' at file:///android_asset/sample/play.js:28
03-21 10:56:37.540: E/Web Console(1254): Uncaught TypeError: Object #<an HTMLObjectElement> has no method 'Play' at file:///android_asset/sample/play.js:19
03-21 10:56:37.710: E/Web Console(1254): Uncaught TypeError: Object #<an HTMLObjectElement> has no method 'CurrentFrame' at file:///android_asset/sample/play.js:11
报这样的错啊
03-21 10:56:37.540: E/Web Console(1254): Uncaught TypeError: Object #<an HTMLObjectElement> has no method 'Play' at file:///android_asset/sample/play.js:19
03-21 10:56:37.710: E/Web Console(1254): Uncaught TypeError: Object #<an HTMLObjectElement> has no method 'CurrentFrame' at file:///android_asset/sample/play.js:11
报这样的错啊
发表评论
-
android Theme使用总结
2012-12-12 19:22 1425今天对api中style下的theme整个摸了一遍。 ... -
android优化——adapter
2012-12-12 18:56 1470什么是Adapter,可以先看看我的上一篇文章,Andr ... -
listview样式设置——自定义背景、分隔[转]
2012-12-12 14:13 784在Android中,ListView是最常用的一个控件, ... -
draw9patch不失真背景
2012-12-12 00:23 12931.背景自适应且不失真问题的存在 制作自适应背 ... -
android布局之selector(背景选择器)[转]
2012-12-11 23:07 2817关于listview和button都 ... -
android布局之RelativeLayout属性
2012-12-11 23:06 1182android:layout_above ... -
Android ListView下拉刷新点击加载更多[转]
2012-12-03 09:04 1683这个ListView的下拉刷新算是不错了。网上找了很多个 ... -
BitmapFactory.Options详解[转]
2012-11-21 20:50 3281public Bitmap in ... -
Java基于Socket文件传输示例[转]
2012-11-21 17:58 711最近需要进行网络传输大文件,于是对基于socket的文件传输作 ... -
Java基础:三步学会Java Socket编程3[转]
2012-11-21 17:17 787第三步 实现信息共享:在Socket上的实时交流 网络的 ... -
Java基础:三步学会Java Socket编程2[转]
2012-11-21 17:15 712第二步 多个客户同时连接 在实际的网络环境里,同一时间只 ... -
Java基础:三步学会Java Socket编程1[转]
2012-11-21 17:12 793第一步 充分理解Socket ... -
一步步优化JVM七:其他[转]
2012-11-10 23:37 987边缘问题 在某 ... -
一步步优化JVM六:优化吞吐量[转]
2012-11-07 00:23 6977如果你已经进行 ... -
一步步优化JVM五:优化延迟或者响应时间(3)[转]
2012-11-07 00:20 6661CMS垃圾回收器周期 一旦young的空 ... -
一步步优化JVM五:优化延迟或者响应时间(2)[转]
2012-11-07 00:13 1561优化CMS(concurrent garbage col ... -
一步步优化JVM五:优化延迟或者响应时间(1)[转]
2012-11-06 23:35 1100本节的目标是做 ... -
一步步优化JVM四:决定Java堆的大小和内存占用[转]
2012-11-06 19:21 1090到目前为止,还没有做明确的优化工作。只是做了初始 ... -
一步步优化JVM三:GC优化基础[转]
2012-11-06 18:52 1110本节主要描述关于垃圾回收器性能的三个指标,三 ... -
一步步优化JVM二:JVM部署模型和JVM Runtime[转]
2012-11-06 18:27 1194选择JVM部署模型 JVM部署模型的选择总体来说 ...
相关推荐
Android简易flash播放器Android简易flash播放器Android简易flash播放器Android简易flash播放器Android简易flash播放器Android简易flash播放器Android简易flash播放器Android简易flash播放器
Android Flash简易播放器 利用WebView播放
多款Android播放器源码集锦【】android 2.2 简易音乐播放器实现(附全部实现代码)【】Android 在线播放器源码【】Android 音乐播放器【】Android传说中的3D播放器源码【】android开发的简易flash播放器(geolo)...
10.9 转转轮盘——lucky! 756 10.10 任务管理器 758 10.11 免费的云端发音字典 760 10.12 动起来!手机桌面上会动的动态桌布 764 10.13 正妹墙相簿浏览器 769 10.14 youtube影片flv文件下载器 779...
全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...
全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...
全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...
全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...
全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及...
Flash动画在线播放 您可能感兴趣的文章:30分钟学会用PHP写带数据库的简单通讯录一个简单的python程序实例(通讯录)Android通讯录开发之删除功能的实现方法AngularJS + Node.js + MongoDB开发的基于高德地图位置的...
IrrEdit现在已经改名为CopperCube了,CopperCube是商业软件,可以提供简单的场景编辑,并最终导出为ccb格式或发布为Windows、Mac OSX、Flash、WebGL、Android应用。从这个角度来说它倒比较像Unity3D以及最近刚出的...
其后在9.0版本将Flash播放器内置在沙盒中独立运行。这项技术是Chrome安全性进步的一座里程碑。对Windows XP用户特别重要,因为它是平台上唯一提供Flash嵌入沙盒运行的浏览器。从8.0版本起,“Google Chrome”内置在...
此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...
此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...
WebKit简易小巧,并能有效率的运用内存,符合Google理念,并且对新开发者来说相当容易上手。 [编辑本段]使用者界面 Gears Chrome包含了Google Gears,研发者可利用这项功能制作网页应用程序(web applications...
J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...