3 votes

Intention inattendue avec l'action WEB_SEARCH

J'ai une assez grande application à inspecter avec beaucoup d'activités. Une des exceptions les plus populaires est

Aucune activité trouvée pour gérer l'Intent { act=android.intent.action.WEB_SEARCH (a des extras) }

Qu'est-ce que c'est que ça? Je ne vois pas dans le code de "WEB_SEARCH" nulle part, je ne peux pas le reproduire, je ne sais même pas où chercher la cause (dans quelle Activity). Ci-dessous la pile d'Exception, sans aucune classe de mon package... Comment suivre et corriger cela?

Exception Fatale: android.content.ActivityNotFoundException: Aucune activité trouvée pour gérer l'Intent { act=android.intent.action.WEB_SEARCH (a des 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$1.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)

6voto

snachmsm Points 3912

Je dois répondre à ma propre question pour d'autres chercheurs futurs. Pour une utilisation dans Activity avec WebView, ou pour la sécurité dans une couche abstraite de certaines 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();
    }
}

La raison de ce comportement est (probablement) l'interface système personnalisée/modifiée d'Android créée par le fabricant de matériel, qui ajoute certaines fonctionnalités liées à la recherche. Non reproductible sur un appareil Android "propre"

2voto

froyohuang Points 56

J'ai rencontré récemment le même problème, j'ai fait quelques recherches, je pense que la réponse de snachmsm est bonne, et je veux faire une analyse pour d'autres chercheurs.

De toute évidence, aucun code écrit par moi ne démarre une Intent avec WEB_SEARCH, et selon le journal de crash, l'intent est invoqué par android.webkit.SelectActionModeCallbackSec.onActionItemClicked, donc le fait est que si vous utilisez un webview, lorsque l'utilisateur fait un long clic et sélectionne un texte, sur certains téléphones ou thèmes ou ROMs, cela affichera un menu d'actions avec "trouver" et "recherche web" ou seulement l'un d'entre eux, selon les diverses implémentations. Et lorsque l'utilisateur clique sur "recherche web", cela déclenchera une intent avec WEB_SEARCH.

Ensuite, la solution est simple, dans les activités qui utilisent un webview, remplacez startActivityForResult pour gérer l'intent spécifique. Pourquoi ne pas remplacer startActivity non plus? Parce que startActivity invoque finalement startActivityForResult.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X