admin
2020-09-19 394c1b925cf8b9ccf98d0b6db3210266d07368ee
风行播放器集成
11个文件已修改
51个文件已添加
1648 ■■■■■ 已修改文件
BuWanVideo/build.gradle 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/res/layout/fragment_player_funshion.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/res/layout/item_video_detail_ad.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/res/values/strings.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/BeibeiVideoApplication.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/ad/VideoDetailVideoAdFragment.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/login/ForgetPwdActivity.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/main/MainActivity.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailActivity.java 90 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/video/FunshionPlayerFragment.java 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/util/ui/IPageEventListener.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/build.gradle 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/consumer-rules.pro 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/libs/FunshionAD-1.0.0.aar 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/libs/FunshionBase-1.0.5.aar 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/libs/FunshionPlaySDK-1.6.1.aar 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/libs/armeabi/libfsp2p.so 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/proguard-rules.pro 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/src/androidTest/java/com/yeshi/ec/library_funshion/ExampleInstrumentedTest.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/src/main/AndroidManifest.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/src/test/java/com/yeshi/ec/library_funshion/ExampleUnitTest.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/anim/rotate_dialog_player_loading.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_battery_1.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_battery_10.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_battery_2.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_battery_3.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_battery_4.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_battery_5.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_battery_6.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_battery_7.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_battery_8.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_back.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_collecte.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_collected.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_definition_right.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_download.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_episode.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_full_screen.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_loading.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_lock.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_pause.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_pause_big.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_play.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_play_big.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_share.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_unlock.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable/layer_player_progressbar.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable/shape_player_definition_bg.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable/shape_player_dialog_bg_gray.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable/shape_player_dialog_bg_white.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable/shape_player_thumb.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout-land/video_player_controller.xml 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout/item_player_loading.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout/item_player_notify.xml 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout/media_controller.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout/video_player_controller.xml 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/values/styles.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/video/VideoDataNotifyDialog.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/video/VideoLoadingDialog.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/video/VideoPlayerController.java 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
settings.gradle 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/build.gradle
@@ -12,6 +12,7 @@
    api project(':GuangDianTongSDK')
    api project(':MDownloadProvider')
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    implementation project(path: ':library-Funshion')
    //穿山甲广告
    compile(name: 'open_ad_sdk', ext: 'aar')
    //阿里百川
BuWanVideo/res/layout/fragment_player_funshion.xml
New file
@@ -0,0 +1,31 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <com.lcjian.library.widget.RatioLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:ratio="0.5625">
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <SurfaceView
                android:id="@+id/video_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
            <com.lcjian.library.video.VideoPlayerController
                android:id="@+id/vpc_funshion"
                android:layout_width="match_parent"
                android:layout_height="match_parent"></com.lcjian.library.video.VideoPlayerController>
        </FrameLayout>
    </com.lcjian.library.widget.RatioLayout>
</LinearLayout>
BuWanVideo/res/layout/item_video_detail_ad.xml
@@ -2,12 +2,11 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
    android:layout_height="wrap_content">
    <com.lcjian.library.widget.RatioLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_height="wrap_content"
        app:ratio="0.5625">
@@ -21,10 +20,10 @@
                android:layout_height="match_parent"
                android:orientation="vertical">
                <FrameLayout
                    android:id="@+id/custom_container"
                    android:layout_width="match_parent"
                    android:background="@color/red"
                    android:layout_height="match_parent"
                    android:layout_centerInParent="true">
@@ -32,7 +31,7 @@
                    <com.qq.e.ads.nativ.MediaView
                        android:id="@+id/gdt_media_view"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_height="match_parent"
                        android:layout_gravity="center"
                        android:background="#000" />
BuWanVideo/res/values/strings.xml
@@ -1,5 +1,5 @@
<resources>
    <string name="app_name">影视大全</string>
    <string name="app_name">影视大全布丸</string>
    <string name="recommend">推荐</string>
    <string name="category">分类</string>
    <string name="discover">发现</string>
BuWanVideo/src/com/weikou/beibeivideo/BeibeiVideoApplication.java
@@ -11,6 +11,7 @@
import com.bytedance.sdk.openadsdk.TTAdConfig;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdSdk;
import com.fun.xm.FSPlayer;
import com.lcjian.library.util.ManifestDataUtil;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.ImageLoader;
@@ -25,6 +26,7 @@
import com.umeng.commonsdk.UMConfigure;
import com.umeng.socialize.PlatformConfig;
import com.umeng.socialize.UMShareAPI;
import com.weikou.beibeivideo.ui.video.FunshionPlayerFragment;
import com.weikou.beibeivideo.util.BeibeiConstant;
import com.weikou.beibeivideo.util.CrashHandler;
import com.weikou.beibeivideo.util.ad.TTAdManagerHolder;
@@ -71,7 +73,8 @@
        initCSJAd();
        GDTADManager.getInstance().initWith(this, BeibeiConstant.GDT_ID);
        initWX();
        //初始化播放插件
        FSPlayer.init(this, FunshionPlayerFragment.APICODE);
    }
BuWanVideo/src/com/weikou/beibeivideo/ui/ad/VideoDetailVideoAdFragment.java
@@ -30,12 +30,17 @@
import com.weikou.beibeivideo.util.BeibeiConstant;
import com.weikou.beibeivideo.util.ad.AdUtil;
import com.weikou.beibeivideo.util.ad.GDTConstant;
import com.weikou.beibeivideo.util.ui.IPageEventListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class VideoDetailVideoAdFragment extends Fragment implements View.OnClickListener {
    private final static String TAG = "VideoDetailVideoAdFragment";
    private MediaView mediaView;
@@ -46,6 +51,12 @@
    private TextView tv_skip;
    private ProgressBar pb_progress;
    private IPageEventListener pageEventListener;
    public void setPageEventListener(IPageEventListener pageEventListener) {
        this.pageEventListener = pageEventListener;
    }
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -68,6 +79,8 @@
        View root = LayoutInflater.from(getContext()).inflate(R.layout.item_video_detail_ad, null);
        initView(root);
        tv_skip.setOnClickListener(this);
        if (pageEventListener != null)
            pageEventListener.onCreateView();
        return root;
    }
@@ -345,6 +358,7 @@
    @Override
    public void onResume() {
        Log.i(TAG, "onResume");
        super.onResume();
        if (mAdData != null) {
            // 必须要在Activity.onResume()时通知到广告数据,以便重置广告恢复状态
@@ -375,6 +389,10 @@
    }
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }
    public interface IVideoAdListener {
@@ -385,4 +403,6 @@
        public void startPlay();
    }
}
BuWanVideo/src/com/weikou/beibeivideo/ui/login/ForgetPwdActivity.java
@@ -44,6 +44,9 @@
    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.activity_forget_pwd);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            int result = 0;
            int resourceId = getResources().getIdentifier("status_bar_height",
@@ -57,8 +60,7 @@
        } else {
            findViewById(R.id.v_status_bar).setVisibility(View.GONE);
        }
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.activity_forget_pwd);
        et_email = (EditText) findViewById(R.id.et_email);
        et_verfication_code = (EditText) findViewById(R.id.et_verfication_code);
        tv_obtain_verfication_code = (TextView) findViewById(R.id.tv_obtain_verfication_code);
BuWanVideo/src/com/weikou/beibeivideo/ui/main/MainActivity.java
@@ -285,7 +285,7 @@
            preferences = getSharedPreferences("user",
                    Context.MODE_PRIVATE);
        String topIcon = preferences.getString("top_icon", "");
        if (StringUtils.isBlank(topIcon)) {
        if (!StringUtils.isBlank(topIcon)) {
            fl_right_ad.setVisibility(View.VISIBLE);
            try {
                Glide.with(getApplicationContext()).load(topIcon).into(target);
BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailActivity.java
@@ -42,6 +42,8 @@
import com.lcjian.library.util.SystemCommon;
import com.lcjian.library.util.common.DimenUtils;
import com.lcjian.library.util.common.StringUtils;
import com.lcjian.library.video.VideoDataNotifyDialog;
import com.lcjian.library.video.VideoLoadingDialog;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.umeng.analytics.MobclickAgent;
import com.weikou.beibeivideo.BasicTextHttpResponseHandler;
@@ -61,10 +63,12 @@
import com.weikou.beibeivideo.ui.common.ShareActivity;
import com.weikou.beibeivideo.ui.mine.BrowserActivity;
import com.weikou.beibeivideo.ui.mine.FXBrowserActivity;
import com.weikou.beibeivideo.ui.video.FunshionPlayerFragment;
import com.weikou.beibeivideo.ui.video.VideoPlayerActivity;
import com.weikou.beibeivideo.util.BeibeiConstant;
import com.weikou.beibeivideo.util.ad.FullVideoAdManager;
import com.weikou.beibeivideo.R;
import com.weikou.beibeivideo.util.ui.IPageEventListener;
import org.apache.http.Header;
import org.json.JSONArray;
@@ -105,6 +109,9 @@
    private VideoDetailVideoAdFragment mVideoDetailVideoAdFragment;
    //风行播放器
    private FunshionPlayerFragment mFunshionPlayerFragment;
    private ImageView iv_select_play;
    private FrameLayout fl_ad;
@@ -130,6 +137,8 @@
        super.onCreate(savedInstanceState);
        setContentView(R.layout.video_detail_activity);
        new VideoDataNotifyDialog.Builder().build(this).show();
        /*
         * 计算状态栏高度并设置
         */
@@ -147,12 +156,12 @@
            findViewById(R.id.v_status_bar).setVisibility(View.GONE);
        }
        /**
         * 广告
         */
        //广告
        mVideoDetailVideoAdFragment = new VideoDetailVideoAdFragment();
        getSupportFragmentManager().beginTransaction().replace(R.id.fl_ad, mVideoDetailVideoAdFragment).commit();
        //播放器
        mFunshionPlayerFragment = new FunshionPlayerFragment();
        getSupportFragmentManager().beginTransaction().replace(R.id.fl_ad, mVideoDetailVideoAdFragment).commit();
        initView();
@@ -169,7 +178,7 @@
        if (getIntent().getSerializableExtra("video_info") != null) {
            videoInfo = (VideoInfo) getIntent().getSerializableExtra(
                    "video_info");
            if(videoInfo!=null)
            if (videoInfo != null)
                videoInfo.setVideoDetailList(null);
            if (getIntent().getBooleanExtra("isFromWatchHistory", false)) {
                Cursor cursor = getContentResolver().query(
@@ -248,8 +257,8 @@
                .findFragmentByTag("VideoDetailFragment");
        if (videoDetailFragment == null) {
            videoDetailFragment = new VideoDetailFragment();
            Bundle bundle=new Bundle();
            bundle.putInt("playing_position",getIntent().getIntExtra("playing_position",0));
            Bundle bundle = new Bundle();
            bundle.putInt("playing_position", getIntent().getIntExtra("playing_position", 0));
            videoDetailFragment.setArguments(bundle);
            fm.beginTransaction()
@@ -292,26 +301,46 @@
    private boolean isFirst = true;
    private void startPlay() {
    private synchronized void startPlay() {
        //移除所有的fragment
        if (mVideoDetailVideoAdFragment.isAdded()) {
            getSupportFragmentManager().beginTransaction().remove(mVideoDetailVideoAdFragment).commit();
        }
        if (mFunshionPlayerFragment.isAdded()) {
            getSupportFragmentManager().beginTransaction().remove(mFunshionPlayerFragment).commit();
        }
        iv_select_play.setVisibility(View.GONE);
        if (fl_ad.getVisibility() == View.VISIBLE && BeibeiConstant.AD_TYPE != null && BeibeiConstant.AD_TYPE.isPlayerAd()) {
            mVideoDetailVideoAdFragment.loadVideoAD(new VideoDetailVideoAdFragment.IVideoAdListener() {
        //需要加载广告
        if (BeibeiConstant.AD_TYPE != null && BeibeiConstant.AD_TYPE.isPlayerAd()) {
            mVideoDetailVideoAdFragment = new VideoDetailVideoAdFragment();
            mVideoDetailVideoAdFragment.setPageEventListener(new IPageEventListener() {
                @Override
                public void finishPlay() {
                    clickPlay();
                    fl_ad.setVisibility(View.GONE);
                }
                public void onCreateView() {
                    mVideoDetailVideoAdFragment.loadVideoAD(new VideoDetailVideoAdFragment.IVideoAdListener() {
                        @Override
                        public void finishPlay() {
                            getSupportFragmentManager().beginTransaction().remove(mVideoDetailVideoAdFragment);
                            clickPlay();//进入播放事件
                        }
                @Override
                public void startPlay() {
                        @Override
                        public void startPlay() {
                        }
                    });
                }
            });
        } else {
            if (!mVideoDetailVideoAdFragment.isAdded()) {
                getSupportFragmentManager().beginTransaction().replace(R.id.fl_ad, mVideoDetailVideoAdFragment).commit();
            }
        } else {//进入播放视频事件
            clickPlay();
        }
    }
@@ -367,12 +396,23 @@
                        Toast.LENGTH_LONG).show();
                return;
            } else if (playUrl.getPlayType() == 1) {
                Intent intent = new Intent(VideoDetailActivity.this,
                        FXBrowserActivity.class);
                intent.putExtra("url", playUrl.getUrl());
                startActivity(intent);
//                Intent intent = new Intent(VideoDetailActivity.this,
//                        FXBrowserActivity.class);
//                intent.putExtra("url", playUrl.getUrl());
//                startActivity(intent);
                saveWatchHistory("风行");
            }
            fl_video_play_background.setVisibility(View.GONE);
            //播放风行视频
            //添加风行播放页
            mFunshionPlayerFragment = new FunshionPlayerFragment();
            Bundle bundle = new Bundle();
            bundle.putString("vid", "83693903");
            mFunshionPlayerFragment.setArguments(bundle);
            if (!mFunshionPlayerFragment.isAdded()) {
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_video_play_container, mFunshionPlayerFragment).commit();
            }
            //开始播放视频
        } else {
            if (playUrl.getPlayType() == 0) {
                Toast.makeText(VideoDetailActivity.this, "此节目不可播!",
@@ -507,7 +547,7 @@
    private void checkConfiguration(Configuration newConfig) {
        if (newConfig == null)
            return;
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//横屏
            // Hide the status bar隐藏状态栏
            WindowManager.LayoutParams attrs = getWindow().getAttributes();
            attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
@@ -532,6 +572,8 @@
                    R.id.fragment_video_play_container).getLayoutParams();
            layoutParams.height = android.view.ViewGroup.LayoutParams.MATCH_PARENT;
            findViewById(R.id.fragment_video_play_container).requestLayout();
        } else {
            // Show the status bar显示状态栏
            WindowManager.LayoutParams attrs = getWindow().getAttributes();
@@ -717,7 +759,7 @@
                                        .getBooleanExtra("isFromWatchHistory",
                                                false);// 是否从观看记录点击过来
                                Log.i("mResult", "是否是从观看记录点击进来的:" + isFromWatchHistory);
                                if (isFromWatchHistory||position>0) {
                                if (isFromWatchHistory || position > 0) {
                                    mPosition = getIntent().getIntExtra("playing_position", 0);
                                    EventBus.getDefault().post(videoInfo);
                                    getUrl(videoInfo.getVideoDetailList().get(mPosition), isSetup);
BuWanVideo/src/com/weikou/beibeivideo/ui/video/FunshionPlayerFragment.java
New file
@@ -0,0 +1,278 @@
package com.weikou.beibeivideo.ui.video;
import android.content.res.Configuration;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
import com.fun.xm.Definition;
import com.fun.xm.FSCallback;
import com.fun.xm.FSIVideoPlayer;
import com.fun.xm.FSPlayer;
import com.fun.xm.FSVideoReqData;
import com.funshion.video.logger.FSLogcat;
import com.funshion.video.util.FSError;
import com.lcjian.library.RetainViewFragment;
import com.lcjian.library.video.VideoPlayerController;
import com.weikou.beibeivideo.BeibeiVideoApplication;
import com.weikou.beibeivideo.R;
import com.weikou.beibeivideo.util.downutil.StringUtils;
import com.weikou.beibeivideo.util.ui.IPageEventListener;
import java.io.IOException;
import java.util.List;
public class FunshionPlayerFragment extends RetainViewFragment implements OnClickListener {
    private final static String TAG = FunshionPlayerFragment.class.getName();
    private final static String ACCESS_TOKEN = "Zms4NHZseSwxNjAwNDE4MDQ0LDU0MmQyNDI5ZjY5MGQwODM1OTcyYTM3MDMwOTg3MzNj";
    public final static String APICODE = "fk84vly";
    //媒体视频播放器
    private MediaPlayer mVideoPlayer = new MediaPlayer();
    //视频用 surfaceView
    private SurfaceView mVideoSurfView;
    //播放逻辑调度
    private FSIVideoPlayer mFunshionIVideoPlayer;
    //清晰度列表
    FSVideoReqData mFSVideoReqData;
    private List<Definition> mDefinitions;
    private Definition mCurrDefinition;
    private IPageEventListener pageEventListener;
    private VideoPlayerController vpc_funshion;
    public void setPageEventListener(IPageEventListener pageEventListener) {
        this.pageEventListener = pageEventListener;
    }
    @Override
    public int getContentResource() {
        return R.layout.fragment_player_funshion;
    }
    private void initPlayer() {
        mVideoSurfView.getHolder().addCallback(mVideoSurfaceViewCallBack);
        mVideoPlayer.setOnPreparedListener(mOnPreparedListener);
        mVideoPlayer.setOnErrorListener(mOnErrorListener);
        initAccessToken();
        if (getArguments() != null) {
            String mediaId = getArguments().getString("mediaId");
            String ep = getArguments().getString("ep");
            String vid = getArguments().getString("vid");
            mVideoSurfView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (StringUtils.isNullOrEmpty(vid))
                        playMedia(mediaId, ep);
                    else
                        playVideo(vid);
                }
            }, 1000);
        }
        vpc_funshion.setContentView(mVideoSurfView);
        vpc_funshion.build(getActivity());
    }
    private void initView(View view) {
        mVideoSurfView = view.findViewById(R.id.video_view);
        vpc_funshion = view.findViewById(R.id.vpc_funshion);
    }
    @Override
    public void onCreateView(View contentView, Bundle savedInstanceState) {
        initView(contentView);
        initPlayer();
    }
    @Override
    public void onClick(View v) {
    }
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }
    /**
     * 播放视频
     */
    public synchronized void playVideo(String videoID) {
        createPlayer();
        if (mVideoPlayer.isPlaying()) {
            FSLogcat.e(TAG, "Call player to stop");
            mVideoPlayer.stop();
            mVideoPlayer.reset();
        }
        //!!!注意播放长短视频构建的FSVideoReqData有区别。短视频没有epso分集ID。长视频有。填写错误将无法正常播放
        //FSVideoReqData构建需要的数据需要从服务器获取。主要是媒体资源videoID:“VIDEO_ID” 默认 清晰度:new Definition(Definition.CLARITY_LOW) 以及Accesstoken:Accesstoken
        mFSVideoReqData = new FSVideoReqData(videoID, new Definition(Definition.CLARITY_LOW), ACCESS_TOKEN);
        try {
            Log.d(TAG, "request");
            mFunshionIVideoPlayer.requestAndPrepare(mFSVideoReqData, APICODE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 播放媒体
     */
    public synchronized void playMedia(String mediaID, String epso) {
        createPlayer();
        if (mVideoPlayer.isPlaying()) {
            FSLogcat.e(TAG, "Call player to stop");
            mVideoPlayer.stop();
            mVideoPlayer.reset();
        }
        //!!!注意播放长短视频构建的FSVideoReqData有区别。短视频没有epso分集ID。长视频有。填写错误将无法正常播放
        //FSVideoReqData构建需要的数据需要从服务器获取。主要是媒体资源videoID:“VIDEO_ID”epso 媒体分集ID 默认 清晰度:new Definition(Definition.CLARITY_LOW) 以及Accesstoken:Accesstoken
        mFSVideoReqData = new FSVideoReqData(mediaID, epso, new Definition(Definition.CLARITY_LOW), ACCESS_TOKEN);
        try {
            Log.d(TAG, "request");
            mFunshionIVideoPlayer.requestAndPrepare(mFSVideoReqData, APICODE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public synchronized void stopPlay() {
        if (mVideoPlayer != null && mVideoPlayer.isPlaying()) {
            FSLogcat.e(TAG, "Call player to stop");
            mVideoPlayer.stop();
            mVideoPlayer.reset();
        }
    }
    private void createPlayer() {
        if (mFunshionIVideoPlayer != null) {
            return;
        }
        try {
            //APICODE 为风行派申请的APICODE值
            mFunshionIVideoPlayer = FSPlayer.create(getContext(), mFSCall);
            //可以打开调试信息方便查询问题
            mFunshionIVideoPlayer.setDebug(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    FSCallback mFSCall = new FSCallback() {
        @Override
        public void onDefinition(List<Definition> definitions, Definition currDefinition) {
            for (Definition definition : definitions) {
                Log.e("FE", "get Definition " + definition);
            }
            FunshionPlayerFragment.this.mDefinitions = definitions;
            FunshionPlayerFragment.this.mCurrDefinition = currDefinition;
            Toast.makeText(BeibeiVideoApplication.application, "当前清晰度:" + currDefinition.getStringDefinition(), Toast.LENGTH_LONG).show();
        }
        @Override
        public void onFailed(FSError arg0) {
            Log.d(TAG, "onFailed" + arg0);
        }
        public void onReceiveUrl(String url) {
            Log.d(TAG, "onReceiveUrl" + url);
            try {
                mVideoPlayer.reset();
                mVideoPlayer.setDataSource(url);
                mVideoPlayer.prepareAsync();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };
    SurfaceHolder.Callback mVideoSurfaceViewCallBack = new SurfaceHolder.Callback() {
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            mVideoPlayer.setDisplay(holder);
        }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        }
    };
    MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mFunshionIVideoPlayer.onMediaPlayerPrepared();
            mp.start();
        }
    };
    MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            mFunshionIVideoPlayer.onMediaPlayerError(what, extra);
            return false;
        }
    };
    //TODO 获取AcessToken
    private void initAccessToken() {
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        stopPlay();
        if (mFunshionIVideoPlayer != null) {
            mFunshionIVideoPlayer.onActivityDestroy();
            mFunshionIVideoPlayer.release();
        }
    }
    @Override
    public void onDetach() {
        super.onDetach();
    }
    @Override
    public void onStop() {
        super.onStop();
        if (mVideoPlayer != null && mVideoPlayer.isPlaying())
            mVideoPlayer.pause();
    }
}
BuWanVideo/src/com/weikou/beibeivideo/util/ui/IPageEventListener.java
New file
@@ -0,0 +1,5 @@
package com.weikou.beibeivideo.util.ui;
public interface IPageEventListener {
    public void onCreateView();
}
library-Funshion/.gitignore
New file
@@ -0,0 +1 @@
/build
library-Funshion/build.gradle
New file
@@ -0,0 +1,34 @@
apply plugin: 'com.android.library'
android {
    compileSdkVersion 30
    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
        ndk {
            abiFilters 'armeabi'
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    api files('libs/FunshionBase-1.0.5.aar')
    api files('libs/FunshionPlaySDK-1.6.1.aar')
}
library-Funshion/consumer-rules.pro
library-Funshion/libs/FunshionAD-1.0.0.aar
Binary files differ
library-Funshion/libs/FunshionBase-1.0.5.aar
Binary files differ
library-Funshion/libs/FunshionPlaySDK-1.6.1.aar
Binary files differ
library-Funshion/libs/armeabi/libfsp2p.so
Binary files differ
library-Funshion/proguard-rules.pro
New file
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
library-Funshion/src/androidTest/java/com/yeshi/ec/library_funshion/ExampleInstrumentedTest.java
New file
@@ -0,0 +1,25 @@
package com.yeshi.ec.library_funshion;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
 * Instrumented test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
        assertEquals("com.yeshi.ec.library_funshion.test", appContext.getPackageName());
    }
}
library-Funshion/src/main/AndroidManifest.xml
New file
@@ -0,0 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yeshi.ec.library_funshion">
    /
</manifest>
library-Funshion/src/test/java/com/yeshi/ec/library_funshion/ExampleUnitTest.java
New file
@@ -0,0 +1,17 @@
package com.yeshi.ec.library_funshion;
import org.junit.Test;
import static org.junit.Assert.*;
/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() {
        assertEquals(4, 2 + 2);
    }
}
library-mine/res/anim/rotate_dialog_player_loading.xml
New file
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <rotate
        android:fromDegrees="0"
        android:toDegrees="359"
        android:duration="1000"
        android:repeatCount="-1"
        android:pivotX="50%"
        android:pivotY="50%" />
</set>
library-mine/res/drawable-xhdpi/ic_battery_1.png
library-mine/res/drawable-xhdpi/ic_battery_10.png
library-mine/res/drawable-xhdpi/ic_battery_2.png
library-mine/res/drawable-xhdpi/ic_battery_3.png
library-mine/res/drawable-xhdpi/ic_battery_4.png
library-mine/res/drawable-xhdpi/ic_battery_5.png
library-mine/res/drawable-xhdpi/ic_battery_6.png
library-mine/res/drawable-xhdpi/ic_battery_7.png
library-mine/res/drawable-xhdpi/ic_battery_8.png
library-mine/res/drawable-xhdpi/ic_player_back.png
library-mine/res/drawable-xhdpi/ic_player_collecte.png
library-mine/res/drawable-xhdpi/ic_player_collected.png
library-mine/res/drawable-xhdpi/ic_player_definition_right.png
library-mine/res/drawable-xhdpi/ic_player_download.png
library-mine/res/drawable-xhdpi/ic_player_episode.png
library-mine/res/drawable-xhdpi/ic_player_full_screen.png
library-mine/res/drawable-xhdpi/ic_player_loading.png
library-mine/res/drawable-xhdpi/ic_player_lock.png
library-mine/res/drawable-xhdpi/ic_player_pause.png
library-mine/res/drawable-xhdpi/ic_player_pause_big.png
library-mine/res/drawable-xhdpi/ic_player_play.png
library-mine/res/drawable-xhdpi/ic_player_play_big.png
library-mine/res/drawable-xhdpi/ic_player_share.png
library-mine/res/drawable-xhdpi/ic_player_unlock.png
library-mine/res/drawable/layer_player_progressbar.xml
New file
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dp" />
            <solid android:color="#F0F0F0" />
        </shape>
    </item>
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dp" />
                <solid android:color="#F0F0F0" />
            </shape>
        </clip>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dp" />
                <solid android:color="#FF078D" />
            </shape>
        </clip>
    </item>
</layer-list>
library-mine/res/drawable/shape_player_definition_bg.xml
New file
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#7D7D7D"></solid>
    <corners android:radius="50dp"></corners>
</shape>
library-mine/res/drawable/shape_player_dialog_bg_gray.xml
New file
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#80000000" />
    <corners
        android:bottomLeftRadius="6dp"
        android:bottomRightRadius="6dp"
        android:topLeftRadius="6dp"
        android:topRightRadius="6dp" />
</shape>
library-mine/res/drawable/shape_player_dialog_bg_white.xml
New file
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#fffafafa" />
    <corners
        android:bottomLeftRadius="17dp"
        android:bottomRightRadius="17dp"
        android:topLeftRadius="17dp"
        android:topRightRadius="17dp" />
</shape>
library-mine/res/drawable/shape_player_thumb.xml
New file
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"></solid>
    <corners android:radius="50dp"></corners>
    <size
        android:width="11dp"
        android:height="11dp"></size>
</shape>
library-mine/res/layout-land/video_player_controller.xml
New file
@@ -0,0 +1,275 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--顶部控件 -->
    <LinearLayout
        android:id="@+id/ll_top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#b3000000"
        android:orientation="vertical">
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="10dp"
            android:paddingTop="6dp"
            android:paddingRight="10dp"
            android:paddingBottom="6dp">
            <ImageView
                android:id="@+id/iv_network"
                android:layout_width="wrap_content"
                android:layout_height="11dp"
                android:layout_gravity="left|center_vertical"></ImageView>
            <TextView
                android:id="@+id/tv_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:text="11:54"
                android:textColor="#ffffffff"
                android:textSize="11sp" />
            <ImageView
                android:id="@+id/iv_electric"
                android:layout_width="wrap_content"
                android:layout_height="12dp"
                android:layout_gravity="right|center_vertical"
                android:src="@drawable/ic_battery_1"></ImageView>
        </FrameLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:paddingLeft="10dp"
            android:paddingRight="20dp">
            <ImageView
                android:id="@+id/iv_back"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="12dp"
                android:src="@drawable/ic_player_back"></ImageView>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
                <TextView
                    android:id="@+id/tv_title"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:lines="1"
                    android:text="致青春·原来你还在这里"
                    android:textColor="#FFFFFF"
                    android:textSize="18sp"></TextView>
                <TextView
                    android:id="@+id/tv_link"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text=""
                    android:textColor="#ffffffff"
                    android:textSize="7sp" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
                <ImageView
                    android:id="@+id/iv_collection"
                    android:layout_width="21dp"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_player_collecte"></ImageView>
                <ImageView
                    android:id="@+id/iv_download"
                    android:layout_width="21dp"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:src="@drawable/ic_player_download"></ImageView>
                <ImageView
                    android:id="@+id/iv_share"
                    android:layout_width="21dp"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:src="@drawable/ic_player_share"></ImageView>
                <ImageView
                    android:id="@+id/iv_episode"
                    android:layout_width="21dp"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:src="@drawable/ic_player_episode"></ImageView>
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
    <!-- 中间 -->
    <!--锁屏 -->
    <ImageView
        android:id="@+id/iv_lock"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right|center_vertical"
        android:layout_marginRight="20dp"
        android:src="@drawable/ic_player_unlock">
    </ImageView>
    <ImageView
        android:id="@+id/iv_play_center"
        android:layout_width="50dp"
        android:visibility="gone"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:src="@drawable/ic_player_play_big"></ImageView>
    <!--底部 -->
    <FrameLayout
        android:id="@+id/fl_bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:background="#b3000000"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:paddingLeft="20dp"
            android:paddingTop="5dp"
            android:paddingRight="15dp"
            android:paddingBottom="5dp">
            <ImageView
                android:id="@+id/iv_play"
                android:layout_width="38dp"
                android:layout_height="38dp"
                android:layout_gravity="left|center_vertical"
                android:src="@drawable/ic_player_play"></ImageView>
            <!--下一集 -->
            <ImageView
                android:id="@+id/iv_next"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"></ImageView>
            <!--播放进度 -->
            <TextView
                android:id="@+id/tv_progress"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="35dp"
                android:text="09:54"
                android:textColor="#ffffff"
                android:textSize="14sp"></TextView>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="11.5dp"
                android:text="|"
                android:textColor="#ffffff"
                android:textSize="14sp"></TextView>
            <!--视频总时长 -->
            <TextView
                android:id="@+id/tv_duration"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="11.5dp"
                android:text="18:04"
                android:textColor="#ffffff"
                android:textSize="14sp"></TextView>
            <View
                android:layout_width="0dp"
                android:layout_height="1dp"
                android:layout_weight="1"></View>
            <!--清晰度 -->
            <TextView
                android:id="@+id/tv_definition"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/shape_player_definition_bg"
                android:drawableRight="@drawable/ic_player_definition_right"
                android:drawablePadding="6dp"
                android:padding="8dp"
                android:text="清晰度:高清"
                android:textColor="#ffeeeeee"
                android:textSize="9sp" />
            <!-- 来源 -->
            <TextView
                android:id="@+id/tv_resource"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="12.5dp"
                android:layout_marginRight="12dp"
                android:background="@drawable/shape_player_definition_bg"
                android:drawablePadding="6dp"
                android:padding="8dp"
                android:text="来源:爱奇艺"
                android:textColor="#ffeeeeee"
                android:textSize="9sp" />
            <ImageView
                android:id="@+id/iv_full_screen"
                android:layout_width="wrap_content"
                android:layout_height="35dp"
                android:padding="10dp"
                android:src="@drawable/ic_player_full_screen"
                android:visibility="gone"></ImageView>
        </LinearLayout>
        <!-- 进度 -->
        <SeekBar
            android:id="@+id/seekBar"
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:max="100"
            android:maxHeight="3dp"
            android:minHeight="3dp"
            android:paddingLeft="0dp"
            android:paddingRight="0dp"
            android:progress="10"
            android:progressDrawable="@drawable/layer_player_progressbar"
            android:splitTrack="false"
            android:thumb="@drawable/shape_player_thumb"
            android:thumbOffset="5dp" />
    </FrameLayout>
</FrameLayout>
library-mine/res/layout/item_player_loading.xml
New file
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/shape_player_dialog_bg_gray">
    <ImageView
        android:id="@+id/iv_loading"
        android:layout_width="51dp"
        android:layout_height="51dp"
        android:layout_gravity="center"
        android:src="@drawable/ic_player_loading">
    </ImageView>
</FrameLayout>
library-mine/res/layout/item_player_notify.xml
New file
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/shape_player_dialog_bg_white"
    android:gravity="center_horizontal"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="18dp"
        android:text="网络提醒"
        android:textColor="#333333"
        android:textSize="18sp" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:gravity="center"
        android:padding="20dp"
        android:text="您现在正在使用移动数据观看"
        android:textColor="#99232323"
        android:textSize="16sp" />
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#E1E1E1"></View>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <TextView
            android:id="@+id/tv_contiue"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="土豪请随意"
            android:textColor="#ff999999"
            android:textSize="17sp" />
        <View
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp"
            android:background="#E1E1E1"></View>
        <TextView
            android:id="@+id/tv_close"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="关闭视频"
            android:textColor="#ff333333"
            android:textSize="17sp" />
    </LinearLayout>
</LinearLayout>
library-mine/res/layout/media_controller.xml
@@ -1,23 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 The Android Open Source Project
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
          http://www.apache.org/licenses/LICENSE-2.0
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#CC000000"
    android:orientation="vertical"
    android:layoutDirection="ltr">
library-mine/res/layout/video_player_controller.xml
New file
@@ -0,0 +1,271 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--顶部控件 -->
    <LinearLayout
        android:id="@+id/ll_top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#b3000000"
        android:orientation="vertical">
        <FrameLayout
            android:visibility="gone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="10dp"
            android:paddingTop="6dp"
            android:paddingRight="10dp"
            android:paddingBottom="6dp">
            <ImageView
                android:id="@+id/iv_network"
                android:layout_width="wrap_content"
                android:layout_height="11dp"
                android:layout_gravity="left|center_vertical"></ImageView>
            <TextView
                android:id="@+id/tv_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:text="11:54"
                android:textColor="#ffffffff"
                android:textSize="11sp" />
            <ImageView
                android:id="@+id/iv_electric"
                android:layout_width="wrap_content"
                android:layout_height="12dp"
                android:layout_gravity="right|center_vertical"
                android:src="@drawable/ic_battery_1"></ImageView>
        </FrameLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:paddingLeft="10dp"
            android:paddingTop="7.5dp"
            android:paddingRight="20dp"
            android:paddingBottom="7.5dp">
            <ImageView
                android:id="@+id/iv_back"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="12dp"
                android:src="@drawable/ic_player_back"></ImageView>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
                <TextView
                    android:id="@+id/tv_title"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:lines="1"
                    android:text="致青春·原来你还在这里"
                    android:textColor="#FFFFFF"
                    android:textSize="18sp"></TextView>
                <TextView
                    android:id="@+id/tv_link"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text=""
                    android:textColor="#ffffffff"
                    android:textSize="7sp" />
            </LinearLayout>
            <LinearLayout
                android:visibility="gone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
                <ImageView
                    android:id="@+id/iv_collection"
                    android:layout_width="21dp"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_player_collecte"></ImageView>
                <ImageView
                    android:id="@+id/iv_download"
                    android:layout_width="21dp"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:src="@drawable/ic_player_download"></ImageView>
                <ImageView
                    android:id="@+id/iv_share"
                    android:layout_width="21dp"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:src="@drawable/ic_player_share"></ImageView>
                <ImageView
                    android:id="@+id/iv_episode"
                    android:layout_width="21dp"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:src="@drawable/ic_player_episode"></ImageView>
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
    <!-- 中间 -->
    <!--锁屏 -->
    <ImageView
        android:id="@+id/iv_lock"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right|center_vertical"
        android:layout_marginRight="20dp"
        android:visibility="gone"
        android:src="@drawable/ic_player_unlock">
    </ImageView>
    <ImageView
        android:id="@+id/iv_play_center"
        android:layout_width="50dp"
        android:visibility="gone"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:src="@drawable/ic_player_play_big"></ImageView>
    <!--底部 -->
    <FrameLayout
        android:id="@+id/ll_bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:background="#b3000000"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:paddingLeft="10dp"
            android:paddingTop="5dp"
            android:paddingBottom="5dp">
            <ImageView
                android:id="@+id/iv_play"
                android:layout_width="38dp"
                android:layout_height="38dp"
                android:layout_gravity="left|center_vertical"
                android:src="@drawable/ic_player_play"></ImageView>
            <!--下一集 -->
            <ImageView
                android:id="@+id/iv_next"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"></ImageView>
            <!--播放进度 -->
            <TextView
                android:id="@+id/tv_progress"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:text="09:54"
                android:textColor="#ffffff"
                android:textSize="14sp"></TextView>
            <SeekBar
                android:layout_marginLeft="4dp"
                android:layout_marginRight="4dp"
                android:id="@+id/seekBar"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="20dp"
                android:max="100"
                android:maxHeight="3dp"
                android:minHeight="3dp"
                android:paddingLeft="0dp"
                android:paddingRight="0dp"
                android:progress="10"
                android:progressDrawable="@drawable/layer_player_progressbar"
                android:splitTrack="false"
                android:thumb="@drawable/shape_player_thumb"
                android:thumbOffset="5dp" />
            <!--视频总时长 -->
            <TextView
                android:id="@+id/tv_duration"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="18:04"
                android:textColor="#ffffff"
                android:textSize="14sp"></TextView>
            <!--清晰度 -->
            <TextView
                android:visibility="gone"
                android:id="@+id/tv_definition"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/shape_player_definition_bg"
                android:drawableRight="@drawable/ic_player_definition_right"
                android:drawablePadding="6dp"
                android:padding="8dp"
                android:text="清晰度:高清"
                android:textColor="#ffeeeeee"
                android:textSize="9sp" />
            <!-- 来源 -->
            <TextView
                android:visibility="gone"
                android:id="@+id/tv_resource"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="12.5dp"
                android:layout_marginRight="12dp"
                android:background="@drawable/shape_player_definition_bg"
                android:drawablePadding="6dp"
                android:padding="8dp"
                android:text="来源:爱奇艺"
                android:textColor="#ffeeeeee"
                android:textSize="9sp" />
            <ImageView
                android:id="@+id/iv_full_screen"
                android:layout_width="wrap_content"
                android:layout_height="35dp"
                android:padding="10dp"
                android:src="@drawable/ic_player_full_screen"
                android:visibility="visible"></ImageView>
        </LinearLayout>
        <!-- 进度 -->
    </FrameLayout>
</FrameLayout>
library-mine/res/values/styles.xml
@@ -38,4 +38,13 @@
        <item name="android:windowCloseOnTouchOutside">true</item>
    </style>
    <style name="Dialog" parent="android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:background">#00000000</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowIsFloating">true</item>
    </style>
</resources>
library-mine/src/com/lcjian/library/video/VideoDataNotifyDialog.java
New file
@@ -0,0 +1,86 @@
package com.lcjian.library.video;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import com.lcjian.lcjianlibrary.R;
import com.lcjian.library.util.common.DimenUtils;
public class VideoDataNotifyDialog extends Dialog {
    private IDialogClick dialogClick;
    public VideoDataNotifyDialog(@NonNull Context context) {
        super(context);
    }
    public VideoDataNotifyDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }
    public static class Builder {
        private IDialogClick dialogClick;
        public Builder setDialogClick(IDialogClick dialogClick) {
            this.dialogClick = dialogClick;
            return this;
        }
        public VideoDataNotifyDialog build(Activity context) {
            final VideoDataNotifyDialog videoLoadingDialog = new VideoDataNotifyDialog(context, R.style.Dialog);
            View view = LayoutInflater.from(context).inflate(R.layout.item_player_notify, null);
            view.findViewById(R.id.tv_contiue).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (dialogClick != null)
                        dialogClick.continuePlay();
                    if (videoLoadingDialog.isShowing())
                        videoLoadingDialog.dismiss();
                }
            });
            view.findViewById(R.id.tv_close).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (dialogClick != null)
                        dialogClick.close();
                    if (videoLoadingDialog.isShowing())
                        videoLoadingDialog.dismiss();
                }
            });
            videoLoadingDialog.setContentView(view);
            WindowManager.LayoutParams params = videoLoadingDialog.getWindow()
                    .getAttributes();
            params.width = DimenUtils.getScreenWidth(context) * 5 / 6;
            params.height = WindowManager.LayoutParams.WRAP_CONTENT;
            videoLoadingDialog.getWindow().setAttributes(params);
            videoLoadingDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
            //去除半透明阴影
            WindowManager.LayoutParams layoutParams = videoLoadingDialog.getWindow().getAttributes();
            layoutParams.dimAmount = 0.0f;
            videoLoadingDialog.getWindow().setAttributes(layoutParams);
            videoLoadingDialog.setCanceledOnTouchOutside(false);
            return videoLoadingDialog;
        }
    }
    interface IDialogClick {
        public void continuePlay();
        public void close();
    }
}
library-mine/src/com/lcjian/library/video/VideoLoadingDialog.java
New file
@@ -0,0 +1,56 @@
package com.lcjian.library.video;
import android.app.Dialog;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import com.lcjian.lcjianlibrary.R;
import com.lcjian.library.util.common.DimenUtils;
public class VideoLoadingDialog extends Dialog {
    public VideoLoadingDialog(@NonNull Context context) {
        super(context);
    }
    public VideoLoadingDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }
    public static VideoLoadingDialog build(Context context) {
        VideoLoadingDialog videoLoadingDialog = new VideoLoadingDialog(context, R.style.Dialog);
        View view = LayoutInflater.from(context).inflate(R.layout.item_player_loading, null);
        ImageView imageView = view.findViewById(R.id.iv_loading);
        Animation operatingAnim = AnimationUtils.loadAnimation(context, R.anim.rotate_dialog_player_loading);
        LinearInterpolator lin = new LinearInterpolator();
        operatingAnim.setInterpolator(lin);
        imageView.setAnimation(operatingAnim);
        operatingAnim.start();
        videoLoadingDialog.setContentView(view);
        android.view.WindowManager.LayoutParams params = videoLoadingDialog.getWindow()
                .getAttributes();
        params.width = DimenUtils.dip2px(context, 95);
        params.height = DimenUtils.dip2px(context, 95);
        videoLoadingDialog.getWindow().setAttributes(params);
        videoLoadingDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
        //去除半透明阴影
        WindowManager.LayoutParams layoutParams = videoLoadingDialog.getWindow().getAttributes();
        layoutParams.dimAmount = 0.0f;
        videoLoadingDialog.getWindow().setAttributes(layoutParams);
        videoLoadingDialog.setCanceledOnTouchOutside(false);
        return videoLoadingDialog;
    }
}
library-mine/src/com/lcjian/library/video/VideoPlayerController.java
New file
@@ -0,0 +1,227 @@
package com.lcjian.library.video;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.media.MediaPlayer;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import com.lcjian.lcjianlibrary.R;
public class VideoPlayerController extends FrameLayout {
    private Activity mActivity;
    private final static String TAG = "VideoPlayerController";
    private MediaPlayer mediaPlayer;
    private IVideoPlayerListener videoPlayerListener;
    //容器
    private FrameLayout fl_bottom;
    private LinearLayout ll_top;
    private View contentView;
    private ImageView iv_back;//返回
    private TextView tv_title;//标题
    private ImageView iv_electric;//电量
    private TextView tv_time;//当前时间
    private ImageView iv_lock;//锁屏
    private ImageView iv_play;//播放
    private SeekBar seekBar;//进度
    private ImageView iv_next;//下一级
    private TextView tv_progress;//现在的播放进度
    private TextView tv_duration;//视频总时长
    private TextView tv_definition;//清晰度
    private ImageView iv_episode;//选集
    private ImageView iv_full_screen;
    public VideoPlayerController setMediaPlayer(MediaPlayer mediaPlayer) {
        this.mediaPlayer = mediaPlayer;
        return this;
    }
    public VideoPlayerController setVideoPlayerListener(IVideoPlayerListener videoPlayerListener) {
        this.videoPlayerListener = videoPlayerListener;
        return this;
    }
    public VideoPlayerController setContentView(View contentView) {
        this.contentView = contentView;
        return this;
    }
    public VideoPlayerController(@NonNull Context context) {
        super(context);
    }
    public VideoPlayerController(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.video_player_controller, this);
        fl_bottom = findViewById(R.id.fl_bottom);
        ll_top = findViewById(R.id.ll_top);
        iv_back = findViewById(R.id.iv_back);
        tv_title = findViewById(R.id.tv_title);
        iv_electric = findViewById(R.id.iv_electric);
        tv_time = findViewById(R.id.tv_time);
        iv_lock = findViewById(R.id.iv_lock);
        iv_play = findViewById(R.id.iv_play);
        seekBar = findViewById(R.id.seekBar);
        iv_next = findViewById(R.id.iv_next);
        tv_progress = findViewById(R.id.tv_progress);
        tv_duration = findViewById(R.id.tv_duration);
        tv_definition = findViewById(R.id.tv_definition);
        iv_episode = findViewById(R.id.iv_episode);
        iv_full_screen = findViewById(R.id.iv_full_screen);
        iv_full_screen.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        });
    }
    private void showController() {
        if (!isLock()) {
            fl_bottom.setVisibility(View.VISIBLE);
            ll_top.setVisibility(View.VISIBLE);
        }
        iv_lock.setVisibility(View.VISIBLE);
    }
    private void hiddenController() {
        fl_bottom.setVisibility(View.GONE);
        ll_top.setVisibility(View.GONE);
        iv_lock.setVisibility(View.GONE);
    }
    private GestureDetector mGesde = new GestureDetector(new MSimpleGestureDectListener());
    /**
     * 初始化
     */
    public void build(Activity mActivity) {
        this.mActivity = mActivity;
        contentView.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mGesde.onTouchEvent(event);
                return true;
            }
        });
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            boolean isTouch = false;
            @Override
            public void onProgressChanged(SeekBar seekBar, int precent, boolean b) {
                if (isTouch) {
                    //计算  拖拉后的  时间长度:
                    int positionLong = mediaPlayer.getDuration() * seekBar.getProgress() / 100;
                    mediaPlayer.seekTo(positionLong);
                }
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
//                mHandler.removeMessages(0);
//                isTouch = true;
//                mediaPlayer.pause();
//                stop$play.setImageResource(R.mipmap.play_small);
            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
//                if (controllerView.getVisibility() == View.VISIBLE) {
//                    if (mHandler != null) {
//                        mHandler.sendEmptyMessageDelayed(0, 4000);
//                    }
//                }
                isTouch = false;
                mediaPlayer.start();
//                stop$play.setImageResource(R.mipmap.stop_small);
            }
        });
    }
    public void changeOrien(Activity activity) {
//        boolean tag = requestOrien.getTag() == null ? false : (boolean) requestOrien.getTag();
//        activity.setRequestedOrientation(!tag ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//        requestOrien.setTag(!tag);
    }
    //锁屏
    private void lock() {
        hiddenController();
    }
    //解锁屏
    private void unLock() {
        if (isLock())
            showController();
    }
    interface IVideoPlayerListener {
        //点击了暂停按钮
        public void onPause();
        //下一集
        public void onNext();
        //返回
        public void onBack();
    }
    private boolean isLock() {
        return false;
    }
    private boolean isControllerShow() {
        return ll_top.getVisibility() == View.VISIBLE;
    }
    //手势处理
    private class MSimpleGestureDectListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            if (isControllerShow()) {
                hiddenController();
            } else {
                showController();
            }
            return true;
        }
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            Log.i(TAG, String.format("onScroll:distanceX=%s distanceY=%s", distanceX, distanceY));
            if (distanceX != 0) {
            }
            return true;
        }
    }
}
settings.gradle
@@ -1,3 +1,4 @@
include ':library-Funshion'
include ':social_sdk_library_project', ':YoukuPlayerOpenSDK'
include ':MyselfSuperAd'
include ':GuangDianTongSDK'