Как зарегистрировать широковещательный приемник внутри приборов?

Я пытаюсь получить результаты обнаружения Bluetooth через apk, который работает как Android junit runner. Все работает нормально, но пока registerReciever я получаю сообщение об ошибке ниже. Что может быть причиной ?

java.lang.SecurityException: данный вызывающий пакет com.ex.test не запущен в процессе ProcessRecord {d740580 19462: com.ex/u0a302}

Код-

@Test
public void demo() throws Exception {

    Context ctx = InstrumentationRegistry.getInstrumentation().getContext();
    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();

    if (mBtAdapter.isDiscovering()) {
        System.out.println("Stop ongoing discovery");
        mBtAdapter.cancelDiscovery();
    }
    System.out.println("Start fresh discovery");
    mBtAdapter.startDiscovery();

    DisciveryRecv dReceiver = new DisciveryRecv ();
    // Register for broadcasts when a device is discovered
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    ctx.registerReceiver(dReceiver, filter);
}


public class DisciveryRecv extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction(); 
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            String dev = device.getName() + " - " + device.getAddress();
            mUtils.log("Found: " + dev);
        }
    }
}

startDiscovery работает нормально, но в ctx.registerReceiver(dReceiver, filter); приложение выдает исключение.

Инструментарий cmd-

adb shell am tool -w -r -e debug false -e class com.ex.main#demo com.ex/android.support.test.runner.AndroidJUnitRunner




Ответы (2)


InstrumentationRegistry.getTargetContext() возвращает контекст тестируемого приложения.

InstrumentationRegistry.getContext() возвращает контекст инструментария, выполняющего тесты.

Затем, если вы хотите зарегистрировать приемник, как в описанном вами случае, вам нужно приложение Context. Однако на самом деле это не тестирование того, как ваше приложение получает широковещательную передачу, поскольку приемник не является частью вашего приложения.

В любом случае, отвечая на ваш второй вопрос, причина использования InstrumentationRegistry.getContext() заключается в том, что вашим тестам нужен доступ к ресурсам или файлам, которые не являются частью приложения, а используются только в тестах.

РЕДАКТИРОВАТЬ

Вот пример. Два файла, один в приложении, другой в тестах

src/androidTest/assets/sometestfile
src/main/assets/someappfile

то вы можете получить к ним доступ в зависимости от контекста

@Test
public final void testAccessToAppAssetsFromTest() throws IOException {
    final AssetManager assetManager = mInstrumentation.getTargetContext().getAssets();
    assetManager.open("someappfile");
}

@Test
public final void testAccessToTestAssetsFromTest() throws IOException {
    final AssetManager assetManager = mInstrumentation.getContext().getAssets();
    assetManager.open("sometestfile");
}

Если вы попытаетесь сделать наоборот, тест провалится.

person Diego Torres Milano    schedule 02.02.2017
comment
Спасибо! Как всегда, вы помогли прояснить вопросы, связанные с МАУ. Даже для AndroidViewClient 4-х летней давности. Здесь до сих пор я не получаю использования getContext в инструментах. не могли бы вы привести пример, где мы используем - InstrumentationRegistry.getContext(). ресурсы, к которым мы можем получить доступ даже без getContext. правильно ? - person Rilwan; 03.02.2017

Я сам нашел ответ. Использование InstrumentationRegistry.getTargetContext() решило мою проблему.

InstrumentationRegistry.getInstrumentation(), возвращает инструментарий, работающий в данный момент.

InstrumentationRegistry.getContext() возвращает контекст этого пакета Instrumentation.

InstrumentationRegistry.getTargetContext() возвращает контекст приложения целевого приложения.

Вот некоторая информация: https://developer.android.com/reference/android/support/test/InstrumentationRegistry.html#getTargetContext()

Но все же я не уверен, когда использовать InstrumentationRegistry.getContext()...

person Rilwan    schedule 02.02.2017