studio permission_granted permission permisos para desarrollar dar almacenamiento android junit

permission_granted - permisos para android studio



Android: java.lang.SecurityException: inyectar en otra aplicación requiere el permiso INJECT_EVENTS (7)

Algunas formas más de arreglar "Inyectar en otra aplicación requiere el permiso INJECT_EVENTS" sucediendo con TouchUtils ...

P.ej. El sitio oficial de desarrolladores de Android muestra:

// Stop the activity - The onDestroy() method should save the state of the Spinner mActivity.finish(); // Re-start the Activity - the onResume() method should restore the state of the Spinner mActivity = getActivity();

Sin embargo, esto puede causar el error si en el método de prueba esto es seguido directamente por un TouchUtils.clickView:

// Stop the activity - The onDestroy() method should save the state of the Spinner mActivity.finish(); // Re-start the Activity - the onResume() method should restore the state of the Spinner mActivity = getActivity(); // Possible inject error! TouchUtils.clickView(this, someView);

Sin embargo, dividirlo en dos métodos de prueba y permitir que setUp () se ejecute en medio parece solucionar * el problema (tenga en cuenta que esto se controla aquí mediante el nombre del método, ya que las pruebas se ejecutan alfabéticamente):

* esto todavía podría fallar después de que se llamara una intención pero ya no lo hace después de que se llamó el final

public void testYTestFinishing() { TouchUtils.clickView(this, someView); // Finish & restart the activity activity.finish(); } // ------------------------------------------- // Called before every test case method @Override protected void setUp() throws Exception { super.setUp(); setActivityInitialTouchMode(true); activity = getActivity(); getViews(); } // ------------------------------------------- public void testZOnReturn() { TouchUtils.clickView(this, someView); }

Curiosamente, poner lo que está en setUp () antes de que los TouchUtils puedan fallar y funcionar:

public void testYTestFinishing() { TouchUtils.clickView(this, someView); // Finish & restart the activity activity.finish(); setActivityInitialTouchMode(true); activity = getActivity(); getViews(); // SORRY, this fails here on some builds and succeeds on others TouchUtils.clickView(this, someView); }

También puede probar el tiempo de espera de waitForActivity directamente antes de los TouchUtils, que puede * arreglarlo en otros momentos, por ejemplo, después de llamar a un intento:

* El error de inyección aún puede ocurrir si se usa dentro del mismo método de prueba ... tendrá que dividirse en otro método como se muestra arriba.

Instrumentation.ActivityMonitor monitor = getInstrumentation() .addMonitor(Instrumentation.ActivityMonitor.class.getName(), null, false); // Wait for activity to fix inject error; Increase or decrease as needed monitor.waitForActivityWithTimeout(2000); // Should no longer fail TouchUtils.clickView(this, someView);

Hola, soy nuevo en las pruebas de Android Junit:

He escrito un código de prueba en el archivo MainActivityFunctionalTest.java

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); } }

Sin embargo, recibo un error: java.lang.SecurityException: la inyección a otra aplicación requiere el permiso INJECT_EVENTS

en com.example.myfirstapp2.test.MainActivityFunctionalTest.testStartSecondActivity (MainActivityFunctionalTest.java:70)

TouchUtils.clickView(this, view);

Por favor ayuda


Es porque su dispositivo está bloqueado / cualquier otro cuadro de diálogo abierto está abierto / cualquier cosa que impida que la prueba haga clic en el botón. P.ej. Si el teléfono está bloqueado, cuando la prueba intenta hacer clic en el botón, no puede hacerlo porque el dispositivo está bloqueado.

Estaba teniendo problemas en el emulador porque siempre mostraba "el lanzador se ha bloqueado". Entonces, cuando intentaba hacer clic en el botón, no podía porque el cuadro de diálogo de alerta estaba abierto.

En breve. Asegúrese de que su pantalla esté desbloqueada y que ningún cuadro de mensaje esté interfiriendo con la prueba y que sea capaz de hacer clic en un botón.


Para un dispositivo rooteado, este archivo me ayudó mucho. Tiene:

Injector.pressBackButton(); Injector.pressHomeButton(); Injector.pressPowerButton(); Injector.showNotificationCenter(); Injector.swipeLeftRight(); Injector.swipeRightLeft(); Injector.touch(x, y);


Tenía exactamente el mismo problema y mensaje de error al ejecutar las pruebas de espresso. Uno de ellos siempre fallaba cuando ejecutaba el paquete completo, sin embargo, siempre pasaba cuando lo ejecutaba solo. Lo interesante fue que el problema sucedió porque había agregado la siguiente línea a una de mis Actividades en AndroidManifest.xml:

android:windowSoftInputMode="stateUnchanged|adjustResize"

Después de eliminar o cambiar la línea anterior a:

android:windowSoftInputMode="stateHidden"

La prueba mencionada fue aprobada también cuando se ejecuta todo el paquete.


Tuve el mismo problema y agregar el método closeSoftKeyboard () lo resolvió por mí.

onView(withId(R.id.view)).perform(typeText(text_to_be_typed), closeSoftKeyboard());


Tuve el mismo problema, y ​​mi código era algo como esto (para una actividad de inicio de sesión normal):

onView(withId(R.id.username)) .perform(new TypeTextAction("test_user")); onView(withId(R.id.password)) .perform(new TypeTextAction("test123")); onView(withId(R.id.login)).perform(click());

La última línea se estrellaba con SecurityException. Resultó que después de la última escritura de texto, el teclado se dejó abierto, por lo que el siguiente clic se consideró en una aplicación diferente.

Para solucionar esto, simplemente tuve que cerrar el teclado después de escribir. También tuve que agregar algo de sueño para asegurarme de que el teclado está cerrado, de lo contrario la prueba se rompería de vez en cuando. Así que el código final se veía así:

onView(withId(R.id.username)) .perform(new TypeTextAction("test_user")); onView(withId(R.id.password)) .perform(new TypeTextAction("test123")).perform(closeSoftKeyboard()); Thread.sleep(250); onView(withId(R.id.login)).perform(click());

Esto funcionó bien


Yo también estaba enfrentando este mismo problema, y ​​esto es lo que encontré sobre este problema.

1) Al agregar el permiso INJECT_EVENTS a su aplicación, Android Studio señala que dicho permiso "solo se otorga a las aplicaciones del sistema". Además, la guía de referencia de Google para manifest.permissions indica que este permiso es "No para uso de aplicaciones de terceros".

Ahora, lo más probable es que su aplicación, como la mía, no sea una aplicación de sistema. Por lo tanto, agregar este permiso definitivamente no es algo bueno y, por suerte, no se aplicará a su proyecto de terceros. Al menos al desarrollar en Android Studio.

2) Puedo ver que en tu método de configuración, has llamado setActivityInitialTouchMode (falso); Como lo indican las mejores prácticas de Google para las pruebas de UI , al probar la UI, uno debe configurar el Modo táctil en verdadero . De lo contrario, su dispositivo de prueba no podrá interactuar con los elementos de la interfaz de usuario.

3) Sólo una cosa más. Esta es una prueba automatizada que emula las acciones del usuario en su aplicación. Si interactuamos con el dispositivo (real o virtual, no importa), lo más probable es que podamos enfocar otras cosas (incluso dentro de la aplicación bajo prueba) y luego habrá un conflicto con la configuración del modo táctil que el método de configuración habia realizado

En última instancia, eso es lo que me estaba pasando. Resolví mi problema simplemente al no hacer clic / tocar / interactuar con el dispositivo donde se estaba ejecutando la prueba.