diff --git a/README-ZH.md b/README-ZH.md index bc4b0fcce..9a788f60a 100644 --- a/README-ZH.md +++ b/README-ZH.md @@ -2,17 +2,15 @@ --

- +

-真正实现Android的全屏功能,立志成为Android平台使用最广泛的视频播放控件 Q群:490442439 - -正在全力研究 头条视频 和 天天快报 那样的用android.media.MediaPlayer小窗播放的功能,重点是在切换SurfaceView的时候或removeView的时候视频能连续播放. +立志成为Android平台使用最广泛的视频播放控件 Q群:490442439 验证信息:jcvd ##主要特点 -1. 全屏时启动新`Activity`实现播放器真正的全屏功能 +1. 视频全屏播放和浮层小窗播放 2. 可以完全自定义UI 3. 能在`ListView`、`ViewPager`和`ListView`、`ViewPager`和`Fragment`等多重嵌套模式下全屏工作 4. 手势修改进度和音量 @@ -23,7 +21,7 @@ ##效果 -**[jiecaovideoplayer-4.5_preview1-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.5_preview1-demo.apk)** +**[jiecaovideoplayer-4.6-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.6-demo.apk)** ![Demo Screenshot][1] @@ -33,14 +31,14 @@ 1.添加类库 ```gradle -compile 'fm.jiecao:jiecaovideoplayer:4.5_preview1' +compile 'fm.jiecao:jiecaovideoplayer:4.6' ``` 或直接下载 -* [jiecaovideoplayer-4.5_preview1.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.5_preview1.aar) -* [jiecaovideoplayer-4.5_preview1-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.5_preview1-javadoc.jar) -* [jiecaovideoplayer-4.5_preview1-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.5_preview1-sources.jar) +* [jiecaovideoplayer-4.6.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.6.aar) +* [jiecaovideoplayer-4.6-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.6-javadoc.jar) +* [jiecaovideoplayer-4.6-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.6-sources.jar) 2.添加布局 ```xml @@ -52,39 +50,32 @@ compile 'fm.jiecao:jiecaovideoplayer:4.5_preview1' 3.设置视频地址、缩略图地址、标题 ```java -JCVideoPlayerStandard jcVideoPlayerStandard = (JCVideoPlayerStandard) findViewById(R.id.custom_videoplayer_standard); -jcVideoPlayerStandard.setUp("http://2449.vod.myqcloud.com/2449_bfbbfa3cea8f11e5aac3db03cda99974.f20.mp4" - , "嫂子想我没"); +JCVideoPlayerStandard jcVideoPlayerStandard = (JCVideoPlayerStandard) findViewById(R.id.jc_video); +jcVideoPlayerStandard.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4" + , JCVideoPlayerStandard.SCREEN_LAYOUT_LIST, "嫂子闭眼睛"); jcVideoPlayerStandard.thumbImageView.setThumbInCustomProject("http://p.qpic.cn/videoyun/0/2449_43b6f696980311e59ed467f22794e792_1/640"); ``` -4.在包含播放器的`Fragment`或`Activity`的`onPause()`方法中调用`JCVideoPlayer.releaseAllVideos();` +4.在包含播放器的`Fragment`的`onPause()`方法中调用`JCVideoPlayer.releaseAllVideos();` ####其他接口 直接进入全屏,比如在webview中视频播放的适配很麻烦很无头绪,调用此接口直接全屏播放 ```java -JCFullScreenActivity.startActivity(this, - "http://video.jiecao.fm/5/1/%E8%87%AA%E5%8F%96%E5%85%B6%E8%BE%B1.mp4", - JCVideoPlayerStandard.class, - "嫂子别摸我"); -``` - -用代码控制播放按钮的点击,如果是普通状态会播放视频,如果是播放中会暂停视频 -```java -jcVideoPlayerStandard.startButton.performClick(); +敬请期待 ``` ####混淆 ``` -无需添加 +-keep class tv.danmaku.ijk.** { *; } +-dontwarn tv.danmaku.ijk.** ``` ##[自定义UI](./README_CUSTOM_UI-ZH.md) ##贡献者 -[Nathen](https://github.com/lipangit) [Derlio](https://github.com/derlio) [zhangzzqq](https://github.com/zhangzzqq) [carmelo-ruota](https://github.com/carmelo-ruota) [wxxsw](https://github.com/wxxsw) [Miguel Aragues](https://github.com/Maragues) +[Nathen](https://github.com/lipangit) [Derlio](https://github.com/derlio) [zhangzzqq](https://github.com/zhangzzqq) [carmelo-ruota](https://github.com/carmelo-ruota) [wxxsw](https://github.com/wxxsw) [Miguel Aragues](https://github.com/Maragues) [e16din](https://github.com/e16din) ## License MIT @@ -96,4 +87,4 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -[1]: ./screenshots/j6.jpg +[1]: ./screenshots/j7.jpg diff --git a/README.md b/README.md index e1891d78a..af11eaf3d 100644 --- a/README.md +++ b/README.md @@ -2,21 +2,20 @@ --

- +

* This project need translators, mother language is english, you can change everything edit readme, release note, formate variable and annotation. -* Now the research target is android.media.MediaPlayer setSurface by more surfaces the video is always continuous. -Android truly full-screen capabilities, the Android platform to become the most widely used video playback controls. Q Group:490442439 +Ambition is become the most widely used video playback control. [中文文档](README-ZH.md) ## Features -1. Launching new Fullscreen Activity when playing video in fullscreen mode +1. Video fullscreen and float tiny window 2. Completely custom ui 3. In `ListView`、`ViewPager` and `ListView`、`ViewPager` and `Fragment` and other nested fragments and views situation, it works well 4. Gestrues to modify progress and volume @@ -27,7 +26,7 @@ Android truly full-screen capabilities, the Android platform to become the most ## Effect -**[jiecaovideoplayer-4.5_preview1-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.5_preview1-demo.apk)** +**[jiecaovideoplayer-4.6-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.6-demo.apk)** ![Demo Screenshot][1] @@ -37,14 +36,14 @@ Android truly full-screen capabilities, the Android platform to become the most 1.Import library ```gradle -compile 'fm.jiecao:jiecaovideoplayer:4.5_preview1' +compile 'fm.jiecao:jiecaovideoplayer:4.6' ``` Or download lib -* [jiecaovideoplayer-4.5_preview1.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.5_preview1.aar) -* [jiecaovideoplayer-4.5_preview1-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.5_preview1-javadoc.jar) -* [jiecaovideoplayer-4.5_preview1-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.5_preview1-sources.jar) +* [jiecaovideoplayer-4.6.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.6.aar) +* [jiecaovideoplayer-4.6-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.6-javadoc.jar) +* [jiecaovideoplayer-4.6-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-4.6-sources.jar) 2.Add JCVideoPlayer in your layout ```xml @@ -56,39 +55,32 @@ Or download lib 3.Set the video uri, video thumb url and video title ```java -JCVideoPlayerStandard jcVideoPlayerStandard = (JCVideoPlayerStandard) findViewById(R.id.custom_videoplayer_standard); -jcVideoPlayerStandard.setUp("http://2449.vod.myqcloud.com/2449_bfbbfa3cea8f11e5aac3db03cda99974.f20.mp4" - , "嫂子想我没"); +JCVideoPlayerStandard jcVideoPlayerStandard = (JCVideoPlayerStandard) findViewById(R.id.jc_video); +jcVideoPlayerStandard.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4" + , JCVideoPlayerStandard.SCREEN_LAYOUT_LIST, "嫂子闭眼睛"); jcVideoPlayerStandard.thumbImageView.setThumbInCustomProject("http://p.qpic.cn/videoyun/0/2449_43b6f696980311e59ed467f22794e792_1/640"); ``` -4.Remember to invoke `JCVideoPlayer.releaseAllVideos();` in `onPause()` of `Fragment` or `Activity` +4.Remember to invoke `JCVideoPlayer.releaseAllVideos();` in `onPause()` of `Activity` #### Other APIs Invoke `JCFullScreenActivity.startActivity(...)` to enter fullscreen directly. ```java -JCFullScreenActivity.startActivity(this, - "http://video.jiecao.fm/5/1/%E8%87%AA%E5%8F%96%E5%85%B6%E8%BE%B1.mp4", - JCVideoPlayerStandard.class, - "嫂子别摸我"); -``` - -Control play button,if state is normal it will play, if state is playing it will pause -```java -jcVideoPlayerStandard.startButton.performClick(); +Comming soon ``` ProGuard ``` -Need nothing +-keep class tv.danmaku.ijk.** { *; } +-dontwarn tv.danmaku.ijk.** ``` ##[Custom UI](./README_CUSTOM_UI.md) ##Contributors -[Nathen](https://github.com/lipangit) [Derlio](https://github.com/derlio) [zhangzzqq](https://github.com/zhangzzqq) [carmelo-ruota](https://github.com/carmelo-ruota) [wxxsw](https://github.com/wxxsw) [Miguel Aragues](https://github.com/Maragues) +[Nathen](https://github.com/lipangit) [Derlio](https://github.com/derlio) [zhangzzqq](https://github.com/zhangzzqq) [carmelo-ruota](https://github.com/carmelo-ruota) [wxxsw](https://github.com/wxxsw) [Miguel Aragues](https://github.com/Maragues) [e16din](https://github.com/e16din) ## License MIT @@ -100,5 +92,5 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -[1]: ./screenshots/j6.jpg +[1]: ./screenshots/j7.jpg diff --git a/app/build.gradle b/app/build.gradle index 5980e39d4..9c1a6531c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "fm.jiecao.jiecaovideoplayer" minSdkVersion 14 targetSdkVersion 24 - versionCode 35 - versionName "4.5_preview1" + versionCode 36 + versionName "4.6" } buildTypes { release { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 061a3b42c..81a8cd082 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,17 +21,35 @@ - + - - - - + + + + - - - - + + + + diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActiivtyMain.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActiivtyMain.java index d4ce708d5..2bebf95ac 100644 --- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActiivtyMain.java +++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActiivtyMain.java @@ -4,11 +4,14 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; +import android.util.Log; import android.view.View; import android.widget.Button; import com.nostra13.universalimageloader.core.ImageLoader; +import fm.jiecao.jcvideoplayer_lib.JCBuriedPoint; +import fm.jiecao.jcvideoplayer_lib.JCBuriedPointStandard; import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer; import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerSimple; import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; @@ -42,17 +45,77 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { jcVideoPlayerStandard = (JCVideoPlayerStandard) findViewById(R.id.jc_video); jcVideoPlayerStandard.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4" - , JCVideoPlayerStandard.SCREEN_LAYOUT_LIST, "嫂子闭眼睛"); + , JCVideoPlayerStandard.SCREEN_LAYOUT_LIST, "嫂子坐这"); ImageLoader.getInstance().displayImage("http://cos.myqcloud.com/1000264/qcloud_video_attachment/842646334/vod_cover/cover1458036374.jpg", jcVideoPlayerStandard.thumbImageView); findViewById(R.id.tiny_win).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - jcVideoPlayerStandard.toWindowTiny(); + jcVideoPlayerStandard.startWindowTiny(); } }); + JCVideoPlayer.setJcBuriedPoint(new MyJCBuriedPointStandard()); + + } + + class MyJCBuriedPointStandard implements JCBuriedPointStandard { + + @Override + public void onEvent(int type, String url, int screen, Object... objects) { + switch (type) { + case JCBuriedPoint.ON_CLICK_START_ICON: + Log.i("Buried_Point", "ON_CLICK_START_ICON" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_CLICK_START_ERROR: + Log.i("Buried_Point", "ON_CLICK_START_ERROR" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_CLICK_START_AUTO_COMPLETE: + Log.i("Buried_Point", "ON_CLICK_START_AUTO_COMPLETE" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_CLICK_PAUSE: + Log.i("Buried_Point", "ON_CLICK_PAUSE" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_CLICK_RESUME: + Log.i("Buried_Point", "ON_CLICK_RESUME" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_SEEK_POSITION: + Log.i("Buried_Point", "ON_SEEK_POSITION" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_AUTO_COMPLETE: + Log.i("Buried_Point", "ON_AUTO_COMPLETE" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_ENTER_FULLSCREEN: + Log.i("Buried_Point", "ON_ENTER_FULLSCREEN" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_QUIT_FULLSCREEN: + Log.i("Buried_Point", "ON_QUIT_FULLSCREEN" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_ENTER_TINYSCREEN: + Log.i("Buried_Point", "ON_ENTER_TINYSCREEN" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_QUIT_TINYSCREEN: + Log.i("Buried_Point", "ON_QUIT_TINYSCREEN" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_TOUCH_SCREEN_SEEK_VOLUME: + Log.i("Buried_Point", "ON_TOUCH_SCREEN_SEEK_VOLUME" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPoint.ON_TOUCH_SCREEN_SEEK_POSITION: + Log.i("Buried_Point", "ON_TOUCH_SCREEN_SEEK_POSITION" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + + case JCBuriedPointStandard.ON_CLICK_START_THUMB: + Log.i("Buried_Point", "ON_CLICK_START_THUMB" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + case JCBuriedPointStandard.ON_CLICK_BLANK: + Log.i("Buried_Point", "ON_CLICK_BLANK" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen); + break; + default: + Log.i("Buried_Point", "unknow"); + break; + } + } } @Override diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityListViewMultiHolder.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityListViewMultiHolder.java index 877279027..353fade3f 100755 --- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityListViewMultiHolder.java +++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityListViewMultiHolder.java @@ -86,7 +86,7 @@ public View getView(int position, View convertView, ViewGroup parent) { boolean setUp = viewHolder.jcVideoPlayer.setUp( "http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4", JCVideoPlayer.SCREEN_LAYOUT_LIST, - "嫂子上车"); + "嫂子快躲起来"); if (setUp) { ImageLoader.getInstance().displayImage("http://img4.jiecaojingxuan.com/2016/3/14/2204a578-609b-440e-8af7-a0ee17ff3aee.jpg", viewHolder.jcVideoPlayer.thumbImageView); diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityPlayDirectly.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityPlayDirectly.java index 040946f2e..8fc70acfc 100644 --- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityPlayDirectly.java +++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityPlayDirectly.java @@ -8,6 +8,9 @@ import android.widget.Button; import android.widget.Toast; +import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer; +import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; + /** * Created by Nathen on 16/7/31. */ @@ -37,37 +40,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { public void onClick(View v) { switch (v.getId()) { case R.id.fullscreen: - // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, -// WindowManager.LayoutParams.FLAG_FULLSCREEN); -// getSupportActionBar().setShowHideAnimationEnabled(false); -// getSupportActionBar().hide(); -// -// ViewGroup vp = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT); -// View old = vp.findViewById(JCVideoPlayer.FULLSCREEN_ID); -// if (old != null) { -// vp.removeView(old); -// } -// try { -// Constructor constructor = JCVideoPlayer.class.getConstructor(Context.class); -// JCVideoPlayer jcVideoPlayer = constructor.newInstance(ActivityPlayDirectly.this); -// jcVideoPlayer.setId(JCVideoPlayer.FULLSCREEN_ID); -// WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); -// int w = wm.getDefaultDisplay().getWidth(); -// int h = wm.getDefaultDisplay().getHeight(); -// FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(h, w); -// lp.setMargins((w - h) / 2, -(w - h) / 2, 0, 0); -// vp.addView(jcVideoPlayer, lp); -// jcVideoPlayer.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4", JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN, "Hello"); -// jcVideoPlayer.addTextureView(); -// jcVideoPlayer.setRotation(90); -// JCVideoPlayerManager.setListener(jcVideoPlayer); -// jcVideoPlayer.startButton.performClick(); -// } catch (InstantiationException e) { -// e.printStackTrace(); -// } catch (Exception e) { -// e.printStackTrace(); -// } - Toast.makeText(ActivityPlayDirectly.this, "Comming Soon", Toast.LENGTH_SHORT).show(); + JCVideoPlayerStandard.startFullscreen(this, JCVideoPlayerStandard.class, "http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4", "嫂子辛苦了"); break; case R.id.tiny_window: Toast.makeText(ActivityPlayDirectly.this, "Comming Soon", Toast.LENGTH_SHORT).show(); @@ -75,6 +48,20 @@ public void onClick(View v) { } } + @Override + public void onBackPressed() { + if (JCVideoPlayer.backPress()) { + return; + } + super.onBackPressed(); + } + + @Override + protected void onPause() { + super.onPause(); + JCVideoPlayer.releaseAllVideos(); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityUIImageLoader.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityUIImageLoader.java index 368db3fbf..48724a33e 100644 --- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityUIImageLoader.java +++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityUIImageLoader.java @@ -39,27 +39,27 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { videoController1 = (JCVideoPlayerStandard) findViewById(R.id.videocontroller1); videoController1.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4", JCVideoPlayer.SCREEN_LAYOUT_LIST, - "嫂子张嘴"); + "嫂子抓住"); ImageLoader.getInstance().displayImage("http://cos.myqcloud.com/1000264/qcloud_video_attachment/842646334/vod_cover/cover1458036374.jpg", videoController1.thumbImageView); videoController2 = (JCVideoPlayerStandard) findViewById(R.id.videocontroller2); videoController2.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4", JCVideoPlayer.SCREEN_LAYOUT_LIST, - "嫂子抬头"); + "嫂子别晃"); Glide.with(this) .load("http://cos.myqcloud.com/1000264/qcloud_video_attachment/842646334/vod_cover/cover1458036374.jpg") .into(videoController2.thumbImageView); videoController3 = (JCVideoPlayerStandard) findViewById(R.id.videocontroller3); videoController3.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4", JCVideoPlayer.SCREEN_LAYOUT_LIST, - "嫂子不困"); + "嫂子别躲"); Picasso.with(this) .load("http://cos.myqcloud.com/1000264/qcloud_video_attachment/842646334/vod_cover/cover1458036374.jpg") .into(videoController3.thumbImageView); videoController4 = (JCVideoPlayerStandard) findViewById(R.id.videocontroller4); videoController4.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4", JCVideoPlayer.SCREEN_LAYOUT_LIST, - "嫂子你个死猪"); + "嫂子别忘了"); RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext()); com.android.volley.toolbox.ImageLoader imageLoader = new com.android.volley.toolbox.ImageLoader(mQueue, new BitmapCache()); com.android.volley.toolbox.ImageLoader.ImageListener listener = @@ -68,7 +68,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { videoController5 = (JCVideoPlayerStandardFresco) findViewById(R.id.videocontroller5); videoController5.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4", JCVideoPlayer.SCREEN_LAYOUT_LIST, - "嫂子洗澡没"); + "嫂子打电话"); Uri uri = Uri.parse("http://cos.myqcloud.com/1000264/qcloud_video_attachment/842646334/vod_cover/cover1458036374.jpg"); videoController5.thumbImageView.setImageURI(uri); } diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityUISmallChange.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityUISmallChange.java index 8283e6c9f..1b6f39457 100644 --- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityUISmallChange.java +++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/ActivityUISmallChange.java @@ -30,14 +30,14 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { jcVideoPlayerStandardWithShareButton = (JCVideoPlayerStandardShowShareButtonAfterFullscreen) findViewById(R.id.custom_videoplayer_standard_with_share_button); jcVideoPlayerStandardWithShareButton.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4", JCVideoPlayer.SCREEN_LAYOUT_LIST - , "嫂子闭眼睛"); + , "嫂子上飞机"); ImageLoader.getInstance().displayImage("http://cos.myqcloud.com/1000264/qcloud_video_attachment/842646334/vod_cover/cover1458036374.jpg", jcVideoPlayerStandardWithShareButton.thumbImageView); jcVideoPlayerStandardShowTitleAfterFullscreen = (JCVideoPlayerStandardShowTitleAfterFullscreen) findViewById(R.id.custom_videoplayer_standard_show_title_after_fullscreen); jcVideoPlayerStandardShowTitleAfterFullscreen.setUp("http://video.jiecao.fm/5/1/%E8%87%AA%E5%8F%96%E5%85%B6%E8%BE%B1.mp4", JCVideoPlayer.SCREEN_LAYOUT_LIST - , "嫂子摸完没"); + , "嫂子看电视"); ImageLoader.getInstance().displayImage("http://img4.jiecaojingxuan.com/2016/5/1/3430ec64-e6a7-4d8e-b044-9d408e075b7c.jpg", jcVideoPlayerStandardShowTitleAfterFullscreen.thumbImageView); // jcVideoPlayerStandardShowTitleAfterFullscreen.setLoop(true); diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/AdapterVideoList.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/AdapterVideoList.java index c410999da..f1a7a8802 100755 --- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/AdapterVideoList.java +++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/AdapterVideoList.java @@ -24,7 +24,7 @@ public class AdapterVideoList extends BaseAdapter { "http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4"}; String[] videoThumbs = {"http://img4.jiecaojingxuan.com/2016/5/1/3430ec64-e6a7-4d8e-b044-9d408e075b7c.jpg", "http://img4.jiecaojingxuan.com/2016/3/14/2204a578-609b-440e-8af7-a0ee17ff3aee.jpg"}; - String[] videoTitles = {"嫂子真紧", "嫂子抬腿"}; + String[] videoTitles = {"嫂子坐火车", "嫂子打游戏"}; int[] videoIndexs = {0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1}; Context context; diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/CustomView/JCVideoPlayerStandardFresco.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/CustomView/JCVideoPlayerStandardFresco.java index ce69e6116..cccd486fd 100755 --- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/CustomView/JCVideoPlayerStandardFresco.java +++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/CustomView/JCVideoPlayerStandardFresco.java @@ -235,9 +235,7 @@ public void onStopTrackingTouch(SeekBar seekBar) { } private void startPlayLocic() { - if (JC_BURIED_POINT_STANDARD != null) { - JC_BURIED_POINT_STANDARD.onClickStartThumb(url, objects); - } + onEvent(JCBuriedPointStandard.ON_CLICK_START_THUMB); prepareVideo(); startDismissControlViewTimer(); } diff --git a/downloads/jiecaovideoplayer-4.5_preview1-javadoc.jar b/downloads/jiecaovideoplayer-4.5_preview1-javadoc.jar deleted file mode 100644 index e4e9e5b1e..000000000 Binary files a/downloads/jiecaovideoplayer-4.5_preview1-javadoc.jar and /dev/null differ diff --git a/downloads/jiecaovideoplayer-4.5_preview1-sources.jar b/downloads/jiecaovideoplayer-4.5_preview1-sources.jar deleted file mode 100644 index a36f768eb..000000000 Binary files a/downloads/jiecaovideoplayer-4.5_preview1-sources.jar and /dev/null differ diff --git a/downloads/jiecaovideoplayer-4.5_preview1.aar b/downloads/jiecaovideoplayer-4.5_preview1.aar deleted file mode 100644 index 26e9cea9b..000000000 Binary files a/downloads/jiecaovideoplayer-4.5_preview1.aar and /dev/null differ diff --git a/downloads/jiecaovideoplayer-4.5_preview1-demo.apk b/downloads/jiecaovideoplayer-4.6-demo.apk similarity index 84% rename from downloads/jiecaovideoplayer-4.5_preview1-demo.apk rename to downloads/jiecaovideoplayer-4.6-demo.apk index 466e7b8a8..3b333313d 100644 Binary files a/downloads/jiecaovideoplayer-4.5_preview1-demo.apk and b/downloads/jiecaovideoplayer-4.6-demo.apk differ diff --git a/downloads/jiecaovideoplayer-4.6-javadoc.jar b/downloads/jiecaovideoplayer-4.6-javadoc.jar new file mode 100644 index 000000000..b5c2b86d9 Binary files /dev/null and b/downloads/jiecaovideoplayer-4.6-javadoc.jar differ diff --git a/downloads/jiecaovideoplayer-4.6-sources.jar b/downloads/jiecaovideoplayer-4.6-sources.jar new file mode 100644 index 000000000..f90b995c1 Binary files /dev/null and b/downloads/jiecaovideoplayer-4.6-sources.jar differ diff --git a/downloads/jiecaovideoplayer-4.6.aar b/downloads/jiecaovideoplayer-4.6.aar new file mode 100644 index 000000000..d0a0502a6 Binary files /dev/null and b/downloads/jiecaovideoplayer-4.6.aar differ diff --git a/gradle/maven_push.gradle b/gradle/maven_push.gradle index 7fba7f98b..e4fafa043 100644 --- a/gradle/maven_push.gradle +++ b/gradle/maven_push.gradle @@ -22,7 +22,7 @@ signing { group = "fm.jiecao" archivesBaseName = "jiecaovideoplayer" -version = "4.5_preview1" +version = "4.6" uploadArchives { repositories { diff --git a/jcvideoplayer-lib/build.gradle b/jcvideoplayer-lib/build.gradle index c3b57dbf6..9b9488f4a 100644 --- a/jcvideoplayer-lib/build.gradle +++ b/jcvideoplayer-lib/build.gradle @@ -7,8 +7,8 @@ android { defaultConfig { minSdkVersion 14 targetSdkVersion 24 - versionCode 35 - versionName "4.5_preview1" + versionCode 36 + versionName "4.6" } buildTypes { release { diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCBuriedPoint.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCBuriedPoint.java index 6cf93866c..d567cc9ec 100644 --- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCBuriedPoint.java +++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCBuriedPoint.java @@ -6,32 +6,24 @@ */ public interface JCBuriedPoint { - void onClickStartIcon(String url, Object... objects); + int ON_CLICK_START_ICON = 0; + int ON_CLICK_START_ERROR = 1; + int ON_CLICK_START_AUTO_COMPLETE = 2; - void onClickStartError(String url, Object... objects); + int ON_CLICK_PAUSE = 3; + int ON_CLICK_RESUME = 4; + int ON_SEEK_POSITION = 5; + int ON_AUTO_COMPLETE = 6; - void onClickStop(String url, Object... objects); + int ON_ENTER_FULLSCREEN = 7; + int ON_QUIT_FULLSCREEN = 8; + int ON_ENTER_TINYSCREEN = 9; + int ON_QUIT_TINYSCREEN = 10; - void onClickStopFullscreen(String url, Object... objects); - void onClickResume(String url, Object... objects); + int ON_TOUCH_SCREEN_SEEK_VOLUME = 11; + int ON_TOUCH_SCREEN_SEEK_POSITION = 12; - void onClickResumeFullscreen(String url, Object... objects); - - void onClickSeekbar(String url, Object... objects); - - void onClickSeekbarFullscreen(String url, Object... objects); - - void onAutoComplete(String url, Object... objects); - - void onAutoCompleteFullscreen(String url, Object... objects); - - void onEnterFullscreen(String url, Object... objects); - - void onQuitFullscreen(String url, Object... objects); - - void onTouchScreenSeekVolume(String url, Object... objects); - - void onTouchScreenSeekPosition(String url, Object... objects); + void onEvent(int type, String url, int screen, Object... objects); } diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCBuriedPointStandard.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCBuriedPointStandard.java index 163c479ae..26fc9ff78 100644 --- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCBuriedPointStandard.java +++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCBuriedPointStandard.java @@ -6,10 +6,7 @@ */ public interface JCBuriedPointStandard extends JCBuriedPoint { - void onClickStartThumb(String url, Object... objects); - - void onClickBlank(String url, Object... objects); - - void onClickBlankFullscreen(String url, Object... objects); - + int ON_CLICK_START_THUMB = 101; + int ON_CLICK_BLANK = 102; + } diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java index 73a8af363..4cf2e3dce 100644 --- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java +++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java @@ -6,6 +6,7 @@ import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Handler; +import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.AttributeSet; @@ -19,6 +20,8 @@ import android.view.ViewParent; import android.view.Window; import android.view.WindowManager; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; @@ -78,7 +81,8 @@ public abstract class JCVideoPlayer extends FrameLayout implements JCMediaPlayer public ViewGroup topContainer, bottomContainer; public Surface surface; - protected static Timer UPDATE_PROGRESS_TIMER; + protected static JCBuriedPoint JC_BURIED_POINT; + protected static Timer UPDATE_PROGRESS_TIMER; protected int mScreenWidth; protected int mScreenHeight; @@ -164,16 +168,20 @@ public void onClick(View v) { showWifiDialog(); return; } - startButtonLogic(); + prepareVideo(); + onEvent(currentState != CURRENT_STATE_ERROR ? JCBuriedPoint.ON_CLICK_START_ICON : JCBuriedPoint.ON_CLICK_START_ERROR); } else if (currentState == CURRENT_STATE_PLAYING) { + onEvent(JCBuriedPoint.ON_CLICK_PAUSE); Log.d(TAG, "pauseVideo [" + this.hashCode() + "] "); JCMediaManager.instance().mediaPlayer.pause(); setUiWitStateAndScreen(CURRENT_STATE_PAUSE); } else if (currentState == CURRENT_STATE_PAUSE) { + onEvent(JCBuriedPoint.ON_CLICK_RESUME); JCMediaManager.instance().mediaPlayer.start(); setUiWitStateAndScreen(CURRENT_STATE_PLAYING); } else if (currentState == CURRENT_STATE_AUTO_COMPLETE) { - startButtonLogic(); + onEvent(JCBuriedPoint.ON_CLICK_START_AUTO_COMPLETE); + prepareVideo(); } } else if (i == R.id.fullscreen) { Log.i(TAG, "onClick fullscreen [" + this.hashCode() + "] "); @@ -183,7 +191,8 @@ public void onClick(View v) { backPress(); } else { Log.d(TAG, "toFullscreenActivity [" + this.hashCode() + "] "); - toWindowFullscreen(); + onEvent(JCBuriedPoint.ON_ENTER_FULLSCREEN); + startWindowFullscreen(); } } else if (i == R.id.surface_container && currentState == CURRENT_STATE_ERROR) { Log.i(TAG, "onClick surfaceContainer State=Error [" + this.hashCode() + "] "); @@ -191,10 +200,6 @@ public void onClick(View v) { } } - private void startButtonLogic() { - prepareVideo(); - } - protected void prepareVideo() { Log.d(TAG, "prepareVideo [" + this.hashCode() + "] "); if (JCVideoPlayerManager.listener() != null) { @@ -274,11 +279,15 @@ public boolean onTouch(View v, MotionEvent event) { dismissProgressDialog(); dismissVolumDialog(); if (mChangePosition) { + onEvent(JCBuriedPoint.ON_TOUCH_SCREEN_SEEK_POSITION); JCMediaManager.instance().mediaPlayer.seekTo(mSeekTimePosition); int duration = getDuration(); int progress = mSeekTimePosition * 100 / (duration == 0 ? 1 : duration); progressBar.setProgress(progress); } + if (mChangeVolume) { + onEvent(JCBuriedPoint.ON_TOUCH_SCREEN_SEEK_VOLUME); + } startProgressTimer(); break; } @@ -349,6 +358,8 @@ protected void cancelProgressTimer() { @Override public void onPrepared() { + Log.i(TAG, "onPrepared " + " [" + this.hashCode() + "] "); + if (currentState != CURRENT_STATE_PREPAREING) return; JCMediaManager.instance().mediaPlayer.start(); if (seekToInAdvance != -1) { @@ -359,68 +370,74 @@ public void onPrepared() { setUiWitStateAndScreen(CURRENT_STATE_PLAYING); } + public void clearFullscreenLayout() { + ViewGroup vp = (ViewGroup) ((Activity) getContext()).findViewById(Window.ID_ANDROID_CONTENT); + View oldF = vp.findViewById(FULLSCREEN_ID); + View oldT = vp.findViewById(TINY_ID); + if (oldF != null) { + vp.removeView(oldF); + } + if (oldT != null) { + vp.removeView(oldT); + } + showSupportActionBar(getContext()); + } + @Override public void onAutoCompletion() { -// if (JC_BURIED_POINT != null && isCurrentMediaListener()) { -// if (mIfCurrentIsFullscreen) { -// JC_BURIED_POINT.onAutoCompleteFullscreen(url, objects); -// } else { -// JC_BURIED_POINT.onAutoComplete(url, objects); -// } -// } + Log.i(TAG, "onAutoCompletion " + " [" + this.hashCode() + "] "); + onEvent(JCBuriedPoint.ON_AUTO_COMPLETE); setUiWitStateAndScreen(CURRENT_STATE_AUTO_COMPLETE); if (textureViewContainer.getChildCount() > 0) { textureViewContainer.removeAllViews(); } -// if (IF_FULLSCREEN_FROM_NORMAL) {//如果在进入全屏后播放完就初始化自己非全屏的控件 -// IF_FULLSCREEN_FROM_NORMAL = false; -// JCVideoPlayerManager.lastListener().onAutoCompletion(); -// } JCVideoPlayerManager.setLastListener(null); AudioManager mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); mAudioManager.abandonAudioFocus(onAudioFocusChangeListener); JCUtils.scanForActivity(getContext()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - ViewGroup vp = (ViewGroup) ((Activity) getContext()).findViewById(Window.ID_ANDROID_CONTENT); - View oldF = vp.findViewById(FULLSCREEN_ID); - View oldT = vp.findViewById(TINY_ID); - if (oldF != null) { - vp.removeView(oldF); - } - if (oldT != null) { - vp.removeView(oldT); - } + clearFullscreenLayout(); } @Override public void onCompletion() { + Log.i(TAG, "onCompletion " + " [" + this.hashCode() + "] "); setUiWitStateAndScreen(CURRENT_STATE_NORMAL); if (textureViewContainer.getChildCount() > 0) { textureViewContainer.removeAllViews(); } - //if fullscreen finish activity what ever the activity is directly or click fullscreen -// if (IF_FULLSCREEN_FROM_NORMAL) {//如果在进入全屏后播放完就初始化自己非全屏的控件 -// IF_FULLSCREEN_FROM_NORMAL = false; -// JCMediaManager.instance().lastListener().onCompletion(); -// } JCVideoPlayerManager.setListener(null); - JCVideoPlayerManager.setLastListener(null); +// JCVideoPlayerManager.setLastListener(null); JCMediaManager.instance().currentVideoWidth = 0; JCMediaManager.instance().currentVideoHeight = 0; AudioManager mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); mAudioManager.abandonAudioFocus(onAudioFocusChangeListener); JCUtils.scanForActivity(getContext()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + clearFullscreenLayout(); } @Override public boolean goToOtherListener() {//这里这个名字这么写并不对,这是在回退的时候gotoother,如果直接gotoother就不叫这个名字 + Log.i(TAG, "goToOtherListener " + " [" + this.hashCode() + "] "); + if (currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN || currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_TINY) { +// if (currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN) { +// final Animation ra = AnimationUtils.loadAnimation(getContext(), R.anim.quit_fullscreen); +// startAnimation(ra); +// } + onEvent(currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN ? + JCBuriedPoint.ON_QUIT_FULLSCREEN : + JCBuriedPoint.ON_QUIT_TINYSCREEN); + if (JCVideoPlayerManager.lastListener() == null) {//directly fullscreen + JCVideoPlayerManager.listener().onCompletion(); + showSupportActionBar(getContext()); + return true; + } ViewGroup vp = (ViewGroup) ((Activity) getContext()).findViewById(Window.ID_ANDROID_CONTENT); vp.removeView(this); - JCVideoPlayerManager.setListener(JCVideoPlayerManager.lastListener()); JCVideoPlayerManager.setLastListener(null); JCMediaManager.instance().lastState = currentState;//save state @@ -441,7 +458,6 @@ public void onBufferingUpdate(int percent) { @Override public void onSeekComplete() { - } @Override @@ -470,6 +486,8 @@ public void onInfo(int what, int extra) { @Override public void onVideoSizeChanged() { + Log.i(TAG, "onVideoSizeChanged " + " [" + this.hashCode() + "] "); + int mVideoWidth = JCMediaManager.instance().currentVideoWidth; int mVideoHeight = JCMediaManager.instance().currentVideoHeight; if (mVideoWidth != 0 && mVideoHeight != 0) { @@ -479,13 +497,13 @@ public void onVideoSizeChanged() { @Override public void goBackThisListener() { + Log.i(TAG, "goBackThisListener " + " [" + this.hashCode() + "] "); + currentState = JCMediaManager.instance().lastState; setUiWitStateAndScreen(currentState); addTextureView(); - ((AppCompatActivity) getContext()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - ((AppCompatActivity) getContext()).getSupportActionBar().setShowHideAnimationEnabled(false); - ((AppCompatActivity) getContext()).getSupportActionBar().show(); + showSupportActionBar(getContext()); } @Override @@ -513,7 +531,6 @@ public void onSurfaceTextureUpdated(SurfaceTexture surface) { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - } @Override @@ -530,6 +547,7 @@ public void onStartTrackingTouch(SeekBar seekBar) { @Override public void onStopTrackingTouch(SeekBar seekBar) { Log.i(TAG, "bottomProgress onStopTrackingTouch [" + this.hashCode() + "] "); + onEvent(JCBuriedPoint.ON_SEEK_POSITION); startProgressTimer(); ViewParent vpup = getParent(); while (vpup != null) { @@ -544,17 +562,17 @@ public void onStopTrackingTouch(SeekBar seekBar) { } public static boolean backPress() { + Log.i(TAG, "backPress"); if (JCVideoPlayerManager.listener() != null) { return JCVideoPlayerManager.listener().goToOtherListener(); } return false; } - private void toWindowFullscreen() { - ((AppCompatActivity) getContext()).getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); - ((AppCompatActivity) getContext()).getSupportActionBar().setShowHideAnimationEnabled(false); - ((AppCompatActivity) getContext()).getSupportActionBar().hide(); + private void startWindowFullscreen() { + Log.i(TAG, "startWindowFullscreen " + " [" + this.hashCode() + "] "); + + hideSupportActionBar(getContext()); ViewGroup vp = (ViewGroup) ((Activity) getContext()).findViewById(Window.ID_ANDROID_CONTENT); View old = vp.findViewById(FULLSCREEN_ID); @@ -579,6 +597,9 @@ private void toWindowFullscreen() { jcVideoPlayer.addTextureView(); jcVideoPlayer.setRotation(90); +// final Animation ra = AnimationUtils.loadAnimation(getContext(), R.anim.start_fullscreen); +// jcVideoPlayer.setAnimation(ra); + JCVideoPlayerManager.setLastListener(this); JCVideoPlayerManager.setListener(jcVideoPlayer); @@ -590,12 +611,18 @@ private void toWindowFullscreen() { } } - public void toWindowTiny() { + public void startWindowTiny() { + Log.i(TAG, "startWindowTiny " + " [" + this.hashCode() + "] "); + onEvent(JCBuriedPoint.ON_ENTER_TINYSCREEN); + ViewGroup vp = (ViewGroup) ((Activity) getContext()).findViewById(Window.ID_ANDROID_CONTENT); View old = vp.findViewById(TINY_ID); if (old != null) { vp.removeView(old); } + if (textureViewContainer.getChildCount() > 0) { + textureViewContainer.removeAllViews(); + } try { Constructor constructor = (Constructor) JCVideoPlayer.this.getClass().getConstructor(Context.class); JCVideoPlayer mJcVideoPlayer = constructor.newInstance(getContext()); @@ -690,11 +717,13 @@ public void onAudioFocusChange(int focusChange) { break; case AudioManager.AUDIOFOCUS_LOSS: releaseAllVideos(); + Log.d(TAG, "AUDIOFOCUS_LOSS [" + this.hashCode() + "]"); break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: if (JCMediaManager.instance().mediaPlayer.isPlaying()) { JCMediaManager.instance().mediaPlayer.pause(); } + Log.d(TAG, "AUDIOFOCUS_LOSS_TRANSIENT [" + this.hashCode() + "]"); break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: break; @@ -710,17 +739,92 @@ public void release() { } } + protected boolean isCurrentMediaListener() { + return JCVideoPlayerManager.listener() != null + && JCVideoPlayerManager.listener() == this; + } + public static void releaseAllVideos() { Log.d(TAG, "releaseAllVideos"); if (JCVideoPlayerManager.listener() != null) { JCVideoPlayerManager.listener().onCompletion(); } + if (JCVideoPlayerManager.lastListener() != null) { + JCVideoPlayerManager.lastListener().onCompletion(); + } JCMediaManager.instance().releaseMediaPlayer(); } - protected boolean isCurrentMediaListener() { - return JCVideoPlayerManager.listener() != null - && JCVideoPlayerManager.listener() == this; + public static void setJcBuriedPoint(JCBuriedPoint jcBuriedPoint) { + JC_BURIED_POINT = jcBuriedPoint; + } + + public void onEvent(int type) { + if (JC_BURIED_POINT != null && isCurrentMediaListener()) { + JC_BURIED_POINT.onEvent(type, url, currentScreen, objects); + } + } + + public static void startFullscreen(Context context, Class _class, String url, Object... objects) { + + hideSupportActionBar(context); + ViewGroup vp = (ViewGroup) ((AppCompatActivity) context).findViewById(Window.ID_ANDROID_CONTENT); + View old = vp.findViewById(JCVideoPlayer.FULLSCREEN_ID); + if (old != null) { + vp.removeView(old); + } + try { + Constructor constructor = _class.getConstructor(Context.class); + JCVideoPlayer jcVideoPlayer = constructor.newInstance(context); + jcVideoPlayer.setId(JCVideoPlayerStandard.FULLSCREEN_ID); + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + int w = wm.getDefaultDisplay().getWidth(); + int h = wm.getDefaultDisplay().getHeight(); + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(h, w); + lp.setMargins((w - h) / 2, -(w - h) / 2, 0, 0); + vp.addView(jcVideoPlayer, lp); + +// final Animation ra = AnimationUtils.loadAnimation(context, R.anim.start_fullscreen); +// jcVideoPlayer.setAnimation(ra); + + jcVideoPlayer.setUp(url, JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN, objects); + jcVideoPlayer.addTextureView(); + jcVideoPlayer.setRotation(90); + + jcVideoPlayer.startButton.performClick(); + + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static boolean ACTIONBAR_STATUS = false; + + private static void hideSupportActionBar(Context context) { + ActionBar ab = ((AppCompatActivity) context).getSupportActionBar(); + if (ab != null) { + ACTIONBAR_STATUS = ab.isShowing();//本来就是显示的 + if (ACTIONBAR_STATUS) { + ((AppCompatActivity) context).getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + ab.setShowHideAnimationEnabled(false); + ab.hide(); + } else { + }//本来就是关闭的,不管他 + } + } + + private static void showSupportActionBar(Context context) { + ((AppCompatActivity) context).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + ActionBar ab = ((AppCompatActivity) context).getSupportActionBar(); + if (ab != null) { + if (ACTIONBAR_STATUS) { + ab.setShowHideAnimationEnabled(false); + ab.show(); + } + } } public void showWifiDialog() { diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java index 985c3c17d..316e00b6d 100644 --- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java +++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java @@ -5,19 +5,25 @@ import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.AttributeSet; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; +import java.lang.reflect.Constructor; +import java.util.Objects; import java.util.Timer; import java.util.TimerTask; @@ -27,8 +33,7 @@ */ public class JCVideoPlayerStandard extends JCVideoPlayer { - protected static JCBuriedPointStandard JC_BURIED_POINT_STANDARD; - protected static Timer DISSMISS_CONTROL_VIEW_TIMER; + protected static Timer DISSMISS_CONTROL_VIEW_TIMER; public ImageView backButton; public ProgressBar bottomProgressBar, loadingProgressBar; @@ -143,6 +148,7 @@ public boolean onTouch(View v, MotionEvent event) { bottomProgressBar.setProgress(progress); } if (!mChangePosition && !mChangeVolume) { + onEvent(JCBuriedPointStandard.ON_CLICK_BLANK); onClickUiToggle(); } break; @@ -179,13 +185,6 @@ public void onClick(View v) { onClickUiToggle(); } } else if (i == R.id.surface_container) { - if (JC_BURIED_POINT_STANDARD != null && isCurrentMediaListener()) { -// if (mIfCurrentIsFullscreen) { -// JC_BURIED_POINT_STANDARD.onClickBlankFullscreen(url, objects); -// } else { -// JC_BURIED_POINT_STANDARD.onClickBlank(url, objects); -// } - } startDismissControlViewTimer(); } else if (i == R.id.back) { backPress(); @@ -229,11 +228,9 @@ public void onStopTrackingTouch(SeekBar seekBar) { } private void startPlayLocic() { - if (JC_BURIED_POINT_STANDARD != null) { - JC_BURIED_POINT_STANDARD.onClickStartThumb(url, objects); - } prepareVideo(); startDismissControlViewTimer(); + onEvent(JCBuriedPointStandard.ON_CLICK_START_THUMB); } private void onClickUiToggle() { @@ -356,11 +353,11 @@ private void changeUiToPlayingClear() { switch (currentScreen) { case SCREEN_LAYOUT_LIST: setAllControlsVisible(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, - View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE); + View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.VISIBLE); break; case SCREEN_WINDOW_FULLSCREEN: setAllControlsVisible(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, - View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE); + View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.VISIBLE); break; case SCREEN_WINDOW_TINY: break; @@ -522,6 +519,8 @@ protected void showProgressDialog(float deltaX, String seekTime, int seekTimePos super.showProgressDialog(deltaX, seekTime, seekTimePosition, totalTime, totalTimeDuration); if (mProgressDialog == null) { View localView = LayoutInflater.from(getContext()).inflate(fm.jiecao.jcvideoplayer_lib.R.layout.jc_progress_dialog, null); + View content = localView.findViewById(R.id.content); + content.setRotation(90); mDialogProgressBar = ((ProgressBar) localView.findViewById(fm.jiecao.jcvideoplayer_lib.R.id.duration_progressbar)); mDialogSeekTime = ((TextView) localView.findViewById(fm.jiecao.jcvideoplayer_lib.R.id.tv_current)); mDialogTotalTime = ((TextView) localView.findViewById(fm.jiecao.jcvideoplayer_lib.R.id.tv_duration)); @@ -533,8 +532,8 @@ protected void showProgressDialog(float deltaX, String seekTime, int seekTimePos mProgressDialog.getWindow().addFlags(16); mProgressDialog.getWindow().setLayout(-2, -2); WindowManager.LayoutParams localLayoutParams = mProgressDialog.getWindow().getAttributes(); - localLayoutParams.gravity = 49; - localLayoutParams.y = getResources().getDimensionPixelOffset(fm.jiecao.jcvideoplayer_lib.R.dimen.jc_progress_dialog_margin_top); + localLayoutParams.gravity = Gravity.CENTER_VERTICAL | Gravity.RIGHT; + localLayoutParams.x = getResources().getDimensionPixelOffset(fm.jiecao.jcvideoplayer_lib.R.dimen.jc_progress_dialog_margin_top) / 2; mProgressDialog.getWindow().setAttributes(localLayoutParams); } if (!mProgressDialog.isShowing()) { @@ -543,7 +542,7 @@ protected void showProgressDialog(float deltaX, String seekTime, int seekTimePos mDialogSeekTime.setText(seekTime); mDialogTotalTime.setText(" / " + totalTime); - mDialogProgressBar.setProgress(seekTimePosition * 100 / totalTimeDuration); + mDialogProgressBar.setProgress(totalTimeDuration <= 0 ? 0 : (seekTimePosition * 100 / totalTimeDuration)); if (deltaX > 0) { mDialogIcon.setBackgroundResource(R.drawable.jc_forward_icon); } else { @@ -569,6 +568,8 @@ protected void showVolumDialog(float deltaY, int volumePercent) { super.showVolumDialog(deltaY, volumePercent); if (mVolumeDialog == null) { View localView = LayoutInflater.from(getContext()).inflate(R.layout.jc_volume_dialog, null); + View content = localView.findViewById(R.id.content); + content.setRotation(90); mDialogVolumeProgressBar = ((ProgressBar) localView.findViewById(R.id.volume_progressbar)); mVolumeDialog = new Dialog(getContext(), R.style.jc_style_dialog_progress); mVolumeDialog.setContentView(localView); @@ -577,8 +578,8 @@ protected void showVolumDialog(float deltaY, int volumePercent) { mVolumeDialog.getWindow().addFlags(16); mVolumeDialog.getWindow().setLayout(-2, -2); WindowManager.LayoutParams localLayoutParams = mVolumeDialog.getWindow().getAttributes(); - localLayoutParams.gravity = 19; - localLayoutParams.x = getContext().getResources().getDimensionPixelOffset(R.dimen.jc_volume_dialog_margin_left); + localLayoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP; +// localLayoutParams.y = getContext().getResources().getDimensionPixelOffset(R.dimen.jc_volume_dialog_margin_left); mVolumeDialog.getWindow().setAttributes(localLayoutParams); } if (!mVolumeDialog.isShowing()) { @@ -634,10 +635,4 @@ public void run() { } } } - -// public static void setJcBuriedPointStandard(JCBuriedPointStandard jcBuriedPointStandard) { -// JC_BURIED_POINT_STANDARD = jcBuriedPointStandard; -// JCVideoPlayer.setJcBuriedPoint(jcBuriedPointStandard); -// } - } diff --git a/jcvideoplayer-lib/src/main/res/anim/quit_fullscreen.xml b/jcvideoplayer-lib/src/main/res/anim/quit_fullscreen.xml new file mode 100644 index 000000000..0ad9e4be1 --- /dev/null +++ b/jcvideoplayer-lib/src/main/res/anim/quit_fullscreen.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/jcvideoplayer-lib/src/main/res/anim/start_fullscreen.xml b/jcvideoplayer-lib/src/main/res/anim/start_fullscreen.xml new file mode 100755 index 000000000..474e482cf --- /dev/null +++ b/jcvideoplayer-lib/src/main/res/anim/start_fullscreen.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/jcvideoplayer-lib/src/main/res/layout/jc_progress_dialog.xml b/jcvideoplayer-lib/src/main/res/layout/jc_progress_dialog.xml index bed27bf2d..bababc43c 100644 --- a/jcvideoplayer-lib/src/main/res/layout/jc_progress_dialog.xml +++ b/jcvideoplayer-lib/src/main/res/layout/jc_progress_dialog.xml @@ -2,55 +2,65 @@ - - - + android:layout_height="152dp" + android:gravity="center"> + android:background="@drawable/jc_dialog_progress_bg" + android:orientation="vertical"> - + - + android:layout_gravity="center_horizontal" + android:layout_marginTop="20dp" + android:gravity="center_horizontal" + android:orientation="horizontal"> + + + + + + + - - + + + diff --git a/jcvideoplayer-lib/src/main/res/layout/jc_volume_dialog.xml b/jcvideoplayer-lib/src/main/res/layout/jc_volume_dialog.xml index dac6dee88..fb981884b 100644 --- a/jcvideoplayer-lib/src/main/res/layout/jc_volume_dialog.xml +++ b/jcvideoplayer-lib/src/main/res/layout/jc_volume_dialog.xml @@ -2,29 +2,38 @@ - + + + + + + + + + - - - diff --git a/jcvideoplayer-lib/src/main/res/values/styles.xml b/jcvideoplayer-lib/src/main/res/values/styles.xml index 2614bb92b..bfbd52427 100644 --- a/jcvideoplayer-lib/src/main/res/values/styles.xml +++ b/jcvideoplayer-lib/src/main/res/values/styles.xml @@ -2,7 +2,7 @@ diff --git a/screenshots/j6.jpg b/screenshots/j6.jpg deleted file mode 100644 index 570e80738..000000000 Binary files a/screenshots/j6.jpg and /dev/null differ diff --git a/screenshots/j7.jpg b/screenshots/j7.jpg new file mode 100644 index 000000000..32e1fac9e Binary files /dev/null and b/screenshots/j7.jpg differ