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" />
+
+