0

Я пытаюсь получить результаты обнаружения Bluetooth через apk, который работает как бегун jroid-андроида. Все работает нормально, но в то время как 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 оболочки утра инструмент -w -r -e отлаживать ложный -e класс com.ex.main # демо com.ex/android.support.test.runner.AndroidJUnitRunner

ответ

2

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

InstrumentationRegistry.getContext() возвращает контекст контрольно-измерительного прибора.

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

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

EDIT

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

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

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

+0

Спасибо! Как всегда, вы помогли уточнить запросы, связанные с МАУ. Даже forAndroidViewClient 4 года назад. Здесь все еще я не получаю использование 'getContext' в инструментах. не могли бы вы привести пример, где мы используем - 'InstrumentationRegistry.getContext()'. ресурсы, к которым мы можем получить доступ, даже без getContext. правильно ? – Rilwan

0

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

InstrumentationRegistry.getInstrumentation(), возвращает контрольно-измерительное устройство в настоящее время.

InstrumentationRegistry.getContext(), возвращает «Контекст» этого инструментария.

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

Вот некоторые info- https://developer.android.com/reference/android/support/test/InstrumentationRegistry.html#getTargetContext()

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