2017-05-22 1 views
2

J'ai besoin de réduire l'intention de la caméra en créant un fichier image sur le chemin fourni dans le supplément d'intention. L'expresso ne peut répondre qu'avec un résultat d'activité. Où puis-je effectuer l'opération pour créer le fichier au chemin passé à partir de l'intention supplémentaire.Espresso teste l'intention de la caméra lorsque imageuri est passé en tant que supplément

code pour le lancement de la caméra

File destination = new File(Environment.getExternalStorageDirectory(), "app_name" + System.currentTimeMillis() + ".jpg");

imageUri = FileProvider.getUriForFile(getApplicationContext(), getApplicationContext().getPackageName() + ".fileprovider", destination); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(intent, AppConstants.REQUEST_CODE_CAMERA);

Code pour l'intention stubbing dans le test

Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, null); intending(hasAction(MediaStore.ACTION_IMAGE_CAPTURE)).respondWith(result);

Répondre

3

Vous devez créer un IntentCallback pour intercepter la valeur Uri et économiser échantillon d'image là-bas.

échantillon dans Kotlin

intentCallback = IntentCallback { 
     if (it.action == "android.media.action.IMAGE_CAPTURE") { 
      it.extras.getParcelable<Uri>("output").run { 
       val inStream = Resources.getResource(sampleImageFileName).openStream() 
       val outStream = activity.contentResolver.openOutputStream(this) 
       ByteStreams.copy(inStream, outStream) 
      } 
     } 
    } 

Vous devez enregistrer votre rappel avant l'événement déclencheur intention

IntentMonitorRegistry.getInstance().addIntentCallback(intentCallback) 

Et ne pas oublier de désenregistrer à la fin

IntentMonitorRegistry.getInstance().removeIntentCallback(intentCallback) 
3

Ismael la réponse est parfaite. Pour ceux qui recherchent une solution en java, la voici.

intending(hasAction(MediaStore.ACTION_IMAGE_CAPTURE)).respondWith(
      new Instrumentation.ActivityResult(Activity.RESULT_OK, null)); 

IntentCallback intentCallback = new IntentCallback() { 
     @Override 
     public void onIntentSent(Intent intent) { 
      if (intent.getAction().equals("android.media.action.IMAGE_CAPTURE")) { 
       try { 
        Uri imageUri = intent.getParcelableExtra(MediaStore.EXTRA_OUTPUT); 
        Context context = InstrumentationRegistry.getTargetContext(); 
        Bitmap icon = BitmapFactory.decodeResource(
          context.getResources(), 
          R.mipmap.ic_launcher); 
        OutputStream out = getTargetContext().getContentResolver().openOutputStream(imageUri); 
        icon.compress(Bitmap.CompressFormat.JPEG, 100, out); 
        out.flush(); 
        out.close(); 
       } catch (IOException e) { 
        GenericUtility.handleException(e); 
       } 
      } 
     } 
    }; 
    IntentMonitorRegistry.getInstance().addIntentCallback(intentCallback); 

//Perform action here 
onView(withId(R.id.tv_take_photo)).perform(click());