[AIR for Android] 让UC SDK 一辈子横屏

这里做一个记录。

UC SDK“ BUG”描述

目前我的项目是 必须要求 横屏的。

但是UC的SDK 除了登录界面可以设置横屏之外。

个人中心的 账户 论坛 攻略 帮助 界面

支付界面 全部清一色的竖屏。

跟UC官方对接人沟通良久,得到的答复是:

爱莫能助” ,“我也跟产品提了几次”,“我们那么多产品都是竖屏的都没问题,所以肯定是你们开发商的问题

得,虽然我早就知道他们会这样说 但是还是抱有一丝希望他们能改进。毕竟除了UC之外 其他全部android SDK几乎都提供横屏 竖屏的方式。

之所以必须使用横屏 前面的文章也说了。应该是 Starling+AIR 项目初始横屏的原因。在切换横竖屏的时候会强制退出游戏  不是FC 不是内存爆掉 不是OOM

总之肯定是一个AIR的坑。

终极解决方式

在经过一天的反复反编译 和 尝试读懂UC SDK 混淆后的代码 过程中 我发现UC SDK一直都是一个activity  不同的只是使用webView调用不同的js界面而已。

然后在它的主类 SdkWebActivity中通过setRequestedOrientation()函数设置 横屏竖屏。如果能修改SDK源代码的话 只要在SdkWebActivity设置横竖屏的地方 全部设置为横屏 就能解决问题了。再次和UC官方对接的人沟通 得到的方式 依然是 不改 不能发版本等等s答复。

得了,那就只能自己解决了。解决方式出来了 就是修改SdkWebActivity类的setRequestedOrientation()函数,既然不能通过源码(官方修改发版本)修改,那就只能修改jar了。唯一的方式 就是反编译出来 然后修改 然后再编译回去。但是它本身是带混淆的。所以不能修改反编译出来的任何一个代码文件 .class文件 否则就会报异常。

所以只能 新增类 或者 直接删除一个类 再重写进去。

我的解决方式是:

在同级包下 新建一个SdkWebActivity_s类 继承SdkWebActivity,override函数setRequestedOrientation(),代码如下:
[cc lang=”java”]
package cn.uc.gamesdk.view;

import android.content.pm.ActivityInfo;

/**
* @author Rect
* @version Time:2013-5-22
*/
public class SdkWebActivity_s extends SdkWebActivity {
@Override
public void setRequestedOrientation(int i)
{
super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
[/cc]

然后修改app-XML中的activity声明如下:

这样调用的就是我们的类   但是仅仅这样还不够。经过反编译发现

cn.uc.gamesdk.view.g 这个类是激活activity所用的 那我们用jre解压jar 把这个g.class删除掉  在ANE建立同级类g.java  修改激活的类为SdkWebActivity_s 如下:
[cc lang=”java”]
package cn.uc.gamesdk.view;

import android.content.Context;
import android.content.Intent;
import cn.uc.gamesdk.UCUIStyle;
import cn.uc.gamesdk.b.e;
import cn.uc.gamesdk.service.CommonService;
import org.json.JSONException;
import org.json.JSONObject;
/**
*
* @author Rect
* 2013-5-23
*/
public class g
{
private static final String p = “pageTitle”;
private static final String q = “pageId”;
public static final String a = “uiBusiness”;
public static final String b = “login”;
public static final String c = “pay”;
public static final String d = “userCenter”;
public static final String e = “h5EntryKey”;
public static final String f = “login”;
public static final String g = “pay”;
public static final String h = “user_center”;
public static final String i = “update_pwd”;
public static final String j = “forget_pwd”;
public static final String k = “login_game”;
public static final String l = “register”;
public static final String m = “alpha_code”;
public static final String n = “game_not_open”;
public static final String o = “nativePageId”;

public static void a(String h5EntryKey, String uiBusiness, int pageId, String pageTitle)
{
JSONObject jsonObj = new JSONObject();
try {
jsonObj.put(“uiBusiness”, uiBusiness);
jsonObj.put(“pageId”, pageId);
jsonObj.put(“pageTitle”, pageTitle);
} catch (JSONException e) {
e.printStackTrace();
}
CommonService.currentNativeSourcePageInfo = jsonObj;
a(h5EntryKey, uiBusiness);
}

public static void a(int pageId, String uiBusiness)
{
CommonService.currentNativeSourcePageInfo = null;
b(pageId, uiBusiness);
}

public static boolean a()
{
JSONObject jsonObj = CommonService.currentNativeSourcePageInfo;
if (jsonObj != null) {
int pageId = jsonObj.optInt(“pageId”);
String uiBusiness = jsonObj.optString(“uiBusiness”);
a(pageId, uiBusiness);
return true;
}
return false;
}

public static void a(String uiBusiness)
{
if (“login”.equals(uiBusiness)) {
if (cn.uc.gamesdk.b.e.s == UCUIStyle.SIMPLE)
b(1, uiBusiness);
else {
a(“login”, uiBusiness);
}
return;
}

if (“pay”.equals(uiBusiness)) {
a(“pay”, uiBusiness);
return;
}

if (“userCenter”.equals(uiBusiness)) {
a(“user_center”, uiBusiness);
return;
}

a(uiBusiness, uiBusiness);
}

private static void a(String h5EntryKey, String uiBusiness)
{
Intent intent = new Intent(cn.uc.gamesdk.b.e.b, SdkWebActivity_s.class);
intent.putExtra(“h5EntryKey”, h5EntryKey);
intent.putExtra(“uiBusiness”, uiBusiness);
intent.putExtra(“activity_work_type”, 2);
int flags = 805306368;
intent.setFlags(flags);
cn.uc.gamesdk.b.e.b.startActivity(intent);
}

private static void b(int nativePageId, String uiBusiness)
{
Intent intent = new Intent(cn.uc.gamesdk.b.e.b, SdkWebActivity_s.class);
intent.putExtra(“uiBusiness”, uiBusiness);
intent.putExtra(“nativePageId”, nativePageId);
intent.putExtra(“activity_work_type”, 4);
int flags = 805306368;
intent.setFlags(flags);
cn.uc.gamesdk.b.e.b.startActivity(intent);
}

public static void b()
{
Intent intent = new Intent(cn.uc.gamesdk.b.e.b, SdkWebActivity_s.class);
intent.putExtra(“uiBusiness”, “pay”);
intent.putExtra(“activity_work_type”, 3);
intent.setFlags(872415232);
cn.uc.gamesdk.b.e.b.startActivity(intent);
}
}
[/cc]

重新生成ANE  至此解决了UC ANE 其他界面的横屏问题。

方式步骤总结:

A.在ANE中新建cn.uc.gamesdk.view包  包下新建SdkWebActivity_s继承SdkWebActivity 并重写 setRequestedOrientation

在这里全部设置横屏

B.修改app-xml的activity声明 为我们写的SdkWebActiviry_s

C.在包下新建g.java类 代码如上 修改为激活我们的SdkWenActiviry_s

D.解压UC SDK 的jar 删除 cn.uc.gamesdk.view.g.class

E.合并 ANE的jar包和 解压出来的US SDK源码 然后打包ANE


再次教训。不要尝试请求运营商修正他们的不足之处!


《[AIR for Android] 让UC SDK 一辈子横屏》有2个想法

发表评论

邮箱地址不会被公开。 必填项已用*标注