web-dev-qa-db-ja.com

Android:Java.lang.SecurityException:別のアプリケーションに注入するにはINJECT_EVENTS権限が必要です

こんにちは、私はAndroid Junitテスト:

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

  }


    }

ただし、エラーが発生します:Java.lang.SecurityException:別のアプリケーションへの注入にはINJECT_EVENTS権限が必要です

com.example.myfirstapp2.test.MainActivityFunctionalTest.testStartSecondActivity(MainActivityFunctionalTest.Java:70)で

 TouchUtils.clickView(this, view);

助けてください

33
user3238961

私は同じ問題を抱えていて、私のコードは次のようなものでした(通常のログインアクティビティの場合):

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

最後の行はSecurityExceptionでクラッシュしていました。最後のテキスト入力後に判明したのは、キーボードが開いたままであるため、別のアプリケーションで次のクリックが考慮されたことです。

これを修正するには、入力後にキーボードを閉じる必要がありました。また、キーボードが閉じていることを確認するためにスリープを追加する必要がありました。そうしないと、テストが時々中断します。したがって、最終的なコードは次のようになりました。

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

これはうまくいきました。

44
m.hashemian

同じ問題があり、closeSoftKeyboard()メソッドを追加すると解決しました。

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

これは、デバイスがロックされているか、他の開いているダイアログボックスが開いているか、ボタンをクリックするテストの機能を妨げている何かのためです。例えば。電話機がロックされている場合、テストがボタンをクリックしようとすると、デバイスがロックされているため、ロックできません。

「ランチャーがクラッシュしました」と常に表示されるため、エミュレータで問題が発生していました。そのため、ボタンをクリックしようとしたときはいつでも、警告ダイアログボックスが開いていたためにできませんでした。

要するに、画面のロックが解除されており、テストを妨げるメッセージボックスがないこと、ボタンをクリックできることを確認してください。

8
Prasanth Louis

私はこの同じ問題に自分自身で直面していましたが、この問題について私が見つけたものがここにあります。

  1. INJECT_EVENTS権限をアプリに追加すると、Android Studioは、そのような権限は「システムアプリにのみ付与されます」と指摘します。さらに、manifest.permissions状態については Googleのリファレンスガイド この許可は「サードパーティのアプリケーションによる使用ではない」ことです。

    現在、私のアプリはシステムアプリではない可能性があります。したがって、この許可を追加することは間違いなく良いことではなく、幸いにもサードパーティのプロジェクトには適用されません。少なくともAndroid Studioで開発する場合。

  2. SetUpメソッドで、setActivityInitialTouchMode(false);を呼び出したことがわかります GoogleのUIテストのベストプラクティス 、UIのテスト時には、タッチモードをtrueに設定する必要があります。そうしないと、テストフィクスチャがUI要素と対話できなくなります。

  3. あともう一つだけ。これは、アプリでのユーザーアクションをエミュレートする自動テストです。デバイス(実際または仮想、重要ではありません)とやり取りする場合、他のものが(テスト対象のアプリ内でも)フォーカスを取得する可能性が高くなり、setUpメソッドのタッチモード設定と競合します行った。

最終的に、それは私に起こっていたことです。テストを実行しているデバイスをクリック/タッチ/操作しないことで問題を解決しました。

7
lpetroli

ルート化されたデバイスの場合、 このファイル は非常に役立ちました。持っています:

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

エスプレッソテストを実行したときに、まったく同じ問題とエラーメッセージが表示されました。それらの1つは、パッケージ全体を実行すると常に失敗しましたが、単独で実行すると常に失敗しました。興味深いのは、AndroidManifest.xmlのアクティビティの1つに次の行を追加したために問題が発生したことです。

Android:windowSoftInputMode="stateUnchanged|adjustResize"

上記の行を削除または変更した後:

Android:windowSoftInputMode="stateHidden"

パッケージ全体を実行するときにもテストが合格しました。

1
LLL