本帖最后由 芽衣 于 2026-4-10 16:38 编辑
这个播放器被收购以后,经过三哥的调教,变得越来越烂了,真不愧是用左手写的代码。
有些看似不合理的地方,实际上就是想给你塞广告,毕竟pro版砍掉以后,就只剩下这个ad版了。
不知从何时开始,从外部打开视频,返回时不再是原来的界面了,而是mx播放器的主界面,比如我从三方文件管理器打开一个视频,默认mx播放器打开,结果返回的时候不是文件管理器,而是mx播放器的主页。官方这么做实际上就是想给你多看点广告,所以不停地返回主界面,我实实在在被这种行为恶心到了。
不知道有多少人已经发现这个问题了,去年的时候好像还不是这样的。
既然官方非要这么搞,那就只能干掉这种毒瘤行为。
使用工具
1、MX_Player_ad 2.11.4
2、jadxgui
3、mt,np,pc等
![]()
过程比较简单,第一步直接抓播放视频的Activity,发现是mxtech/videoplayer/ad/ActivityScreen,返回时退到了主界面,直接去拍onBackPressed的门
public final void onBackPressed() {
xjb xjbVar = this.o5;
if (xjbVar == null || !xjb.r) {
super.onBackPressed();
return;
}
View view = xjbVar.k;
if (view == null || view.getVisibility() == 0) {
return;
}
n0e.w2("playerRewardedScreenBackClick");
View view2 = xjbVar.k;
if (view2 != null) {
view2.setVisibility(0);
}
}
继续跟进,来到com.mxtech.videoplayer.ActivityScreen,
public void onBackPressed() {
enc encVar = this.H1;
if (encVar != null && encVar.e()) {
ArrayList<Integer> arrayList = encVar.i;
if (arrayList.size() == 1) {
encVar.g();
return;
}
arrayList.remove(arrayList.size() - 1);
Fragment fragmentD = encVar.l.getSupportFragmentManager().D(bjf.container);
if (fragmentD != null && (fragmentD instanceof yjc)) {
((yjc) fragmentD).T9();
}
encVar.n = 0;
}
if (!l91.a(this) && n8(false)) {
va(-1, LogSubCategory.Action.USER);
try {
super.onBackPressed();
} catch (IllegalStateException unused) {
finish();
}
}
}
代码末尾也有个super.onBackPressed(),但不要继续跟了,如果此处方法代码全删,直接去执行super.onBackPressed(),就可以实现外部打开不返回主界面。但这样感觉不是很完美,继续看执行流程。上方有个if (!l91.a(this) && n8(false)),a看过了没什么东西,看看n8,传入了一个布尔值。
这个是双击返回,double_tap_back_key,两次点击的间隔小于2秒钟执行返回,否则取消。从传入的布尔值来看,!v9()大概率有问题,继续跟进。
[Java] 纯文本查看 复制代码 public final boolean v9() {
if (getIntent() == null || !isTaskRoot() || getIntent().getBooleanExtra("return_result", false)) {
return false;
}
startActivity(new Intent(this, ((com.mxtech.videoplayer.f) getApplication()).P()));
finish();
return true;
}
外部播放总回到主界面的原因也比较明显了,startActivity,设计之初返回的时候就是故意启动程序的,果然三哥还是懂开发的。
修改思路就是直接在这里加判断,利用action.VIEW判断是否从外部打开,如果app运行时打开视频可正常返回主界面。
.method public final v9()Z
.registers 7
invoke-virtual {p0}, Landroid/app/Activity;->getIntent()Landroid/content/Intent;
move-result-object v0
invoke-virtual {v0}, Landroid/content/Intent;->getAction()Ljava/lang/String;
move-result-object v1
const-string v2, "android.intent.action.VIEW"
invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v3
const/4 v1, 0x0
if-nez v3, :cond_40
invoke-virtual {p0}, Landroid/app/Activity;->getIntent()Landroid/content/Intent;
move-result-object v0
if-eqz v0, :cond_40
invoke-virtual {p0}, Landroid/app/Activity;->isTaskRoot()Z
move-result v0
if-eqz v0, :cond_40
invoke-virtual {p0}, Landroid/app/Activity;->getIntent()Landroid/content/Intent;
move-result-object v0
const-string v2, "return_result"
invoke-virtual {v0, v2, v1}, Landroid/content/Intent;->getBooleanExtra(Ljava/lang/String;Z)Z
move-result v0
if-nez v0, :cond_40
new-instance v0, Landroid/content/Intent;
invoke-virtual {p0}, Landroid/app/Activity;->getApplication()Landroid/app/Application;
move-result-object v1
check-cast v1, Lcom/mxtech/videoplayer/f;
invoke-virtual {v1}, Lcom/mxtech/videoplayer/f;->P()Ljava/lang/Class;
move-result-object v1
invoke-direct {v0, p0, v1}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
invoke-virtual {p0, v0}, Lavb;->startActivity(Landroid/content/Intent;)V
invoke-virtual {p0}, Lcom/mxtech/videoplayer/ActivityScreen;->finish()V
const/4 v0, 0x1
return v0
:cond_40
return v1
.end method
因为新加入的代码和下面的代码跳转地址都一样是:cond_40,所以v1的赋值得往上移。
改好以后试了一下,瞬间感觉舒服多了
|