意想不到的行动意图 WEB_SEARCH
Unexpected Intent with action WEB_SEARCH
我有一个相当大的应用程序可以检查很多活动。最受欢迎的例外之一是
No Activity found to handle Intent {
act=android.intent.action.WEB_SEARCH (has extras) }
什么鬼?我在任何地方都没有在代码中看到任何 "WEB_SEARCH",我无法重现它,我什至不知道在哪里寻找原因(其中 Activity
)。在 Exception
的堆栈下方,我的包裹中没有任何 class...如何跟踪和修复此问题?
Fatal Exception: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.WEB_SEARCH (has extras) }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1659)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1434)
at android.app.Activity.startActivityForResult(Activity.java:3432)
at android.app.Activity.startActivityForResult(Activity.java:3393)
at android.support.v4.app.FragmentActivity.startActivityForResult(Unknown Source)
at android.app.Activity.startActivity(Activity.java:3628)
at android.app.Activity.startActivity(Activity.java:3596)
at android.webkit.SelectActionModeCallbackSec.onActionItemClicked(SelectActionModeCallbackSec.java:390)
at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onActionItemClicked(PhoneWindow.java:3264)
at android.support.v7.view.SupportActionModeWrapper$CallbackWrapper.onActionItemClicked(Unknown Source)
at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onActionItemClicked(Unknown Source)
at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onActionItemClicked(Unknown Source)
at android.support.v7.view.StandaloneActionMode.onMenuItemSelected(Unknown Source)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(Unknown Source)
at android.support.v7.view.menu.MenuItemImpl.invoke(Unknown Source)
at android.support.v7.view.menu.MenuBuilder.performItemAction(Unknown Source)
at android.support.v7.view.menu.MenuBuilder.performItemAction(Unknown Source)
at android.support.v7.view.menu.MenuPopupHelper.onItemClick(Unknown Source)
at android.widget.AdapterView.performItemClick(AdapterView.java:301)
at android.widget.AbsListView.performItemClick(AbsListView.java:1490)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3275)
at android.widget.AbsListView.run(AbsListView.java:4518)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5283)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(NativeStart.java)
我必须为其他未来的搜索者回答我自己的问题。为了在 Activity
中与 WebView
一起使用,或者为了在某些 Base
/MainActivity
抽象层中的安全:
@Override
public void startActivityForResult(Intent i, int reqCode, Bundle b){
boolean activityExists = i.resolveActivityInfo(getPackageManager(), 0) != null;
if(activityExists)
super.startActivityForResult(i, reqCode, b);
else{
if(Intent.ACTION_WEB_SEARCH.equals(i.getAction()) && i.getExtras()!=null){
String query = i.getExtras().getString(SearchManager.QUERY, null);
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.pl/search?q="+query));
boolean browserExists = i.resolveActivityInfo(getPackageManager(), 0) != null;
if(browserExists && query!=null){
startActivity(browserIntent);
return;
}
}
Toast.makeText(this, R.string.error_no_app_for_intent, Toast.LENGTH_LONG).show();
}
}
此行为的原因(可能)是硬件生产商制作的自定义系统 UI/modded Android,它添加了一些与搜索相关的功能。无法在 "clean" Android 设备
上重现
最近遇到同样的问题,挖了一下,觉得snachmsm的回答不错,想给其他搜索者分析一下。
显然我写的代码没有用 WEB_SEARCH 启动一个 Intent,根据崩溃日志,这个 Intent 是由 android.webkit.SelectActionModeCallbackSec.onActionItemClicked 调用的,所以事实是,如果你使用 webview ,当用户长按 select 某些文本时,在某些手机或主题或 ROM 中,它将显示带有 "find" 和 "web search" 或仅其中之一的 ActionMenu,这取决于各种实现.当用户单击 "web search" 时,它将启动一个带有 WEB_SEARCH 的意图。
那么解决方法很简单,在使用了webview的Activity中,覆盖startActivityForResult来处理特定的intent。为什么他也不覆盖 startActivity?因为 startActivity 最终会调用 startActivityForResult。
我有一个相当大的应用程序可以检查很多活动。最受欢迎的例外之一是
No Activity found to handle Intent { act=android.intent.action.WEB_SEARCH (has extras) }
什么鬼?我在任何地方都没有在代码中看到任何 "WEB_SEARCH",我无法重现它,我什至不知道在哪里寻找原因(其中 Activity
)。在 Exception
的堆栈下方,我的包裹中没有任何 class...如何跟踪和修复此问题?
Fatal Exception: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.WEB_SEARCH (has extras) }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1659)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1434)
at android.app.Activity.startActivityForResult(Activity.java:3432)
at android.app.Activity.startActivityForResult(Activity.java:3393)
at android.support.v4.app.FragmentActivity.startActivityForResult(Unknown Source)
at android.app.Activity.startActivity(Activity.java:3628)
at android.app.Activity.startActivity(Activity.java:3596)
at android.webkit.SelectActionModeCallbackSec.onActionItemClicked(SelectActionModeCallbackSec.java:390)
at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onActionItemClicked(PhoneWindow.java:3264)
at android.support.v7.view.SupportActionModeWrapper$CallbackWrapper.onActionItemClicked(Unknown Source)
at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onActionItemClicked(Unknown Source)
at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onActionItemClicked(Unknown Source)
at android.support.v7.view.StandaloneActionMode.onMenuItemSelected(Unknown Source)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(Unknown Source)
at android.support.v7.view.menu.MenuItemImpl.invoke(Unknown Source)
at android.support.v7.view.menu.MenuBuilder.performItemAction(Unknown Source)
at android.support.v7.view.menu.MenuBuilder.performItemAction(Unknown Source)
at android.support.v7.view.menu.MenuPopupHelper.onItemClick(Unknown Source)
at android.widget.AdapterView.performItemClick(AdapterView.java:301)
at android.widget.AbsListView.performItemClick(AbsListView.java:1490)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3275)
at android.widget.AbsListView.run(AbsListView.java:4518)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5283)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(NativeStart.java)
我必须为其他未来的搜索者回答我自己的问题。为了在 Activity
中与 WebView
一起使用,或者为了在某些 Base
/MainActivity
抽象层中的安全:
@Override
public void startActivityForResult(Intent i, int reqCode, Bundle b){
boolean activityExists = i.resolveActivityInfo(getPackageManager(), 0) != null;
if(activityExists)
super.startActivityForResult(i, reqCode, b);
else{
if(Intent.ACTION_WEB_SEARCH.equals(i.getAction()) && i.getExtras()!=null){
String query = i.getExtras().getString(SearchManager.QUERY, null);
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.pl/search?q="+query));
boolean browserExists = i.resolveActivityInfo(getPackageManager(), 0) != null;
if(browserExists && query!=null){
startActivity(browserIntent);
return;
}
}
Toast.makeText(this, R.string.error_no_app_for_intent, Toast.LENGTH_LONG).show();
}
}
此行为的原因(可能)是硬件生产商制作的自定义系统 UI/modded Android,它添加了一些与搜索相关的功能。无法在 "clean" Android 设备
上重现最近遇到同样的问题,挖了一下,觉得snachmsm的回答不错,想给其他搜索者分析一下。
显然我写的代码没有用 WEB_SEARCH 启动一个 Intent,根据崩溃日志,这个 Intent 是由 android.webkit.SelectActionModeCallbackSec.onActionItemClicked 调用的,所以事实是,如果你使用 webview ,当用户长按 select 某些文本时,在某些手机或主题或 ROM 中,它将显示带有 "find" 和 "web search" 或仅其中之一的 ActionMenu,这取决于各种实现.当用户单击 "web search" 时,它将启动一个带有 WEB_SEARCH 的意图。
那么解决方法很简单,在使用了webview的Activity中,覆盖startActivityForResult来处理特定的intent。为什么他也不覆盖 startActivity?因为 startActivity 最终会调用 startActivityForResult。