Android: как различать несколько намерений при использовании ActivityResultLauncher

Я создаю средство выбора намерений, чтобы выбирать между приложением камеры телефона и галереей/файловым менеджером.

      Intent chooserIntent = Intent.createChooser(clickPhoto(),"Set Image Using");
                        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,openGallery());
                        startActivityForResult.launch(chooserIntent);

Нажмите Фото метод:

      private Intent clickPhoto() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        ComponentName componentName = takePictureIntent.resolveActivity(requireActivity().getPackageManager());
        if (componentName != null) {
            try {
                createImageFile();
                mimeType = "image/*";
                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.DISPLAY_NAME, getNewFileName());
                values.put(MediaStore.Images.Media.MIME_TYPE, mimeType);
                values.put(MediaStore.Images.Media.RELATIVE_PATH, getImageDirectoryPath());

                Uri imageUri = requireActivity().getContentResolver().insert(MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL), values);
                if (imageUri != null) {
                    currentPhotoPath = imageUri.toString();
                    shareUri = imageUri;
                }
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

               // initRequestCode(takePictureIntent, requestCode);
            } catch (IOException ioException) {
                Toast.makeText(requireContext(), ioException.getMessage().toString(), Toast.LENGTH_LONG).show();

            }

        }
        return takePictureIntent;
    }

Метод открытой галереи:

      private Intent openGallery(){
    mimeType = "image/*";
    Intent intent = new Intent();
    Uri collection = MediaStore.Video.Media.getContentUri(
            MediaStore.VOLUME_EXTERNAL);

    try {
         intent =
                new Intent(Intent.ACTION_PICK, collection).setType(mimeType);
        intent.resolveActivity(requireActivity().getPackageManager());

       // initRequestCode(intent, requestCode);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(requireContext(), e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
    }
    return intent;
}

Лаунчер ActivityResult:

      ActivityResultLauncher<Intent> startActivityForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK) {
                   //how to tell which intent the user selected ?
                }
            });

как узнать, сделал ли пользователь снимок с помощью камеры или выбрал изображение с помощью средства выбора файлов?

2 ответа

Вы можете добавить дополнительное целое число к каждому намерению, прежде чем возвращать их, к которым вы можете получить доступ в результате, скажем:

Глобальные переменные

         final String SOURCE = "source";
    final int SOURCE_CAMERA = 0;
    final int SOURCE_GALLERY = 1;
   final int SOURCE_UNKNOWN = 2;

Для камеры

      ...
takePictureIntent.putExtra(SOURCE, SOURCE_CAMERA);
return takePictureIntent;

Для галереи

      ..
intent.putExtra(SOURCE, SOURCE_GALLERY);
return intent;

АктивацияРезультатЛаунчер

      if (result.getResultCode() == Activity.RESULT_OK) {
        //Identify source
       int mySource = result.getData().getIntExtra(SOURCE, SOURCE_UNKNOWN )         
}

Поскольку вы используетеActivityResultContracts.StartActivityForResultобратный вызов получает экземпляр ActivityResult . Итак, вы можете получить намерение, позвонивresult.getData(), как показано ниже:

      ActivityResultLauncher<Intent> startActivityForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK) {
                   Intent intent = result.getData();
                }
            });

Однако, если вам нужно создать некоторые условия, чтобы решить, что следует делать в соответствии с намерением, я бы предложил создать два разныхActivityResultLauncher<Intent>а потомlaunchих отдельно, поэтому у вас будет два разных обратных вызова, например:

      ActivityResultLauncher<Intent> galleryLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK) {
                   // what you have to do for gallery
                }
            });

ActivityResultLauncher<Intent> cameraLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK) {
                   // what you have to do for camera
                }
            });

Другие вопросы по тегам