您的位置:首页 > 理论基础 > 计算机网络

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

2016-07-08 16:46 756 查看

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

[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中,我们仅是能过反解分析,无法修改,请知悉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息