diff --git a/app/src/main/java/io/microshow/rxffmpeg/app/activity/MainActivity.java b/app/src/main/java/io/microshow/rxffmpeg/app/activity/MainActivity.java index 1974bd6..487745c 100644 --- a/app/src/main/java/io/microshow/rxffmpeg/app/activity/MainActivity.java +++ b/app/src/main/java/io/microshow/rxffmpeg/app/activity/MainActivity.java @@ -82,18 +82,34 @@ private View getHomeTabItem(int index) { public boolean onKeyDown(int keyCode, KeyEvent event) { Fragment mFragment = getSupportFragmentManager().findFragmentByTag(myTabhost.getCurrentTabTag()); - MeFragment mFindFragment = null; + MeFragment mMeFragment = null; + FindFragment mFindFragment = null; if (mFragment instanceof MeFragment) { - mFindFragment = (MeFragment) mFragment; + mMeFragment = (MeFragment) mFragment; } - if (mFindFragment != null && mFindFragment.onKeyDown(keyCode, event)) { - return true; + if (mFragment instanceof FindFragment) { + mFindFragment = (FindFragment) mFragment; + } + + if (mMeFragment != null) { + if (mMeFragment.onKeyDown(keyCode, event)) { + return true; + } else { + return super.onKeyDown(keyCode, event); + } + + } else if (mFindFragment != null) { + if (mFindFragment.onKeyDown(keyCode, event)) { + return true; + } else { + return super.onKeyDown(keyCode, event); + } + } else { return super.onKeyDown(keyCode, event); } - } @Override diff --git a/app/src/main/java/io/microshow/rxffmpeg/app/fragment/BaseFragment.java b/app/src/main/java/io/microshow/rxffmpeg/app/fragment/BaseFragment.java index da92744..5bbf3df 100644 --- a/app/src/main/java/io/microshow/rxffmpeg/app/fragment/BaseFragment.java +++ b/app/src/main/java/io/microshow/rxffmpeg/app/fragment/BaseFragment.java @@ -1,6 +1,7 @@ package io.microshow.rxffmpeg.app.fragment; import android.os.Bundle; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -44,6 +45,10 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public abstract void initData(); + public boolean onKeyDown(int keyCode, KeyEvent event) { + return false; + } + /** * 获取当前类名(没有包名) */ diff --git a/app/src/main/java/io/microshow/rxffmpeg/app/fragment/FindFragment.java b/app/src/main/java/io/microshow/rxffmpeg/app/fragment/FindFragment.java index 6f5785c..5bae216 100644 --- a/app/src/main/java/io/microshow/rxffmpeg/app/fragment/FindFragment.java +++ b/app/src/main/java/io/microshow/rxffmpeg/app/fragment/FindFragment.java @@ -2,6 +2,7 @@ import android.os.Bundle; import android.text.TextUtils; +import android.view.KeyEvent; import android.view.View; import androidx.annotation.Nullable; @@ -52,10 +53,20 @@ public void initData() { mPlayerView.setController(new RxFFmpegPlayerControllerImpl(getActivity()), MeasureHelper.FitModel.FM_DEFAULT); //播放 - binding.mPlayerView.play(binding.editText.getText().toString(), true); + mPlayerView.play(binding.editText.getText().toString(), true); } + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (mPlayerView.isFullScreenModel()) {//当前处于全屏模式,这里需要退出全屏 + mPlayerView.switchScreen();//退出全屏 + return true; + } else { + return super.onKeyDown(keyCode, event); + } + } + @Override public void onResume() { super.onResume(); diff --git a/app/src/main/java/io/microshow/rxffmpeg/app/fragment/MeFragment.java b/app/src/main/java/io/microshow/rxffmpeg/app/fragment/MeFragment.java index d9113dc..4c0044c 100644 --- a/app/src/main/java/io/microshow/rxffmpeg/app/fragment/MeFragment.java +++ b/app/src/main/java/io/microshow/rxffmpeg/app/fragment/MeFragment.java @@ -38,6 +38,7 @@ public void initData() { .go("https://github.com/microshow/RxFFmpeg"); } + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return agentWeb != null && agentWeb.handleKeyEvent(keyCode, event); } diff --git a/configs.gradle b/configs.gradle index 792196a..fc2156b 100644 --- a/configs.gradle +++ b/configs.gradle @@ -11,8 +11,8 @@ ext { //支持包版本 supportLibValue = "28.0.0" //应用 versionCode - versionCodeValue = 400 + versionCodeValue = 410 //应用 version 名称,更多设置里显示的 - versionNameValue = "4.0.0" + versionNameValue = "4.1.0" } \ No newline at end of file diff --git a/preview/app-release.apk b/preview/app-release.apk index ac4d847..9fd746f 100644 Binary files a/preview/app-release.apk and b/preview/app-release.apk differ diff --git a/rxffmpeg/libs/arm64-v8a/librxffmpeg-player.so b/rxffmpeg/libs/arm64-v8a/librxffmpeg-player.so index 6a78a2c..cd09025 100644 Binary files a/rxffmpeg/libs/arm64-v8a/librxffmpeg-player.so and b/rxffmpeg/libs/arm64-v8a/librxffmpeg-player.so differ diff --git a/rxffmpeg/libs/armeabi-v7a/librxffmpeg-invoke.so b/rxffmpeg/libs/armeabi-v7a/librxffmpeg-invoke.so index 5ed7f08..23af5bd 100644 Binary files a/rxffmpeg/libs/armeabi-v7a/librxffmpeg-invoke.so and b/rxffmpeg/libs/armeabi-v7a/librxffmpeg-invoke.so differ diff --git a/rxffmpeg/libs/armeabi-v7a/librxffmpeg-player.so b/rxffmpeg/libs/armeabi-v7a/librxffmpeg-player.so index 280e95f..d697063 100644 Binary files a/rxffmpeg/libs/armeabi-v7a/librxffmpeg-player.so and b/rxffmpeg/libs/armeabi-v7a/librxffmpeg-player.so differ diff --git a/rxffmpeg/libs/x86/librxffmpeg-invoke.so b/rxffmpeg/libs/x86/librxffmpeg-invoke.so index 7dfedeb..7241246 100644 Binary files a/rxffmpeg/libs/x86/librxffmpeg-invoke.so and b/rxffmpeg/libs/x86/librxffmpeg-invoke.so differ diff --git a/rxffmpeg/libs/x86/librxffmpeg-player.so b/rxffmpeg/libs/x86/librxffmpeg-player.so index ad6dc0c..4663952 100644 Binary files a/rxffmpeg/libs/x86/librxffmpeg-player.so and b/rxffmpeg/libs/x86/librxffmpeg-player.so differ diff --git a/rxffmpeg/libs/x86_64/librxffmpeg-player.so b/rxffmpeg/libs/x86_64/librxffmpeg-player.so index bffe1a9..7cca0e9 100644 Binary files a/rxffmpeg/libs/x86_64/librxffmpeg-player.so and b/rxffmpeg/libs/x86_64/librxffmpeg-player.so differ diff --git a/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/IMediaPlayer.java b/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/IMediaPlayer.java index d67ffb9..f4789fb 100644 --- a/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/IMediaPlayer.java +++ b/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/IMediaPlayer.java @@ -83,6 +83,29 @@ public interface IMediaPlayer { */ boolean isPlaying(); + /** + * 设置音量 + * @param percent 取值范围( 0 - 100 ); 0是静音 + */ + void setVolume(int percent); + + /** + * 获取音量 默认100 + */ + int getVolume(); + + /** + * 设置声道;0立体声;1左声道;2右声道 + */ + void setMuteSolo(int mute); + + /** + * 获取声道:0立体声;1左声道;2右声道; + * 如果没有调用setMuteSolo,则返回-1 (默认没有设置) + * @return + */ + int getMuteSolo(); + /** * 回收流媒体资源 */ diff --git a/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayer.java b/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayer.java index c3e77c3..42fd5e6 100644 --- a/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayer.java +++ b/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayer.java @@ -42,11 +42,13 @@ public abstract class RxFFmpegPlayer implements IMediaPlayer { private native boolean nativeIsPlaying(); + private native void nativeSetVolume(int percent); - /** - * 视频路径 - */ - private String path; + private native int nativeGetVolume(); + + private native void nativeSetMuteSolo(int mute); + + private native int nativeGetMuteSolo(); private OnPreparedListener mOnPreparedListener; @@ -60,15 +62,20 @@ public abstract class RxFFmpegPlayer implements IMediaPlayer { private OnCompletionListener mOnCompletionListener; + /** + * 视频路径 + */ + protected String path; + /** * 总时长 */ - private int mDuration = 0; + protected int mDuration = 0; /** * 循环标志 */ - private boolean looping; + protected boolean looping; private CompositeDisposable mCompositeDisposable; @@ -148,6 +155,26 @@ public boolean isPlaying() { return nativeIsPlaying(); } + @Override + public void setVolume(int percent) { + nativeSetVolume(percent); + } + + @Override + public int getVolume() { + return nativeGetVolume(); + } + + @Override + public void setMuteSolo(int mute) { + nativeSetMuteSolo(mute); + } + + @Override + public int getMuteSolo() { + return nativeGetMuteSolo(); + } + @Override public void release() { setOnPreparedListener(null); diff --git a/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayerControllerImpl.java b/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayerControllerImpl.java index 3df23be..64c8a7d 100644 --- a/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayerControllerImpl.java +++ b/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayerControllerImpl.java @@ -25,6 +25,7 @@ public class RxFFmpegPlayerControllerImpl extends RxFFmpegPlayerController { private View mBottomPanel; private ImageView playBtn; private View repeatPlay; + private ImageView muteImage;//静音图标 private boolean isSeeking = false; public int mPosition; @@ -64,6 +65,14 @@ public void onClick(View view) { } } }); + muteImage = findViewById(R.id.iv_mute); + muteImage.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + //静音 + switchMute(); + } + }); playBtn.setOnClickListener(new OnClickListener() { @Override @@ -79,6 +88,20 @@ public void onClick(View view) { }); } + public void switchMute() { + if (mPlayerView != null) { + if (mPlayerView.getVolume() == 0) { + //当前是静音,设置为非静音 + mPlayerView.setVolume(100); + muteImage.setImageResource(R.mipmap.rxffmpeg_player_unmute); + } else { + //当前不是静音,设置为静音 + mPlayerView.setVolume(0); + muteImage.setImageResource(R.mipmap.rxffmpeg_player_mute); + } + } + } + @Override public void initListener() { PlayerListener mPlayerListener = new PlayerListener(this); @@ -231,6 +254,10 @@ public void onPause() { public void onResume() { playBtn.setImageResource(R.mipmap.rxffmpeg_player_pause); playBtn.animate().alpha(1f).start();//隐藏 播放按钮 + //设置静音图标 + if (mPlayerView != null) { + muteImage.setImageResource(mPlayerView.getVolume() == 0 ? R.mipmap.rxffmpeg_player_mute : R.mipmap.rxffmpeg_player_unmute); + } } } diff --git a/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayerView.java b/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayerView.java index eb76a65..4be76ba 100644 --- a/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayerView.java +++ b/rxffmpeg/src/main/java/io/microshow/rxffmpeg/player/RxFFmpegPlayerView.java @@ -232,6 +232,48 @@ public boolean isLooping() { // mPlayer.stop(); // } + /** + * 设置音量 (需要在play方法之前调用) + * @param percent 取值范围( 0 - 100 ); 0是静音 + */ + public void setVolume(int percent) { + if (mPlayer != null) { + mPlayer.setVolume(percent); + } + } + + /** + * 获取音量 + * @return volume + */ + public int getVolume() { + if (mPlayer != null) { + return mPlayer.getVolume() != -1 ? mPlayer.getVolume() : 100; + } else { + return 100; + } + } + + /** + * 设置声道;0立体声;1左声道;2右声道 + */ + public void setMuteSolo(int mute) { + if (mPlayer != null) { + mPlayer.setMuteSolo(mute); + } + } + + /** + * 获取声道:0立体声;1左声道;2右声道; + */ + public int getMuteSolo() { + if (mPlayer != null) { + return mPlayer.getMuteSolo() != -1 ? mPlayer.getMuteSolo() : 0; + } else { + return 0; + } + } + /** * 销毁 */ @@ -243,27 +285,36 @@ public void release() { setKeepScreenOn(false);//设置屏幕保持常亮 } + /** + * 当前是否是全屏 + * @return true:是;false:否 + */ + public boolean isFullScreenModel() { + return mCurrentMode == MODE_FULL_SCREEN; + } + /** * 切换全屏或关闭全屏 + * @return true已经进入到全屏 */ - public void switchScreen() { - if (mCurrentMode == MODE_FULL_SCREEN) { + public boolean switchScreen() { + if (isFullScreenModel()) { //是全屏 则退出全屏 - exitFullScreen();//退出全屏 + return exitFullScreen();//退出全屏 } else { - enterFullScreen();//进入全屏 + return enterFullScreen();//进入全屏 } } /** * 进入全屏 */ - public void enterFullScreen() { - if (mCurrentMode == MODE_FULL_SCREEN) return; + public boolean enterFullScreen() { + if (mCurrentMode == MODE_FULL_SCREEN) return false; ViewGroup decorView = Helper.setFullScreen(mContext, true); if (decorView == null) - return; + return false; this.removeView(mContainer); @@ -273,17 +324,19 @@ public void enterFullScreen() { decorView.addView(mContainer, params); mCurrentMode = MODE_FULL_SCREEN; + + return true; } /** * 退出全屏 */ - public void exitFullScreen() { + public boolean exitFullScreen() { if (mCurrentMode == MODE_FULL_SCREEN) { ViewGroup decorView = Helper.setFullScreen(mContext, false); if (decorView == null) - return; + return false; decorView.removeView(mContainer); LayoutParams params = new LayoutParams( @@ -293,6 +346,7 @@ public void exitFullScreen() { mCurrentMode = MODE_NORMAL; } + return false; } //屏幕旋转后改变 diff --git a/rxffmpeg/src/main/res/layout/rxffmpeg_player_controller.xml b/rxffmpeg/src/main/res/layout/rxffmpeg_player_controller.xml index dbf78eb..a7883a1 100644 --- a/rxffmpeg/src/main/res/layout/rxffmpeg_player_controller.xml +++ b/rxffmpeg/src/main/res/layout/rxffmpeg_player_controller.xml @@ -16,6 +16,16 @@ android:visibility="visible" tools:ignore="UnusedAttribute" /> + +