0

我已经使用了 exoPlayer Library 我想要做的是将数据从 recyclerview 传递到下一个可以正常工作的活动 播放视频并获取标题和 desc 但是当我旋转手机时,我只想显示 simpleexovideoview 和视频正在播放,但活动名称仍然存在。我使用了 < android:configChanges="orientation|screenSize" > 来处理以下方向的变化是活动的快照

纵向视图

肖像 风景

旋转图像

代码如下

视频播放器.xml

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.kaushal.myapplication.MainActivity"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="81dp">

    <android.support.constraint.Guideline
        android:id="@+id/horizontalHalf"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="256dp" />


    <TextView
        android:id="@+id/VideoTitle"
        android:textSize="22sp"
        android:text="video title"
        android:textStyle="bold"
        android:layout_margin="12dp"
        android:textColor="#016699"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="@+id/horizontalHalf" />


    <com.google.android.exoplayer2.ui.SimpleExoPlayerView
        android:id="@+id/videoplayer"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:adjustViewBounds="true"
        app:layout_constraintBottom_toTopOf="@+id/horizontalHalf"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0" />

    <TextView
        android:id="@+id/VideoDesc"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:ems="10"
        android:text="Video Desc"
        app:layout_constraintLeft_toLeftOf="parent"
        android:textSize="18sp"
        android:layout_margin="12dp"
        app:layout_constraintTop_toBottomOf="@+id/VideoTitle"
        tools:layout_editor_absoluteY="477dp"
        android:layout_marginLeft="12dp" />

</android.support.constraint.ConstraintLayout>

视频活动

    package com.example.kaushal.myapplication;
        /**
         * Created by kaushal on 06-09-2017.
         */
        public class videoplay extends AppCompatActivity implements 
        ExoPlayer.EventListener {
        TextView vidtitle, videodesc;
        String videpath;
        SimpleExoPlayer exoplayer;
        SimpleExoPlayerView exoPlayerView;
        PlaybackStateCompat.Builder videosessionBuilder;
        final static String TAG = videoplay.class.getName();
        private RelativeLayout.LayoutParams paramsNotFullscreen;
        RelativeLayout rl;

        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.videoplayer);

            vidtitle = (TextView) findViewById(R.id.VideoTitle);
            videodesc = (TextView) findViewById(R.id.VideoDesc);
            exoPlayerView = (SimpleExoPlayerView) 
            findViewById(R.id.videoplayer);
            vidtitle.setText(getIntent().getStringExtra("videotitle"));
            videodesc.setText(getIntent().getStringExtra("videodesc"));
            videpath = getIntent().getStringExtra("videourl");
            mediaSession();
            Uri uri = Uri.parse(videpath);
            intializePlayer(uri);
        }
            @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){

                paramsnotfullscreen= (RelativeLayout.LayoutParams)exoPlayerView.getLayoutParams();
                RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(paramsnotfullscreen);
                params.setMargins(0, 0, 0, 0);
                params.height= ViewGroup.LayoutParams.MATCH_PARENT;
                params.width=ViewGroup.LayoutParams.MATCH_PARENT;
                params.addRule(RelativeLayout.CENTER_IN_PARENT);
                exoPlayerView.setLayoutParams(params);
            }else if (newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){
                exoPlayerView.setLayoutParams(paramsnotfullscreen);
            }
        }   //refrence = https://stackoverflow.com/questions/13011891/make-a-fullscreen-in-only-layout-land-android-when-play-videoview 

        public void intializePlayer(Uri uri) {
            DefaultTrackSelector dfs = new DefaultTrackSelector();
            DefaultLoadControl dfc = new DefaultLoadControl();
            exoplayer = ExoPlayerFactory.newSimpleInstance(this, dfs, dfc);
            exoPlayerView.setPlayer(exoplayer);
            //Prepare Media source
            String useragent = Util.getUserAgent(this, "MyApplication");
            MediaSource mediaSource = new ExtractorMediaSource(uri, new DefaultDataSourceFactory(this, useragent),
                    new DefaultExtractorsFactory(), null, null);
            exoplayer.prepare(mediaSource);
            exoplayer.setPlayWhenReady(true);
        }
        public void releasePlayer() {
            exoplayer.stop();
            exoplayer.release();
            exoplayer = null;
        }
        public void mediaSession() {
            MediaSessionCompat mediaSessionCompat = new MediaSessionCompat(this, TAG);
          mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
                    MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

            mediaSessionCompat.setMediaButtonReceiver(null);

            videosessionBuilder = new PlaybackStateCompat.Builder().setActions(PlaybackStateCompat.ACTION_PLAY |
                    PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_PLAY_PAUSE);

            mediaSessionCompat.setPlaybackState(videosessionBuilder.build());

            mediaSessionCompat.setCallback(new mediaSessionCallback());

            mediaSessionCompat.setActive(true);
        }


        public class mediaSessionCallback extends MediaSessionCompat.Callback {


            @Override
            public void onPlay() {
                exoplayer.setPlayWhenReady(true);
            }

            @Override
            public void onPause() {
                exoplayer.setPlayWhenReady(false);
            }

            @Override
            public void onSkipToPrevious() {
                exoplayer.seekTo(0);
            }
        }


        //Exo player methods
        @Override
        public void onTimelineChanged(Timeline timeline, Object manifest) {

        }

        @Override
        public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

        }

        @Override
        public void onLoadingChanged(boolean isLoading) {

        }

        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            if ((playbackState == exoplayer.STATE_READY) && playWhenReady) {
                Log.d(TAG, "Player running");
            } else if (playbackState == exoplayer.STATE_READY) {
                Log.d(TAG, "paused");
            }
        }

        @Override
        public void onPlayerError(ExoPlaybackException error) {

        }

        @Override
        public void onPositionDiscontinuity() {

        }

        //When Activity is been destroyed
        @Override
        protected void onDestroy() {
            super.onDestroy();
            releasePlayer();
        }
    } 
4

1 回答 1

0

这是一个名为same-name-layout -land.xml 布局的选项,您可以处理您的横向情况,Android 会在您的设备旋转时自动接收并充气,您可以管理您的 Activity 应如何显示给用户,只要存在这个很酷的选项,您只需将您的 VideoPlayer xml 标记与“match_parent”一起放置在横向版本的 xml 布局中的高度和宽度。

更新:当然,如果你想让你的视频播放器占据整个屏幕,你必须删除它的默认边距,并且为了使工具栏消失,你必须创建两个不同的 style.xml。将一个放入 res/values-port,另一个放入 res/values-land,在横向版本中,您必须为其选择一个 *.NoActionBar 版本的主题。

于 2017-09-11T12:03:44.827 回答