diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1bc022949..628ac676e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -54,6 +54,7 @@
+
diff --git a/common/build.gradle b/common/build.gradle
index 7968f2e9e..27b4ed16b 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -86,6 +86,7 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
api files('libs/jcc-bate-0.7.3.jar')
compileOnly fileTree(dir: '../libs', include: ['*.aar'])
+ api 'androidx.activity:activity:1.9.1'
api rootProject.ext.dependencies["appcompat-androidx"]
api rootProject.ext.dependencies["recyclerview-androidx"]
api rootProject.ext.dependencies["cardview-androidx"]
diff --git a/common/src/main/java/com/yunbao/common/manager/game/BilliardsRandomManager.java b/common/src/main/java/com/yunbao/common/manager/game/BilliardsRandomManager.java
index fe94ccbc9..3e1899941 100644
--- a/common/src/main/java/com/yunbao/common/manager/game/BilliardsRandomManager.java
+++ b/common/src/main/java/com/yunbao/common/manager/game/BilliardsRandomManager.java
@@ -145,6 +145,9 @@ public class BilliardsRandomManager extends AbsRandomGameManager {
if (event.getSudMGPMGState().equals(SudMGPMGState.MG_GAME_LOAD_OVER)) {
joinAiRobot();
}
+ if(SudMGPMGState.MG_COMMON_GAME_STATE.equals(event.getSudMGPMGState())){
+ reset();
+ }
if (event.getSudMGPMGState().equals(SudMGPMGState.MG_COMMON_PLAYER_IN)) {
LogUtils.e("收到的回调: AI uid = " + getAiUid() + "| kickUid = " + event.getPlayerIn().kickUID + "|" + getPlayerSize());
if (event.getPlayerIn().reason == 1 && aiInfo != null) {
@@ -185,7 +188,7 @@ public class BilliardsRandomManager extends AbsRandomGameManager {
@Override
public void onGameMGCommonGameBilliardsHitState(SudMGPMGState.MGCommonGameBilliardsHitState model) {
- LogUtils.e("uid:"+model.uid,"state:"+model.state);
+ LogUtils.e("uid:"+model.uid,"state:"+model.state,"isOneOverForMy:"+isOneOverForMy,"isOneOverForOther:"+isOneOverForOther);
if (Integer.parseInt(model.uid) == IMLoginManager.get(AppManager.getInstance().getMainActivity()).getUserInfo().getId()) {
if (isOneOverForMy == -1) {
isOneOverForMy = 1;
@@ -282,6 +285,7 @@ public class BilliardsRandomManager extends AbsRandomGameManager {
}
private void onSendNotOneOver() {
+ ToastUtil.showDebug("标记丢失一杆清台");
LiveNetManager.get(AppManager.getInstance().getMainActivity())
.ballClearanceTableStatus(data.getSudGameRoomId(), new HttpCallback() {
@Override
diff --git a/common/src/main/java/com/yunbao/common/utils/ProcessImageUtil.java b/common/src/main/java/com/yunbao/common/utils/ProcessImageUtil.java
index 05f096263..99de44a79 100644
--- a/common/src/main/java/com/yunbao/common/utils/ProcessImageUtil.java
+++ b/common/src/main/java/com/yunbao/common/utils/ProcessImageUtil.java
@@ -3,13 +3,20 @@ package com.yunbao.common.utils;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.ImageDecoder;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.PickVisualMediaRequest;
+import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;
import androidx.core.content.FileProvider;
+import com.blankj.utilcode.util.LogUtils;
import com.yalantis.ucrop.UCrop;
import com.yalantis.ucrop.util.FileUtils;
import com.yunbao.common.CommonAppConfig;
@@ -39,6 +46,7 @@ public class ProcessImageUtil extends ProcessResultUtil {
private ImageResultCallback mResultCallback;
private boolean mNeedCrop;//是否需要裁剪
private boolean mNeedGif;//允许gif图
+ ActivityResultLauncher launcher;
public void setNeedGif(boolean mNeedGif) {
this.mNeedGif = mNeedGif;
@@ -83,7 +91,7 @@ public class ProcessImageUtil extends ProcessResultUtil {
if (mNeedCrop) {
Uri uri = null;
if (Build.VERSION.SDK_INT >= 24) {
- uri = FileProvider.getUriForFile(mContext, mContext.getPackageName()+".fileprovider", mCameraResult);
+ uri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", mCameraResult);
} else {
uri = Uri.fromFile(mCameraResult);
}
@@ -117,6 +125,19 @@ public class ProcessImageUtil extends ProcessResultUtil {
return;
}
String path = FileUtils.getPath(mContext, intent.getData());
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+ ImageDecoder.Source source = ImageDecoder.createSource(mContext.getContentResolver(), intent.getData());
+ try {
+ Bitmap bitmap = ImageDecoder.decodeBitmap(source);
+ path=BitmapUtil.getInstance().saveBitmap(bitmap);
+ bitmap.recycle();
+ } catch (Exception e) {
+ e.printStackTrace();
+ mResultCallback.onFailure();
+ return;
+ }
+
+ }
File file = new File(path);
if (file.exists()) {
mResultCallback.onSuccess(file);
@@ -153,6 +174,19 @@ public class ProcessImageUtil extends ProcessResultUtil {
}
}
};
+ launcher = ((AppCompatActivity) mContext).registerForActivityResult(new ActivityResultContracts.PickVisualMedia(), new androidx.activity.result.ActivityResultCallback() {
+ @Override
+ public void onActivityResult(Uri result) {
+ LogUtils.e("result:" + result);
+ if (result == null) {
+ mAlumbResultCallback.onFailure();
+ return;
+ }
+ Intent intent = new Intent();
+ intent.setData(result);
+ mAlumbResultCallback.onSuccess(intent);
+ }
+ });
}
/**
@@ -173,15 +207,28 @@ public class ProcessImageUtil extends ProcessResultUtil {
/**
* 相册获取图片
*/
- public void getImageByAlumb() {
+ public void getImageByAlbum() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+ showSystemPick();
+ return;
+ }
requestPermissions(mAlumbPermissions, mAlumbPermissionCallback);
}
- public void getImageByAlumb(boolean needCrop) {
+ public void getImageByAlbum(boolean needCrop) {
this.mNeedCrop = needCrop;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+ showSystemPick();
+ return;
+ }
requestPermissions(mAlumbPermissions, mAlumbPermissionCallback);
}
+ private void showSystemPick() {
+ PickVisualMediaRequest.Builder builder = new PickVisualMediaRequest.Builder()
+ .setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly.INSTANCE);
+ launcher.launch(builder.build());
+ }
/**
* 开启摄像头,执行照相
@@ -195,7 +242,7 @@ public class ProcessImageUtil extends ProcessResultUtil {
mCameraResult = getNewFile();
Uri uri = null;
if (Build.VERSION.SDK_INT >= 24) {
- uri = FileProvider.getUriForFile(mContext, mContext.getPackageName()+".fileprovider", mCameraResult);
+ uri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", mCameraResult);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} else {
uri = Uri.fromFile(mCameraResult);
@@ -255,7 +302,7 @@ public class ProcessImageUtil extends ProcessResultUtil {
startActivityForResult(intent, mCropResultCallback);
} catch (Exception e) {
try {
- Uri resultUri = FileProvider.getUriForFile(mContext, mContext.getPackageName()+".fileprovider", mCorpResult);
+ Uri resultUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", mCorpResult);
if (resultUri == null || mFragment == null || mContext == null) {
return;
}
diff --git a/common/src/main/java/com/yunbao/common/utils/WordUtil.java b/common/src/main/java/com/yunbao/common/utils/WordUtil.java
index 52f651070..2706d32cd 100644
--- a/common/src/main/java/com/yunbao/common/utils/WordUtil.java
+++ b/common/src/main/java/com/yunbao/common/utils/WordUtil.java
@@ -35,7 +35,9 @@ public class WordUtil {
public static boolean isNewZh() {
return IMLoginManager.get(CommonAppContext.sInstance).getLocaleLanguage() == Locale.SIMPLIFIED_CHINESE
- || IMLoginManager.get(CommonAppContext.sInstance).getLocaleLanguage() == Locale.TRADITIONAL_CHINESE ;
+ || IMLoginManager.get(CommonAppContext.sInstance).getLocaleLanguage() == Locale.TRADITIONAL_CHINESE
+ || IMLoginManager.get(CommonAppContext.sInstance).getLocaleLanguage() == Locale.CHINESE
+ || IMLoginManager.get(CommonAppContext.sInstance).getLocaleLanguage() == Locale.CHINA;
}
public static String getNewString(int res) {
diff --git a/dependencies.gradle b/dependencies.gradle
index fd32a5d29..740ce8126 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -22,7 +22,7 @@ ext {
// "tencent-bugly" : 'com.tencent.bugly:crashreport:2.6.6',//腾讯bugly
// "umeng-common" : 'com.umeng.sdk:common:1.5.3',//友盟统计
// "umeng-analytics" : 'com.umeng.sdk:analytics:7.5.3',//友盟统计
- "ucrop" : 'com.github.yalantis:ucrop:2.2.3',//图片裁剪
+ "ucrop" : 'com.github.yalantis:ucrop:2.2.9',//图片裁剪
"smartRefreshLayout" : 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-20',//下拉刷新上拉加载
"magicIndicator" : 'com.github.hackware1993:MagicIndicator:1.6.0',//ViewPager指示器
"banner" : 'com.ms:banner:1.0.0',//轮播图
diff --git a/live/src/main/java/com/yunbao/live/adapter/LiveReportAdapter.java b/live/src/main/java/com/yunbao/live/adapter/LiveReportAdapter.java
index 129445c10..052e063fa 100644
--- a/live/src/main/java/com/yunbao/live/adapter/LiveReportAdapter.java
+++ b/live/src/main/java/com/yunbao/live/adapter/LiveReportAdapter.java
@@ -237,7 +237,7 @@ public class LiveReportAdapter extends RecyclerView.Adapter {
if (tag == R.string.camera) {
mImageUtil.getImageByCamera();
} else {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum();
}
}
});
diff --git a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java
index efdacdffc..6def839ff 100644
--- a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java
+++ b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java
@@ -691,7 +691,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl
*/
private void setAvatar() {
if (mLiveSdk == Constants.LIVE_SDK_TX) {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum();
} else {
DialogUitl.showStringArrayDialog(mContext, new Integer[]{
R.string.camera, R.string.alumb}, new DialogUitl.StringArrayDialogCallback() {
@@ -700,7 +700,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl
if (tag == R.string.camera) {
mImageUtil.getImageByCamera();
} else {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum();
}
}
});
diff --git a/live/src/main/java/com/yunbao/live/views/LiveNewReadySwViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveNewReadySwViewHolder.java
index 3d949e264..0be3d139a 100644
--- a/live/src/main/java/com/yunbao/live/views/LiveNewReadySwViewHolder.java
+++ b/live/src/main/java/com/yunbao/live/views/LiveNewReadySwViewHolder.java
@@ -673,7 +673,7 @@ public class LiveNewReadySwViewHolder extends AbsViewHolder implements View.OnCl
*/
private void setAvatar() {
if (mLiveSdk == Constants.LIVE_SDK_TX) {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum(true);
} else {
DialogUitl.showStringArrayDialog(mContext, new Integer[]{
R.string.camera, R.string.alumb}, new DialogUitl.StringArrayDialogCallback() {
@@ -682,7 +682,7 @@ public class LiveNewReadySwViewHolder extends AbsViewHolder implements View.OnCl
if (tag == R.string.camera) {
mImageUtil.getImageByCamera();
} else {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum(true);
}
}
});
diff --git a/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java
index 8d44d530f..6e26b6276 100644
--- a/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java
+++ b/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java
@@ -35,7 +35,6 @@ import com.yunbao.live.R;
import com.yunbao.live.activity.LiveActivity;
import com.yunbao.live.activity.LiveChooseClassActivity;
import com.yunbao.live.activity.LiveRyAnchorActivity;
-import com.yunbao.live.activity.LiveRyAnchorActivity;
import com.yunbao.live.adapter.LiveReadyShareAdapter;
import com.yunbao.common.bean.LiveRoomTypeBean;
import com.yunbao.live.dialog.LiveRoomTypeDialogFragment;
@@ -262,7 +261,7 @@ public class LiveReadyRyViewHolder extends AbsViewHolder implements View.OnClick
*/
private void setAvatar() {
if (mLiveSdk == Constants.LIVE_SDK_TX) {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum();
} else {
DialogUitl.showStringArrayDialog(mContext, new Integer[]{
R.string.camera, R.string.alumb}, new DialogUitl.StringArrayDialogCallback() {
@@ -271,7 +270,7 @@ public class LiveReadyRyViewHolder extends AbsViewHolder implements View.OnClick
if (tag == R.string.camera) {
mImageUtil.getImageByCamera();
} else {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum();
}
}
});
diff --git a/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java
index a19123a46..6f88ab017 100644
--- a/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java
+++ b/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java
@@ -285,7 +285,7 @@ public class LiveReadyViewHolder extends AbsViewHolder implements View.OnClickLi
*/
private void setAvatar() {
if (mLiveSdk == Constants.LIVE_SDK_TX) {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum();
} else {
DialogUitl.showStringArrayDialog(mContext, new Integer[]{
R.string.camera, R.string.alumb}, new DialogUitl.StringArrayDialogCallback() {
@@ -294,7 +294,7 @@ public class LiveReadyViewHolder extends AbsViewHolder implements View.OnClickLi
if (tag == R.string.camera) {
mImageUtil.getImageByCamera();
} else {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum();
}
}
});
diff --git a/live/src/main/res/layout/view_live_room.xml b/live/src/main/res/layout/view_live_room.xml
index de45e45ae..d6f9621b3 100644
--- a/live/src/main/res/layout/view_live_room.xml
+++ b/live/src/main/res/layout/view_live_room.xml
@@ -2208,11 +2208,6 @@
-
+
diff --git a/main/src/main/java/com/yunbao/main/activity/EditProfileActivity.java b/main/src/main/java/com/yunbao/main/activity/EditProfileActivity.java
index e540e924f..0881d7c37 100644
--- a/main/src/main/java/com/yunbao/main/activity/EditProfileActivity.java
+++ b/main/src/main/java/com/yunbao/main/activity/EditProfileActivity.java
@@ -439,7 +439,7 @@ public class EditProfileActivity extends AbsActivity {
if (tag == R.string.camera) {
mImageUtil.getImageByCamera();
} else if (tag == R.string.alumb) {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum(true);
} else {
RouteUtil.forwardUserAvatarSelect();
}
diff --git a/main/src/main/java/com/yunbao/main/activity/FeedbackEditActivity.java b/main/src/main/java/com/yunbao/main/activity/FeedbackEditActivity.java
index 61a3df228..0e654e3a7 100644
--- a/main/src/main/java/com/yunbao/main/activity/FeedbackEditActivity.java
+++ b/main/src/main/java/com/yunbao/main/activity/FeedbackEditActivity.java
@@ -33,8 +33,6 @@ import com.yunbao.main.R;
import java.io.File;
import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
@Route(path = RouteUtil.PATH_FEEDBACK_EDIT_ACTIVITY)
public class FeedbackEditActivity extends AbsActivity {
@@ -299,7 +297,7 @@ public class FeedbackEditActivity extends AbsActivity {
loadingDialog = DialogUitl.loadingDialog(mContext);
loadingDialog.show();
if (tag == 1) {
- imageUtil.getImageByAlumb(false);
+ imageUtil.getImageByAlbum(false);
} else {
imageUtil.getImageByCamera(false);
}
diff --git a/main/src/main/java/com/yunbao/main/activity/MainActivity.java b/main/src/main/java/com/yunbao/main/activity/MainActivity.java
index 9ecc1d7f4..b002e65f9 100644
--- a/main/src/main/java/com/yunbao/main/activity/MainActivity.java
+++ b/main/src/main/java/com/yunbao/main/activity/MainActivity.java
@@ -44,6 +44,7 @@ import androidx.viewpager.widget.ViewPager;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
+import com.blankj.utilcode.util.LogUtils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.jakewharton.rxbinding3.view.RxView;
@@ -55,6 +56,7 @@ import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMSDKConfig;
import com.tencent.imsdk.v2.V2TIMSDKListener;
import com.tencent.imsdk.v2.V2TIMUserFullInfo;
+import com.yunbao.common.CommonAppContext;
import com.yunbao.common.bean.QiniuLog;
import com.yunbao.common.glide.ImgLoader;
import com.yunbao.common.server.DownloadService;
@@ -232,6 +234,11 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
@Override
protected void main() {
+ LogUtils.e("MainActivity",
+ "语言:"+IMLoginManager.get(CommonAppContext.sInstance).getLocaleLanguage(),
+ "测试文本:"+getString(R.string.hot)
+ );
+ ToastUtil.showDebug("打包时间:"+CommonAppConfig.BUILD_TIME+"\n系统语言:"+IMLoginManager.get(CommonAppContext.sInstance).getLocaleLanguage());
//初始化声网
SWAuManager.get().initRtcEngine(this);
ActivityCompat.postponeEnterTransition(this);
diff --git a/main/src/main/java/com/yunbao/main/activity/MyWebViewActivity.java b/main/src/main/java/com/yunbao/main/activity/MyWebViewActivity.java
index 729e0323d..15e4b55b1 100644
--- a/main/src/main/java/com/yunbao/main/activity/MyWebViewActivity.java
+++ b/main/src/main/java/com/yunbao/main/activity/MyWebViewActivity.java
@@ -585,7 +585,7 @@ public class MyWebViewActivity extends AbsActivity {
if (tag == com.yunbao.main.R.string.camera) {
mImageUtil.getImageByCamera();
} else {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum();
}
}
});
diff --git a/main/src/main/java/com/yunbao/main/activity/OneLoginActivity.java b/main/src/main/java/com/yunbao/main/activity/OneLoginActivity.java
index eade89493..c862ccf60 100644
--- a/main/src/main/java/com/yunbao/main/activity/OneLoginActivity.java
+++ b/main/src/main/java/com/yunbao/main/activity/OneLoginActivity.java
@@ -49,7 +49,7 @@ public class OneLoginActivity extends AbsActivity {
if (tag == R.string.camera) {
mImageUtil.getImageByCamera();
} else {
- mImageUtil.getImageByAlumb();
+ mImageUtil.getImageByAlbum();
}
}
});
diff --git a/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java b/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java
index 7c8da569f..ef1e11ec5 100644
--- a/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java
+++ b/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java
@@ -169,7 +169,12 @@ public class MainStartDialogFragment extends AbsDialogFragment implements View.O
boolean isAnchor = IMLoginManager.get(mContext).getUserInfo().anchorUserType();
if (isAnchor) {
String[] permissions;
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+ permissions = new String[]{
+ Manifest.permission.CAMERA,
+ Manifest.permission.RECORD_AUDIO
+ };
+ } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.TIRAMISU) {
permissions = new String[]{
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.CAMERA,
@@ -195,7 +200,12 @@ public class MainStartDialogFragment extends AbsDialogFragment implements View.O
boolean isAnchor = IMLoginManager.get(mContext).getUserInfo().anchorUserType();
if (isAnchor) {
String[] permissions;
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+ permissions = new String[]{
+ Manifest.permission.CAMERA,
+ Manifest.permission.RECORD_AUDIO
+ };
+ } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.TIRAMISU) {
permissions = new String[]{
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.CAMERA,
@@ -234,9 +244,9 @@ public class MainStartDialogFragment extends AbsDialogFragment implements View.O
JSONObject obj = JSON.parseObject(info[0]);
JSONObject obj1 = JSON.parseObject(info1[0]);
try {
- if(code==201){ //声网
+ if (code == 201) { //声网
LiveSwAnchorActivity.forward(mContext, Constants.LIVE_SDK_SW, JSON.parseObject(obj.getString("android"), LiveKsyConfigBean.class));
- }else if(code==200){//融云
+ } else if (code == 200) {//融云
LiveRyAnchorActivity.forward(mContext, obj.getIntValue("live_sdk"), JSON.parseObject(obj.getString("android"), LiveKsyConfigBean.class));
}
} catch (Exception e) {
@@ -309,7 +319,7 @@ public class MainStartDialogFragment extends AbsDialogFragment implements View.O
if (i == R.id.btn_close) {
} else if (i == R.id.btn_live) {
if (isWifiProxy(mContext) || checkVPN((ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE))) {
- ToastUtil.show(WordUtil.isNewZh()?"檢測開啓了VPN或者代理,請先關閉VPN或者代理再開播。":
+ ToastUtil.show(WordUtil.isNewZh() ? "檢測開啓了VPN或者代理,請先關閉VPN或者代理再開播。" :
"It is detected that VPN or proxy is turned on. Please turn off VPN or proxy before starting the broadcast.");
} else {
if (mCallback != null) {
@@ -324,6 +334,7 @@ public class MainStartDialogFragment extends AbsDialogFragment implements View.O
}
}
}
+
private boolean isWifiProxy(Context context) {
final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
String proxyAddress;
@@ -345,6 +356,7 @@ public class MainStartDialogFragment extends AbsDialogFragment implements View.O
boolean isVpnConn = networkInfo == null ? false : networkInfo.isConnected();
return isVpnConn;
}
+
@Override
public void onDestroy() {
super.onDestroy();
diff --git a/video/src/main/java/com/yunbao/video/views/VideoPlayViewHolder.java b/video/src/main/java/com/yunbao/video/views/VideoPlayViewHolder.java
index 1750df210..b4e4f93b3 100644
--- a/video/src/main/java/com/yunbao/video/views/VideoPlayViewHolder.java
+++ b/video/src/main/java/com/yunbao/video/views/VideoPlayViewHolder.java
@@ -10,11 +10,19 @@ import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.widget.RelativeLayout;
-import com.tencent.rtmp.ITXVodPlayListener;
+import androidx.annotation.Nullable;
+
+import com.blankj.utilcode.util.LogUtils;
+import com.google.android.exoplayer2.C;
+import com.google.android.exoplayer2.DefaultLoadControl;
+import com.google.android.exoplayer2.ExoPlayer;
+import com.google.android.exoplayer2.MediaItem;
+import com.google.android.exoplayer2.PlaybackException;
+import com.google.android.exoplayer2.Player;
+import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
+import com.google.android.exoplayer2.ui.StyledPlayerView;
+import com.google.android.exoplayer2.video.VideoSize;
import com.tencent.rtmp.TXLiveConstants;
-import com.tencent.rtmp.TXVodPlayConfig;
-import com.tencent.rtmp.TXVodPlayer;
-import com.tencent.rtmp.ui.TXCloudVideoView;
import com.yunbao.common.utils.L;
import com.yunbao.common.views.AbsViewHolder;
import com.yunbao.video.R;
@@ -27,11 +35,11 @@ import com.yunbao.video.http.VideoHttpUtil;
* 视频播放器
*/
-public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayListener, View.OnClickListener {
+public class VideoPlayViewHolder extends AbsViewHolder implements View.OnClickListener {
- private TXCloudVideoView mTXCloudVideoView;
+ private StyledPlayerView mTXCloudVideoView;
private View mVideoCover;
- private TXVodPlayer mPlayer;
+ private ExoPlayer mPlayer;
private boolean mPaused;//生命周期暂停
private boolean mClickPaused;//点击暂停
private ActionListener mActionListener;
@@ -41,7 +49,6 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList
private boolean mEndPlay;
private VideoBean mVideoBean;
private String mCachePath;
- private TXVodPlayConfig mTXVodPlayConfig;
public VideoPlayViewHolder(Context context, ViewGroup parentView) {
super(context, parentView);
@@ -55,17 +62,21 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList
@Override
public void init() {
+ DefaultLoadControl control = new DefaultLoadControl.Builder()
+ .setPrioritizeTimeOverSizeThresholds(false)
+ .setBackBuffer(10_000, true)
+ .setBufferDurationsMs(500,
+ 5_000,
+ 150,
+ 200)
+ .build();
+
mCachePath = mContext.getCacheDir().getAbsolutePath();
- mTXCloudVideoView = (TXCloudVideoView) findViewById(R.id.video_view);
- mTXCloudVideoView.setRenderMode(TXLiveConstants.RENDER_MODE_FULL_FILL_SCREEN);
- mPlayer = new TXVodPlayer(mContext);
- mTXVodPlayConfig = new TXVodPlayConfig();
- mTXVodPlayConfig.setMaxCacheItems(15);
- mTXVodPlayConfig.setProgressInterval(200);
- mPlayer.setConfig(mTXVodPlayConfig);
- mPlayer.setAutoPlay(true);
- mPlayer.setVodListener(this);
- mPlayer.setPlayerView(mTXCloudVideoView);
+ mTXCloudVideoView = (StyledPlayerView) findViewById(R.id.placeholderView);
+ mTXCloudVideoView.setKeepContentOnPlayerReset(true);
+ mTXCloudVideoView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH);
+ mPlayer = new ExoPlayer.Builder(mContext).setLoadControl(control).build();
+ mPlayer.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
findViewById(R.id.root).setOnClickListener(this);
mVideoCover = findViewById(R.id.video_cover);
mPlayBtn = findViewById(R.id.btn_play);
@@ -76,13 +87,59 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList
PropertyValuesHolder.ofFloat("alpha", 0f, 1f));
mPlayBtnAnimator.setDuration(150);
mPlayBtnAnimator.setInterpolator(new AccelerateInterpolator());
+ mPlayer.addListener(new Player.Listener() {
+ @Override
+ public void onIsPlayingChanged(boolean isPlaying) {
+ Player.Listener.super.onIsPlayingChanged(isPlaying);
+ }
+
+ @Override
+ public void onPlaybackStateChanged(int playbackState) {
+ Player.Listener.super.onPlaybackStateChanged(playbackState);
+ if (playbackState == Player.STATE_READY) {
+ mPlayer.play();
+ onPlayEvent(TXLiveConstants.PLAY_EVT_PLAY_BEGIN, null);
+ } else if (playbackState == Player.STATE_BUFFERING) {
+ onPlayEvent(TXLiveConstants.PLAY_EVT_PLAY_LOADING, null);
+ } else if (playbackState == Player.STATE_ENDED) {
+ onPlayEvent(TXLiveConstants.PLAY_EVT_PLAY_END, null);
+ }
+ }
+
+ @Override
+ public void onVideoSizeChanged(VideoSize videoSize) {
+ Player.Listener.super.onVideoSizeChanged(videoSize);
+ Bundle bundle = new Bundle();
+ bundle.putInt("EVT_PARAM1", videoSize.width);
+ bundle.putInt("EVT_PARAM2", videoSize.height);
+ onPlayEvent(TXLiveConstants.PLAY_EVT_CHANGE_RESOLUTION, bundle);
+ }
+
+ @Override
+ public void onRenderedFirstFrame() {
+ Player.Listener.super.onRenderedFirstFrame();
+ onPlayEvent(TXLiveConstants.PLAY_EVT_RCV_FIRST_I_FRAME, null);
+ }
+
+ @Override
+ public void onPlayerError(PlaybackException error) {
+ Player.Listener.super.onPlayerError(error);
+ LogUtils.e(error);
+ }
+
+ @Override
+ public void onPlayerErrorChanged(@Nullable PlaybackException error) {
+ Player.Listener.super.onPlayerErrorChanged(error);
+ LogUtils.e(error);
+ }
+ });
+ mTXCloudVideoView.setPlayer(mPlayer);
}
/**
* 播放器事件回调
*/
- @Override
- public void onPlayEvent(TXVodPlayer txVodPlayer, int e, Bundle bundle) {
+ public void onPlayEvent(int e, Bundle bundle) {
switch (e) {
case TXLiveConstants.PLAY_EVT_PLAY_BEGIN://加载完成,开始播放的回调
mStartPlay = true;
@@ -119,11 +176,6 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList
}
}
- @Override
- public void onNetStatus(TXVodPlayer txVodPlayer, Bundle bundle) {
-
- }
-
/**
* 获取到视频宽高回调
*/
@@ -166,20 +218,8 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList
if (TextUtils.isEmpty(url)) {
return;
}
- if (mTXVodPlayConfig == null) {
- mTXVodPlayConfig = new TXVodPlayConfig();
- mTXVodPlayConfig.setMaxCacheItems(15);
- mTXVodPlayConfig.setProgressInterval(200);
- }
- if (url.endsWith(".m3u8")) {
- mTXVodPlayConfig.setCacheFolderPath(null);
- } else {
- mTXVodPlayConfig.setCacheFolderPath(mCachePath);
- }
- mPlayer.setConfig(mTXVodPlayConfig);
- if (mPlayer != null) {
- mPlayer.startPlay(url);
- }
+ mPlayer.setMediaItem(MediaItem.fromUri(url));
+ mPlayer.prepare();
VideoHttpUtil.videoWatchStart(videoBean.getUid(), videoBean.getId());
}
@@ -188,7 +228,7 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList
*/
public void stopPlay() {
if (mPlayer != null) {
- mPlayer.stopPlay(false);
+ mPlayer.stop();
}
}
@@ -197,8 +237,8 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList
*/
private void replay() {
if (mPlayer != null) {
- mPlayer.seek(0);
- mPlayer.resume();
+ mPlayer.seekTo(0);
+ mPlayer.play();
}
}
@@ -206,8 +246,8 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList
VideoHttpUtil.cancel(VideoHttpConsts.VIDEO_WATCH_START);
VideoHttpUtil.cancel(VideoHttpConsts.VIDEO_WATCH_END);
if (mPlayer != null) {
- mPlayer.stopPlay(false);
- mPlayer.setPlayListener(null);
+ mPlayer.stop();
+ mPlayer.release();
}
mPlayer = null;
mActionListener = null;
@@ -229,7 +269,7 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList
public void resumePlay() {
if (mPaused) {
if (!mClickPaused && mPlayer != null) {
- mPlayer.resume();
+ mPlayer.play();
}
}
mPaused = false;
@@ -263,7 +303,7 @@ public class VideoPlayViewHolder extends AbsViewHolder implements ITXVodPlayList
}
if (mPlayer != null) {
if (mClickPaused) {
- mPlayer.resume();
+ mPlayer.play();
} else {
mPlayer.pause();
}
diff --git a/video/src/main/res/layout/view_video_play.xml b/video/src/main/res/layout/view_video_play.xml
index 1dcc7b312..cae32a34e 100644
--- a/video/src/main/res/layout/view_video_play.xml
+++ b/video/src/main/res/layout/view_video_play.xml
@@ -1,11 +1,15 @@
-
@@ -14,7 +18,7 @@
android:id="@+id/video_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="#000" />
+ android:background="@color/transparent" />