对于iOS平台的视频播放,我们可以借助Cocos2d-iphone 的Extensions:CCVideoPlayer来实现
1.导入支持cocos2d-x的扩展库到项目中(这里可以参考Himi的第六章视频播放小节内容,这里的扩展库是Himi修改好的,我就直接拿来用了!希望没有侵权!)
2.添加MediaPalyer框架到项目中
3.修改ios里AppController.h 和AppController.mm文件
AppController.h
[plain] view plain copy #import "../Classes/CCVideoPlayeriOS/CCVideoPlayer.h" @class RootViewController; @interface AppController : NSObject <UIAccelerometerDelegate, UIAlertViewDelegate, UITextFieldDelegate,UIApplicationDelegate,CCVideoPlayerDelegate> { UIWindow *window; RootViewController *viewController; } @property (nonatomic, retain) UIWindow *window; @property (nonatomic, retain) RootViewController *viewController; -(void)playVideo; @end
AppController.mm
添加using namespace cocos2d;
因为playVideo用到了cocos2d-x里的api
CCSizesize = CCDirector::sharedDirector()->getWinSize();
在application函数里添加视频播放监听
[CCVideoPlayer setDelegate :self];
playVideo实现如下:
[plain] view plain copy -(void)playVideo { CCSize size = CCDirector::sharedDirector()->getWinSize(); [CCVideoPlayer setScrrenSize:CGSizeMake(size.width-400, size.height-300)]; [CCVideoPlayer setNoSkip:true]; [CCVideoPlayer playMovieWithFile:@"xcm.mp4"]; // 播放网络视频 // [viewController playURLVideo]; }4.添加混编类IOSPlayVideo
IOSPlayVideo.h
[plain] view plain copy #ifndef __IOSPlayVideo_SCENE_H__ #define __IOSPlayVideo_SCENE_H__ class IOSPlayVideo { public: static void playVideoForIOS(); }; #endif // __IOSPlayVideo_SCENE_H__IOSPlayVideo.mm
[plain] view plain copy #include "IOSPlayVideo.h" #include "AppController.h" void IOSPlayVideo::playVideoForIOS() { AppController *app = (AppController*) [[UIApplication sharedApplication] delegate]; [app playVideo]; }
5.添加一个cocos2d-x类 :Platform
Platform.h
[plain] view plain copy #ifndef __Platform_SCENE_H__ #define __Platform_SCENE_H__ #include "cocos2d.h" using namespace cocos2d; class Platform { public: static void playVideo();//用于播放本地视频 static void playURLVideo();//用于播放网络视频 }; #endif // __Platform_SCENE_H__
Platform.mm
[plain] view plain copy #include "Platform.h" #include "../cocos2dx/platform/CCPlatformConfig.h" #if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) #include <jni.h> #include "../cocos2dx/platform/android/jni/JniHelper.h" #include <android/log.h> #elif(CC_TARGET_PLATFORM==CC_PLATFORM_IOS) #include "IOSPlayVideo.h" #endif void Platform::playVideo() { #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //Android播放本地视频 JniMethodInfo minfo; bool isHave = JniHelper::getMethodInfo(minfo,"org/cocos2dx/playvideo/playvideo","playVedio", "()V"); if (isHave) { minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID); } #elif(CC_TARGET_PLATFORM==CC_PLATFORM_IOS) //IOS播放本地视频 IOSPlayVideo::playVideoForIOS(); #endif } void Platform::playURLVideo() { #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //Android播放网络视频 JniMethodInfo minfo; bool isHave = JniHelper::getMethodInfo(minfo,"org/cocos2dx/playvideo/playvideo","playURLVideo", "()V"); if (isHave) { minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID); } #elif(CC_TARGET_PLATFORM==CC_PLATFORM_IOS) //IOS播放网络视频 IOSPlayVideo::playVideoForIOS(); #endif }
IOS项目里只需在需要的地方调用函数就可以播放视频了!
至于Android就稍微麻烦一点,需要用到Jni 技术, C++调用Java
A.修改playvideo.java
修改后如下:
[java] view plain copy package org.cocos2dx.playvideo; import org.cocos2dx.lib.Cocos2dxActivity; import org.cocos2dx.lib.Cocos2dxEditText; import org.cocos2dx.lib.Cocos2dxGLSurfaceView; import org.cocos2dx.lib.Cocos2dxRenderer; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.content.pm.ConfigurationInfo; import android.os.Bundle; import android.util.Log; import android.view.ViewGroup; import android.widget.FrameLayout; public class playvideo extends Cocos2dxActivity { //当前类实例 public static playvideo instance; //用于切换Activity public static Intent intent; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); instance =this; if (detectOpenGLES20()) { // get the packageName,it's used to set the resource path String packageName = getApplication().getPackageName(); super.setPackageName(packageName); // FrameLayout ViewGroup.LayoutParams framelayout_params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); FrameLayout framelayout = new FrameLayout(this); framelayout.setLayoutParams(framelayout_params); // Cocos2dxEditText layout ViewGroup.LayoutParams edittext_layout_params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); Cocos2dxEditText edittext = new Cocos2dxEditText(this); edittext.setLayoutParams(edittext_layout_params); // ...add to FrameLayout framelayout.addView(edittext); // Cocos2dxGLSurfaceView mGLView = new Cocos2dxGLSurfaceView(this); // ...add to FrameLayout framelayout.addView(mGLView); mGLView.setEGLContextClientVersion(2); mGLView.setCocos2dxRenderer(new Cocos2dxRenderer()); mGLView.setTextField(edittext); // Set framelayout as the content view setContentView(framelayout); intent = new Intent(playvideo.this, VedioActivity.class); } else { Log.d("activity", "don't support gles2.0"); finish(); } } void playVideo() { instance.startActivity(intent); } @Override protected void onPause() { super.onPause(); mGLView.onPause(); } @Override protected void onResume() { super.onResume(); mGLView.onResume(); } private boolean detectOpenGLES20() { ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); ConfigurationInfo info = am.getDeviceConfigurationInfo(); return (info.reqGlEsVersion >= 0x20000); } static { System.loadLibrary("game"); } } 添加两个.java文件:VideoView.java和VedioActivity.java
VideoView.java
[java] view plain copy package org.cocos2dx.playvideo; import java.io.IOException; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.net.Uri; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.MediaController; import android.widget.MediaController.MediaPlayerControl; public class VideoView extends SurfaceView implements MediaPlayerControl,Callback { private Context mContext; // settable by the client private Uri mUri; private int mDuration; // All the stuff we need for playing and showing a video private SurfaceHolder mSurfaceHolder = null; private MediaPlayer mMediaPlayer = null; private boolean mIsPrepared; private int mVideoWidth; private int mVideoHeight; private int mSurfaceWidth; private int mSurfaceHeight; private MediaController mMediaController; private OnCompletionListener mOnCompletionListener; private MediaPlayer.OnPreparedListener mOnPreparedListener; private int mCurrentBufferPercentage; private OnErrorListener mOnErrorListener; private boolean mStartWhenPrepared; private int mSeekWhenPrepared; private MySizeChangeLinstener mMyChangeLinstener; public int getVideoWidth() { return mVideoWidth; } public int getVideoHeight() { return mVideoHeight; } public void setVideoScale(int width, int height) { LayoutParams lp = getLayoutParams(); lp.height = height; lp.width = width; setLayoutParams(lp); } public interface MySizeChangeLinstener { public void doMyThings(); } public void setMySizeChangeLinstener(MySizeChangeLinstener l) { mMyChangeLinstener = l; } public VideoView(Context context) { super(context); mContext = context; initVideoView(); } public VideoView(Context context, AttributeSet attrs) { this(context, attrs, 0); mContext = context; initVideoView(); } public VideoView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; initVideoView(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //Log.i("@@@@", "onMeasure"); int width = getDefaultSize(mVideoWidth, widthMeasureSpec); int height = getDefaultSize(mVideoHeight, heightMeasureSpec); /* * if (mVideoWidth > 0 && mVideoHeight > 0) { if ( mVideoWidth * height * > width * mVideoHeight ) { //Log.i("@@@", * "image too tall, correcting"); height = width * mVideoHeight / * mVideoWidth; } else if ( mVideoWidth * height < width * mVideoHeight * ) { //Log.i("@@@", "image too wide, correcting"); width = height * * mVideoWidth / mVideoHeight; } else { //Log.i("@@@", * "aspect ratio is correct: " + //width+"/"+height+"="+ * //mVideoWidth+"/"+mVideoHeight); } } */ // Log.i("@@@@@@@@@@", "setting size: " + width + 'x' + height); setMeasuredDimension(width, height); } public int resolveAdjustedSize(int desiredSize, int measureSpec) { int result = desiredSize; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); switch (specMode) { case MeasureSpec.UNSPECIFIED: /* * Parent says we can be as big as we want. Just don't be larger * than max size imposed on ourselves. */ result = desiredSize; break; case MeasureSpec.AT_MOST: /* * Parent says we can be as big as we want, up to specSize. Don't be * larger than specSize, and don't be larger than the max size * imposed on ourselves. */ result = Math.min(desiredSize, specSize); break; case MeasureSpec.EXACTLY: // No choice. Do what we are told. result = specSize; break; } return result; } private void initVideoView() { mVideoWidth = 0; mVideoHeight = 0; getHolder().addCallback(this); getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); setFocusable(true); setFocusableInTouchMode(true); requestFocus(); } public void setVideoPath(String path) { setVideoURI(Uri.parse(path)); } public void setVideoURI(Uri uri) { mUri = uri; mStartWhenPrepared = false; mSeekWhenPrepared = 0; openVideo(); requestLayout(); invalidate(); } public void stopPlayback() { if (mMediaPlayer != null) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; } } private void openVideo() { if (mUri == null || mSurfaceHolder == null) { // not ready for playback just yet, will try again later return; } // Tell the music playback service to pause // TODO: these constants need to be published somewhere in the // framework. Intent i = new Intent("com.android.music.musicservicecommand"); i.putExtra("command", "pause"); mContext.sendBroadcast(i); if (mMediaPlayer != null) { mMediaPlayer.reset(); mMediaPlayer.release(); mMediaPlayer = null; } try { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnPreparedListener(mPreparedListener); mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); mIsPrepared = false; //Log.v(TAG, "reset duration to -1 in openVideo"); mDuration = -1; mMediaPlayer.setOnCompletionListener(mCompletionListener); mMediaPlayer.setOnErrorListener(mErrorListener); mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener); mCurrentBufferPercentage = 0; mMediaPlayer.setDataSource(mContext, mUri); mMediaPlayer.setDisplay(mSurfaceHolder); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.setScreenOnWhilePlaying(true); mMediaPlayer.prepareAsync(); attachMediaController(); } catch (IOException ex) { //Log.w(TAG, "Unable to open content: " + mUri, ex); return; } catch (IllegalArgumentException ex) { //Log.w(TAG, "Unable to open content: " + mUri, ex); return; } } public void setMediaController(MediaController controller) { if (mMediaController != null) { mMediaController.hide(); } mMediaController = controller; attachMediaController(); } private void attachMediaController() { if (mMediaPlayer != null && mMediaController != null) { mMediaController.setMediaPlayer(this); View anchorView = this.getParent() instanceof View ? (View) this .getParent() : this; mMediaController.setAnchorView(anchorView); mMediaController.setEnabled(mIsPrepared); } } MediaPlayer.OnVideoSizeChangedListener mSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() { public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { mVideoWidth = mp.getVideoWidth(); mVideoHeight = mp.getVideoHeight(); if (mMyChangeLinstener != null) { mMyChangeLinstener.doMyThings(); } if (mVideoWidth != 0 && mVideoHeight != 0) { getHolder().setFixedSize(mVideoWidth, mVideoHeight); } } }; MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { public void onPrepared(MediaPlayer mp) { // briefly show the mediacontroller mIsPrepared = true; if (mOnPreparedListener != null) { mOnPreparedListener.onPrepared(mMediaPlayer); } if (mMediaController != null) { mMediaController.setEnabled(true); } mVideoWidth = mp.getVideoWidth(); mVideoHeight = mp.getVideoHeight(); if (mVideoWidth != 0 && mVideoHeight != 0) { // Log.i("@@@@", "video size: " + mVideoWidth +"/"+ // mVideoHeight); getHolder().setFixedSize(mVideoWidth, mVideoHeight); if (mSurfaceWidth == mVideoWidth && mSurfaceHeight == mVideoHeight) { // We didn't actually change the size (it was already at the // size // we need), so we won't get a "surface changed" callback, // so // start the video here instead of in the callback. if (mSeekWhenPrepared != 0) { mMediaPlayer.seekTo(mSeekWhenPrepared); mSeekWhenPrepared = 0; } if (mStartWhenPrepared) { mMediaPlayer.start(); mStartWhenPrepared = false; if (mMediaController != null) { mMediaController.show(); } } else if (!isPlaying() && (mSeekWhenPrepared != 0 || getCurrentPosition() > 0)) { if (mMediaController != null) { // Show the media controls when we're paused into a // video and make 'em stick. mMediaController.show(0); } } } } else { // We don't know the video size yet, but should start anyway. // The video size might be reported to us later. if (mSeekWhenPrepared != 0) { mMediaPlayer.seekTo(mSeekWhenPrepared); mSeekWhenPrepared = 0; } if (mStartWhenPrepared) { mMediaPlayer.start(); mStartWhenPrepared = false; } } } }; private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { if (mMediaController != null) { mMediaController.hide(); } if (mOnCompletionListener != null) { mOnCompletionListener.onCompletion(mMediaPlayer); } } }; private MediaPlayer.OnErrorListener mErrorListener = new MediaPlayer.OnErrorListener() { public boolean onError(MediaPlayer mp, int framework_err, int impl_err) { //Log.d(TAG, "Error: " + framework_err + "," + impl_err); if (mMediaController != null) { mMediaController.hide(); } /* If an error handler has been supplied, use it and finish. */ if (mOnErrorListener != null) { if (mOnErrorListener.onError(mMediaPlayer, framework_err, impl_err)) { return true; } } /* * Otherwise, pop up an error dialog so the user knows that * something bad has happened. Only try and pop up the dialog if * we're attached to a window. When we're going away and no longer * have a window, don't bother showing the user an error. */ if (getWindowToken() != null) { /* * if (framework_err == * MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK) { * messageId = com.android.internal.R.string. * VideoView_error_text_invalid_progressive_playback; } else { * messageId = * com.android.internal.R.string.VideoView_error_text_unknown; } * * new AlertDialog.Builder(mContext) * .setTitle(com.android.internal * .R.string.VideoView_error_title) .setMessage(messageId) * .setPositiveButton * (com.android.internal.R.string.VideoView_error_button, new * DialogInterface.OnClickListener() { public void * onClick(DialogInterface dialog, int whichButton) { If we get * here, there is no onError listener, so at least inform them * that the video is over. * * if (mOnCompletionListener != null) { * mOnCompletionListener.onCompletion(mMediaPlayer); } } }) * .setCancelable(false) .show(); */ } return true; } }; private MediaPlayer.OnBufferingUpdateListener mBufferingUpdateListener = new MediaPlayer.OnBufferingUpdateListener() { public void onBufferingUpdate(MediaPlayer mp, int percent) { mCurrentBufferPercentage = percent; } }; /** * Register a callback to be invoked when the media file is loaded and ready * to go. * * @param l * The callback that will be run */ public void setOnPreparedListener(MediaPlayer.OnPreparedListener l) { mOnPreparedListener = l; } /** * Register a callback to be invoked when the end of a media file has been * reached during playback. * * @param l * The callback that will be run */ public void setOnCompletionListener(OnCompletionListener l) { mOnCompletionListener = l; } /** * Register a callback to be invoked when an error occurs during playback or * setup. If no listener is specified, or if the listener returned false, * VideoView will inform the user of any errors. * * @param l * The callback that will be run */ public void setOnErrorListener(OnErrorListener l) { mOnErrorListener = l; } @Override public boolean onTouchEvent(MotionEvent ev) { if (mIsPrepared && mMediaPlayer != null && mMediaController != null) { toggleMediaControlsVisiblity(); } return false; } @Override public boolean onTrackballEvent(MotionEvent ev) { if (mIsPrepared && mMediaPlayer != null && mMediaController != null) { toggleMediaControlsVisiblity(); } return false; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (mIsPrepared && keyCode != KeyEvent.KEYCODE_BACK && keyCode != KeyEvent.KEYCODE_VOLUME_UP && keyCode != KeyEvent.KEYCODE_VOLUME_DOWN && keyCode != KeyEvent.KEYCODE_MENU && keyCode != KeyEvent.KEYCODE_CALL && keyCode != KeyEvent.KEYCODE_ENDCALL && mMediaPlayer != null && mMediaController != null) { if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) { if (mMediaPlayer.isPlaying()) { pause(); mMediaController.show(); } else { start(); mMediaController.hide(); } return true; } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP && mMediaPlayer.isPlaying()) { pause(); mMediaController.show(); } else { toggleMediaControlsVisiblity(); } } return super.onKeyDown(keyCode, event); } private void toggleMediaControlsVisiblity() { if (mMediaController.isShowing()) { mMediaController.hide(); } else { mMediaController.show(); } } public void start() { if (mMediaPlayer != null && mIsPrepared) { mMediaPlayer.start(); mStartWhenPrepared = false; } else { mStartWhenPrepared = true; } } public void pause() { if (mMediaPlayer != null && mIsPrepared) { if (mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); } } mStartWhenPrepared = false; } public int getDuration() { if (mMediaPlayer != null && mIsPrepared) { if (mDuration > 0) { return mDuration; } mDuration = mMediaPlayer.getDuration(); return mDuration; } mDuration = -1; return mDuration; } public int getCurrentPosition() { if (mMediaPlayer != null && mIsPrepared) { return mMediaPlayer.getCurrentPosition(); } return 0; } public void seekTo(int msec) { if (mMediaPlayer != null && mIsPrepared) { mMediaPlayer.seekTo(msec); } else { mSeekWhenPrepared = msec; } } public boolean isPlaying() { if (mMediaPlayer != null && mIsPrepared) { return mMediaPlayer.isPlaying(); } return false; } public int getBufferPercentage() { if (mMediaPlayer != null) { return mCurrentBufferPercentage; } return 0; } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mSurfaceWidth = width; mSurfaceHeight = height; if (mMediaPlayer != null && mIsPrepared && mVideoWidth == width && mVideoHeight == height) { if (mSeekWhenPrepared != 0) { mMediaPlayer.seekTo(mSeekWhenPrepared); mSeekWhenPrepared = 0; } mMediaPlayer.start(); if (mMediaController != null) { mMediaController.show(); } } } public void surfaceCreated(SurfaceHolder holder) { mSurfaceHolder = holder; openVideo(); } public void surfaceDestroyed(SurfaceHolder holder) { // after we return from this we can't use the surface any more mSurfaceHolder = null; if (mMediaController != null) mMediaController.hide(); if (mMediaPlayer != null) { mMediaPlayer.reset(); mMediaPlayer.release(); mMediaPlayer = null; } } public boolean canPause() { // TODO Auto-generated method stub return false; } public boolean canSeekBackward() { // TODO Auto-generated method stub return false; } public boolean canSeekForward() { // TODO Auto-generated method stub return false; } } VedioActivity.java
[java] view plain copy package org.cocos2dx.playvideo; import android.app.Activity; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class VedioActivity extends Activity implements MediaPlayer.OnCompletionListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //隐藏标题栏 this.requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏状态栏 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //初始化视频View VideoView view =new VideoView(this); //设置显示视频View setContentView(view); //注册监听视频 view.setOnCompletionListener(this); //设置视频文件路径 view.setVideoURI(Uri.parse("android.resource://org.cocos2dx.playvideo/" + R.raw.xcm)); //播放视频 view.start(); } //当视频播放完后回调此函数 @Override public void onCompletion(MediaPlayer mp) { //结束当前Activity this.finish(); } } 注:在 res下新建一个名为raw的文件夹,将assets下xcm.mp4拷贝到raw文件夹下,否则 :raw 和xcm无法识别!!!
二.播放网络视频
IOS项目:
在RootViewController.h里添加playURLVideo函数
并导入头文件#import"MediaPlayer/MediaPlayer.h"
RootViewController.mm实现playURLVideo函数如下:
[plain] view plain copy -(void)playURLVideo { NSURL *movieUrl = [NSURL URLWithString:@"http://v.youku.com/player/getRealM3U8/vid/XMzU5NDE3NTYw/type//video.m3u8"]; MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl]; [self presentMoviePlayerViewControllerAnimated:player]; }
然后修改AppController.mm里的函数
[plain] view plain copy -(void)playVideo { // CCSize size = CCDirector::sharedDirector()->getWinSize(); // [CCVideoPlayer setScrrenSize:CGSizeMake(size.width-400, size.height-300)]; // [CCVideoPlayer setNoSkip:true]; // [CCVideoPlayer playMovieWithFile:@"xcm.mp4"]; //播放网络视频 [viewController playURLVideo]; }Android项目:修改playvideo.java
修改后如下:
[java] view plain copy package org.cocos2dx.playvideo; import org.cocos2dx.lib.Cocos2dxActivity; import android.net.Uri; import android.os.Bundle; import android.content.Intent; public class playvideo extends Cocos2dxActivity{ //当前类实例 public static playvideo instance; //用于切换Activity public static Intent intent; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); instance =this; } void playURLVideo() { Intent intent = new Intent(Intent.ACTION_VIEW); String type = "video/* "; Uri uri = Uri.parse("http://forum.ea3w.com/coll_ea3w/attach/2008_10/12237832415.3gp"); intent.setDataAndType(uri, type); instance.startActivity(intent); } static { System.loadLibrary("game"); } }
