微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > Google语音搜索在无网络下进入,不断弹出无网络的toast,按返回键无效

Google语音搜索在无网络下进入,不断弹出无网络的toast,按返回键无效

时间:10-02 整理:3721RD 点击:
[DESCRIPTION]
1. 在无网络下进入Google语音搜索;
2. 不断弹出无网络的toast,按返回键无法退出,多次按Home键方可退出。
[SOLUTION]
使用launcher3才会发生,launcher3和google now Launcher都是启动的
com.google.android.googlequicksearchbox/.SearchActivity
但是在launcher3上启动了之后,会接着启动
com.google.android.googlequicksearchbox/com.google.android.apps.gsa.searchnow.SearchNow
Activity,
然后就是启动
com.google.android.googlequicksearchbox/com.google.android.sidekick.main.optin.NewOptIn
Activity
接下来却又是启动:com.google.android.googlequicksearchbox/.SearchActivity
然后再循环上面的过程。而对比google now Launcher, 则不会SearchNowActivity。
反解Google search APK
package com.google.android.googlequicksearchbox;
public class SearchActivity
extends Activity
{
public void onCreate(Bundle paramBundle)
{
Intent localIntent = getIntent();
Object localObject = f.hb(264);
l.a((an)localObject, localIntent);
f.b((an)localObject);
super.onCreate(paramBundle);
paramBundle = localIntent.getAction();
if
(("com.google.android.googlequicksearchbox.VIEW_TERMS_OF_SERVICE".equals(p
aramBundle)) ||
("com.google.android.googlequicksearchbox.VIEW_PRIVACY_POLICY".equals(para
mBundle))) {
ld(paramBundle);
}
for (;;)
{
else if (("android.intent.action.MAIN".equals(paramBundle)) &&
(localIntent.hasCategory("android.intent.category.LAUNCHER")))
{
ah(localIntent); // 第一次启动,进入这里
}
......
private void ah(Intent paramIntent)
{
if (c.dn(this)) // 这里的c.dn的值决定了是否会调用到aj函数
{
ai(paramIntent);
return;
}
aj(paramIntent);
}
// 这个函数启动SearchNowActivity
private void aj(Intent paramIntent)
{
paramIntent = new Intent(paramIntent);
paramIntent.setFlags(paramIntent.getFlags() & 0xFF7FFFFF);
paramIntent.setClassName("com.google.android.googlequicksearchbox",
"com.google.android.apps.gsa.searchnow.SearchNowActivity");
startActivity(paramIntent, ActivityOptions.makeCustomAnimation(this, 0,
0).toBundle());
}
//c.dn()调用到这里
package com.google.android.velvet.util;
public class c
{
public static boolean dn(Context paramContext)
{
return q(paramContext, false);
}
private static boolean q(Context context, boolean flag) // 传入的 flag 是
false
{
boolean flag1 = true;
String s = context.getPackageName();
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME");
PackageManager packagemanager = context.getPackageManager();
ResolveInfo resolveinfo;
......
resolveinfo = a(context, packagemanager, intent, 0x10000);
......
// 当以GoogleHome作为默认桌面的时候,解析intent的application就是GoogleHome
// Google的实现中,GoogleHome只是一个代理,其内部是直接调用Google Search中
的activity显示Home
// 对应的activity就是"com.google.android.launcher.GEL"
// 所以这里直接返回flag1=true,不会调用到aj函数,也就不会启动
SearchNowActivity
// 但是以Launcher3作为默认桌面的时候,解析intent的Application不是
GoogleSearch, 所以这里返回false,就会调用到aj函数,启动
SearchNowActivity,陷入循环中
if(!s.equals(resolveinfo.activityInfo.applicationInfo.packageName) ||
!"com.google.android.launcher.GEL".equals(resolveinfo.activityInfo.name))
return false;
return flag1;
}
综上所述,Google Search针对以Google Home做默认桌面的情况作了特殊处理,导致以launcher3作
为默认桌面的时候出现了问题。
这个问题出现的情况比较特殊,是用GMS包又用了TK的launcher3。
且这段代码是在GMS包里的Google search中,我们仅是能过反解分析,无法修改,请知悉。

签到  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top