守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1470|回复: 2

[Android] 彻底解决UC悬浮与AIR项目的兼容性

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51717
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-19 11:32:28 | 显示全部楼层 |阅读模式

    关于UC的ANE我已经改动很多次了。为了适应Starling的GPU渲染项目(-app.xml中的direct),从登录界面的横竖屏到支付界面的消失 再到悬浮的BUG 一路过来总是那么苛刻。前几天发版本,UC审核人员又把悬浮的问题拿出来说,忍无可忍,没办法只好再次对UC ANE进行修改。这次改动后,悬浮BUG会彻底解决。首先把在接UC SDK过程中遇到的问题先复述一遍:

    UC 与AIR项目兼容性BUG

    • 支付界面竖屏 在横屏的starling项目的时候点击支付会闪退。解决方式是把全部UC界面换成横屏:传送门
    • 上面这种方式被官方人员彻底否决 于是又有了一种解决方式:传送门
    • 点击悬浮打开随便一个SDK界面  按下home之后游戏context会丢失,屏幕黑屏(再次按下home再次打开恢复)。解决方式:是 把在flash做悬浮 并固定,把悬浮的回调函数切换到调用个人账户中心 同样需要中转activity;
    • 阉割版本的flash悬浮图标UC官方无法接受 必须把悬浮恢复原样。这个问题正是本文要讨论的。并解决【3】所描述的BUG;

    把悬浮中插入自定义activity的实现

    关于UC悬浮与Starling项目的兼容性BUG重现:

    限定环境:AIR+Starling+横屏

    • 点击悬浮 随意点进去一个SDK界面 例如 【礼包】;
    • 按下【home】物理键;
    • 再打开AIR应用程序  发现黑屏 游戏界面已消失;
    • 再次按下【home】;
    • 再次打开AIR应用程序 游戏界面恢复;


    首先查看UCSDK需要配置的xml参数:

    1. <font color="rgb(51, 51, 51)">

    2.                 <activity android:configchanges="keyboardHidden|orientation|screenSize"
    3.                 android:label="@string/app_name" android:name="cn.uc.gamesdk.view.SdkWebActivity_s"
    4.                 android:theme="@android:style/Theme.Translucent"
    5.                 android:screenOrientation="landscape"
    6.                 android:windowSoftInputMode="adjustResize" >
    7.                
    8.                
    9.                
    10.                
    11.                
    12. </font>
    复制代码
    显然只有一个activity。也就是说UCSDK所有的界面都是基于这个Activiry;
    然后分析 【游戏主activity-悬浮-悬浮打开的界面activity】 之间的关系。结构大概如下图:


    [/url]


    照官方ANE的做法激活悬浮,在代码中活动对象(context.getActiviry())的传输过程如图:


    [url=http://shadowkong.com/wp-content/uploads/2013/10/airuc2.png]



    理是悬浮通过获取游戏主activity的对象去打开上层SDK界面。正是由于传入的是游戏主activity对象给SDK界面 所以在按下home的时候 游戏主activity会在栈堆中被切掉。所以解决这个问题的关键在于在【悬浮-打开SDK界面】的过程中 传入一个新建的activity 而非AIR应用程序主activity。如下图:


    [/url]


    样便可解决开启了direct模式的AIR应用程序 与UC悬浮的兼容性BUG。以下是代码分析我们知道android java打开activity无非就是startActiviry几个类似的函数。悬浮按钮打开界面也是一样的。反编译出来UC SDK搜索startActiviry 大概可以定位到这里:
    cn.uc.gamesdk.view
    1. package cn.uc.gamesdk.view;

    2. import android.content.Context;
    3. import android.content.Intent;
    4. import cn.uc.gamesdk.UCUIStyle;
    5. import cn.uc.gamesdk.b.e;
    6. import cn.uc.gamesdk.service.CommonService;
    7. import org.json.JSONException;
    8. import org.json.JSONObject;

    9. public class g
    10. {
    11.   private static final String p = "pageTitle";
    12.   private static final String q = "pageId";
    13.   public static final String a = "uiBusiness";
    14.   public static final String b = "login";
    15.   public static final String c = "pay";
    16.   public static final String d = "userCenter";
    17.   public static final String e = "h5EntryKey";
    18.   public static final String f = "login";
    19.   public static final String g = "pay";
    20.   public static final String h = "user_center";
    21.   public static final String i = "update_pwd";
    22.   public static final String j = "forget_pwd";
    23.   public static final String k = "login_game";
    24.   public static final String l = "register";
    25.   public static final String m = "alpha_code";
    26.   public static final String n = "game_not_open";
    27.   public static final String o = "nativePageId";

    28.   public static void a(String h5EntryKey, String uiBusiness, int pageId, String pageTitle)
    29.   {
    30.     JSONObject jsonObj = new JSONObject();
    31.     try {
    32.       jsonObj.put("uiBusiness", uiBusiness);
    33.       jsonObj.put("pageId", pageId);
    34.       jsonObj.put("pageTitle", pageTitle);
    35.     } catch (JSONException e) {
    36.       e.printStackTrace();
    37.     }
    38.     CommonService.currentNativeSourcePageInfo = jsonObj;
    39.     a(h5EntryKey, uiBusiness);
    40.   }

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

    46.   public static boolean a()
    47.   {
    48.     JSONObject jsonObj = CommonService.currentNativeSourcePageInfo;
    49.     if (jsonObj != null) {
    50.       int pageId = jsonObj.optInt("pageId");
    51.       String uiBusiness = jsonObj.optString("uiBusiness");
    52.       a(pageId, uiBusiness);
    53.       return true;
    54.     }
    55.     return false;
    56.   }

    57.   public static void a(String uiBusiness)
    58.   {
    59.     if ("login".equals(uiBusiness)) {//SDK登录
    60.       if (e.s == UCUIStyle.SIMPLE)
    61.         b(1, uiBusiness);
    62.       else {
    63.         a("login", uiBusiness);
    64.       }
    65.       return;
    66.     }

    67.     if ("pay".equals(uiBusiness)) {//SDK支付
    68.       a("pay", uiBusiness);
    69.       return;
    70.     }

    71.     if ("userCenter".equals(uiBusiness)) {//SDK个人中心
    72.       a("user_center", uiBusiness);
    73.       return;
    74.     }

    75.     a(uiBusiness, uiBusiness);//SDK其他界面  礼包 账户 帮组 攻略等通过悬浮打开的界面
    76.   }

    77.   private static void a(String h5EntryKey, String uiBusiness)
    78.   {
    79.     Intent intent = new Intent(e.b, SdkWebActivity.class);
    80.     intent.putExtra("h5EntryKey", h5EntryKey);
    81.     intent.putExtra("uiBusiness", uiBusiness);
    82.     intent.putExtra("activity_work_type", 2);
    83.     int flags = 805306368;
    84.     intent.setFlags(flags);
    85.     e.b.startActivity(intent);
    86.   }

    87.   private static void b(int nativePageId, String uiBusiness)
    88.   {
    89.     Intent intent = new Intent(e.b, SdkWebActivity.class);
    90.     intent.putExtra("uiBusiness", uiBusiness);
    91.     intent.putExtra("nativePageId", nativePageId);
    92.     intent.putExtra("activity_work_type", 4);
    93.     int flags = 805306368;
    94.     intent.setFlags(flags);
    95.     e.b.startActivity(intent);
    96.   }

    97.   public static void b()
    98.   {
    99.     Intent intent = new Intent(e.b, SdkWebActivity.class);
    100.     intent.putExtra("uiBusiness", "pay");
    101.     intent.putExtra("activity_work_type", 3);
    102.     intent.setFlags(872415232);
    103.     e.b.startActivity(intent);
    104.   }
    105. }
    复制代码
    由此可以看出。悬浮打开的界面都通过此函数:
    1. private static void a(String h5EntryKey, String uiBusiness)
    2.   {
    3.     Intent intent = new Intent(e.b, SdkWebActivity.class);
    4.     intent.putExtra("h5EntryKey", h5EntryKey);
    5.     intent.putExtra("uiBusiness", uiBusiness);
    6.     intent.putExtra("activity_work_type", 2);
    7.     int flags = 805306368;
    8.     intent.setFlags(flags);
    9.     e.b.startActivity(intent);
    10.   }
    复制代码
    所以只要在此函数中 新建Activiry 然后再传入intent 再启动界面 便可。然后在UC资源的json中可以发现【账户】【礼包】【攻略】【帮助】等五个界面的key分别为:账户 user_center
    论坛 bbs
    礼物 gift
    攻略  strategy
    帮助 feedback
    如此变可把此函数修改为如下:
    1. private static void a(String h5EntryKey, String uiBusiness)
    2.     {
    3.         Log.d("h5EntryKey", h5EntryKey);
    4.         Log.d("uiBusiness", uiBusiness);

    5.         Log.d("Xmsh_isFloat", newAcitvity.isFloat.toString());
    6. //启动新的activity传入Intent newAcitvity 需在-app.xml中定义
    7. //newAcitvity.isFloat 判断当启动的界面是悬浮打开的子界面时再使用 其他一律按照原来的流程
    8.         if(newAcitvity.isFloat)
    9.         {
    10.             Log.d("newAcitvity", "-new---activity---begin--");
    11.             newAcitvity.selectKey = 0;
    12.             Intent intent = new Intent(newAcitvity.MYACTIVITY_ACTION);
    13.             intent.putExtra("selectKey", 0);
    14.             intent.putExtra("h5EntryKey", h5EntryKey);
    15.             intent.putExtra("uiBusiness", uiBusiness);
    16.             if(UCFShowFloatButton_sus.static_context != null)
    17.             {
    18.                 Log.d("newAcitvity", "---static_context--");
    19.                 UCFShowFloatButton_sus.static_context.getActivity().startActivityForResult(intent, 0);
    20.                 return;
    21.             }

    22.             Log.d("newAcitvity", "------static_context is null--");
    23.         }

    24.         Intent intent_beitai = new Intent(cn.uc.gamesdk.b.e.b, SdkWebActivity_s.class);
    25.         intent_beitai.putExtra("h5EntryKey", h5EntryKey);
    26.         intent_beitai.putExtra("uiBusiness", uiBusiness);
    27.         intent_beitai.putExtra("activity_work_type", 2);
    28.         int flags = 805306368;
    29.         intent_beitai.setFlags(flags);
    30.         cn.uc.gamesdk.b.e.b.startActivity(intent_beitai);
    31.     }
    复制代码
    如此遍解决了这个问题
    流程是:
    1.复制UC源码库的cn.uc.gamesdk.view.g.java 写入ANE;
    2.删除UC 源码库的cn.uc.gamesdk.view.g.java;
    3.修改g.java 然后合并jar;
    本文来自:[url=http://shadowkong.com/archives/1307]http://shadowkong.com/archives/1307




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x

    评分

    参与人数 1金币 +20 收起 理由
    shawn00 + 20 很给力!

    查看全部评分

    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    33

    积分

    新兵

    Rank: 1

    威望
    0
    贡献
    0
    金币
    27
    钢镚
    0
    发表于 2015-5-21 10:24:43 | 显示全部楼层
    兄弟,能把ane共享一个吗,最好是IOS和android都有,UC官方的ANE太老了,完全没法用
    邮箱:xiey147@163.com
    好人一生平安

    评分

    参与人数 1金币 +20 收起 理由
    破晓 + 20

    查看全部评分

    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51717
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-5-21 10:44:12 | 显示全部楼层
    nofastfat 发表于 2015-5-21 10:24
    兄弟,能把ane共享一个吗,最好是IOS和android都有,UC官方的ANE太老了,完全没法用
    邮箱:xiey147@163.com
    ...

    找rect

    http://shadowkong.com/archives/1307
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-9-15 14:07 , Processed in 0.046079 second(s), 38 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表