Android :java.lang.SecurityException: l'Injection à une autre application nécessite INJECT_EVENTS autorisation
Salut à tous, je suis nouveau sur Android Junit test:
J'ai écrit un code de test dans MainActivityFunctionalTest.java fichier
MainActivityFunctionalTest.java:
package com.example.myfirstapp2.test;
public class MainActivityFunctionalTest extends ActivityInstrumentationTestCase2<Login>{
private static final String TAG = "MainActivityFunctionalTest";
private Login activity;
public MainActivityFunctionalTest() {
super(Login.class);
}
@Override
protected void setUp() throws Exception {
Log.d(TAG,"Set-Up");
super.setUp();
setActivityInitialTouchMode(false);
activity = getActivity();
}
public void testStartSecondActivity() throws Exception {
//add monitor to check for the second activity
ActivityMonitor monitor =
getInstrumentation().
addMonitor(DisplayMessageActivity.class.getName(), null, false);
//addMonitor(MainActivity.class.getName(), null, false);
//find button and click it
Button view = (Button) activity.findViewById(R.id.btnLogin);
//TouchUtils handles the sync with the main thread internally
TouchUtils.clickView(this, view);
//to click on a click, e.g., in a listview
//listView.getChildAt(0);
//wait 2 seconds for the start of the activity
DisplayMessageActivity startedActivity = (DisplayMessageActivity)
monitor
.waitForActivityWithTimeout(5000);
assertNotNull(startedActivity);
//search for the textView
TextView textView = (TextView) startedActivity.findViewById(R.id.Email);
//check that the TextView is on the screen
ViewAsserts.assertOnScreen(startedActivity.getWindow().getDecorView(),
textView);
//validate the text on the TextView
assertEquals("Text incorrect", "1http://www.vogella.com",
textView.getText().toString());
//press back and click again
this.sendKeys(KeyEvent.KEYCODE_BACK);
TouchUtils.clickView(this, view);
}
}
Cependant,j'obtiens une erreur:
java.lang.SecurityException: l'Injection à une autre application nécessite INJECT_EVENTS autorisation
à com.example.myfirstapp2.test.MainActivityFunctionalTest.testStartSecondActivity(MainActivityFunctionalTest.java:70)
TouchUtils.clickView(this, view);
S'il vous plaît aider
- INJECT_EVENTS autorisation sera ajouté dans le fichier manifeste.
- Salut, je l'ai fait déjà,mais sa ne fonctionne toujours pas
- stackoverflow.com/questions/5383401/... jetez un oeil sur ce lien
- Bonjour, je suis à l'apprentissage de cette trop. Viens de réaliser que le périphérique virtuel est verrouillé. Si je déverrouiller l'appareil en faisant glisser le périphérique virtuel. Ensuite, le code de test fonctionne en douceur sans mettre en place quelque chose comme (autorisation, ou en mode tactile). J' (petit nouveau) pourrait être mauvais. Merci pour le partage des connaissances bien!
- J'ai été confronté à problème similaire - dans mon cas, le problème était que le point de vue a été hors de l'écran. Si le défilement vers le bas pour la faire apparaître sur l'écran de correction de l'erreur.
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème, et mon code a été quelque chose comme ceci (pour une normale de l'activité de connexion):
La dernière ligne a été s'écraser avec SecurityException. S'est avéré après le dernier texte de saisie, le clavier a été laissée ouverte, d'où le clic suivant a été considéré sur une autre application.
Pour résoudre ce problème, j'ai simplement dû fermer le clavier après avoir tapé. J'ai également eu à ajouter un peu de sommeil, assurez-vous que le clavier est fermé, sinon le test ne serait briser chaque maintenant et puis. Donc le code final ressemblait à ceci:
Cela a très bien fonctionné.
INJECT_EVENTS
autorisation a été supprimé.J'ai eu le même problème et en ajoutant le closeSoftKeyboard() la méthode résolu pour moi.
C'est parce que votre appareil est verrouillé/toute autre boîte de dialogue ouvrir s'ouvrir
/tout en empêchant le test de la possibilité de cliquer sur le bouton. Par exemple. si le téléphone est verrouillé lorsque le test essaie de cliquer sur le bouton, il ne peut pas car l'appareil est verrouillé.
J'ai eu des problèmes sur l'émulateur car il affiche toujours "lanceur s'est écrasé". Donc, chaque fois qu'il a essayé de cliquer sur le bouton, il ne pouvait pas parce que la boîte de dialogue alerte a été ouvert.
En bref, assurez-vous que votre écran est déverrouillé et non des boîtes de message peuvent interférer avec le test et la possibilité de cliquer sur un bouton.
J'ai été confronté à ce même problème moi-même, et voici ce que j'ai trouvé sur ce problème.
Ajoutant INJECT_EVENTS la permission de votre application, fait Android Studio de souligner qu'une telle autorisation "n'Est accordé qu'aux système apps". En outre, Google guide de référence du pour se manifester.les autorisations précise que cette autorisation n'est Pas destiné à l'utilisation par des applications tierces."
Maintenant, les chances sont que votre application, comme la mienne, n'est pas une application système. Ainsi, l'ajout de cette autorisation n'est certainement pas une bonne chose à faire, et, heureusement, ne sera pas appliquer sur votre 3ème partie du projet. Au moins lors du développement sur Android Studio.
Je vois que dans votre méthode de configuration, vous avez appelé setActivityInitialTouchMode(false); Comme l'a souligné Google meilleures pratiques pour l'INTERFACE utilisateur de test, lors du test de l'INTERFACE utilisateur vous devez régler le Mode Tactile de vrai. Sinon, votre montage de test ne sera pas en mesure d'interagir avec les éléments de l'INTERFACE utilisateur.
Juste une chose de plus. Ceci est un test automatisé qui émule les actions de l'utilisateur de votre application. Si nous interagir avec l'appareil (réel ou virtuel, n'a pas d'importance), nous allons probablement faire d'autres choses gain focus (même à l'intérieur de l'application en cours de test) et puis il y aura un conflit avec le mode tactile paramètres de la méthode de configuration avait accompli.
En fin de compte, c'est ce qui m'arrivait. J'ai résolu mon problème tout simplement en ne cliquant pas/contact/interaction avec l'appareil à un endroit où le test a été d'être couru.
pour un dispositif enracinée, ce fichier m'a beaucoup aidé.
Il a:
Je l'ai résolu en utilisant des remplace au lieu de TypeText action, mon code:
J'ai eu exactement le même problème et le message d'erreur lors de l'exécution de l'espresso tests. L'un d'eux était toujours défaut lors de l'exécution d'ensemble du paquet, cependant il toujours passé quand j'étais en train de lui seul. Intéressant, c'est que le problème est arrivé parce que j'avais ajouté la ligne suivante à l'un de mes Activités AndroidManifest.xml:
Après la suppression ou la modification en ligne ci-dessus pour:
essai mentionné passait également lors de l'exécution d'ensemble du paquet.
De certains autres façons de fixer "Injection à une autre application nécessite INJECT_EVENTS permission" qui se passe avec TouchUtils...
Par exemple. le fonctionnaire android développeur de site montre:
Encore, cela peut provoquer l'erreur si dans la méthode de test ceci est suivi directement par un TouchUtils.clickView:
Cependant, de le diviser en deux méthodes d'essai, et en permettant setUp() pour exécuter entre les deux semble corrigé* le problème (à Noter qu'il est contrôlé par le nom de la méthode que les tests sont exécutés par ordre alphabétique):
* * * * ce encore peut échouer après une intention a été appelé, mais ne le fait plus après l'arrivée a été appelé
Il est intéressant de noter, en mettant ce qui est dans setUp() avant le TouchUtils peuvent à la fois de l'échec et de travail:
Vous pouvez également essayer les waitForActivity délai d'attente juste avant la TouchUtils qui permettra:* de fixer à d'autres moments, comme après une intention a été appelé:
*Injecter des erreurs peuvent toujours se produire si utilisé à l'intérieur de la même méthode de test... aurez besoin de les séparer en une autre méthode que je montre ci-dessus.
Lorsque vous testez plusieurs fonctions dans la même activité, il est recommandé de mettre dans ce code:
au début de chaque fonction. Vous pouvez le personnaliser mais l'idée est d'attendre un certain nombre de fois avant de les traiter.