Есть ли «стандартный» выбор для поставщиков контента изображений? - PullRequest
0 голосов
/ 23 января 2019

Например, когда я хочу прикрепить изображение к текстовому сообщению в приложении «Сообщения», я получаю знакомый системный диалог, представляющий камеру, галерею и других поставщиков содержимого изображений.

Я хочуиспользовать это в моем собственном приложении.Я вижу множество библиотек, которые позволяют пользователю выбирать между Галереей и Камерой, но я хочу, чтобы все установленного пользователем источника изображения отображались.

Является ли системное диалоговое окно из Сообщений (и другихстоковые приложения, такие как Mail), действительно ли они предназначены для этих приложений?Нужно ли нам строить свои собственные?Storage Access Framework не является правильным решением, поскольку он обходит камеру (или другие источники изображения, о которых я не задумывался, но мог присутствовать на устройстве пользователя).

Ответы [ 3 ]

0 голосов
/ 28 января 2019

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

код

Внутри какой-то клик

Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
startActivityForResult(i, 41);

Откроется действие выбора файлов только для файлов изображений.

Тогда вы можете получить результаты обратно:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK){
        if (requestCode == 41) {
            if (data != null) {
                Uri uri = data.getData();
                //This is the uri to the file
                //To get the file use the uri
            }
        }
    }
}

Тем не менее, вы должны создать BottomSheetDialog самостоятельно, но ваша работа будет резко сокращена, так как будет только 2 варианта: 1. Приложение камеры, 2. Выбор файла. Вам придется самостоятельно обработать событие камеры и получить изображение URI.

Android Default File Chooser

0 голосов
/ 31 января 2019

Я бы предложил Intent.ACTION_PICK

  private void selectFileFromGallery() {
    Intent intent = new Intent(Intent.ACTION_PICK,
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    intent.setType("image/*");


    startActivityForResult(Intent.createChooser(intent,
        "Select Picture"), requestGallery);
  }

Откроется диалоговое окно, подобное этому, которое содержит все пользовательские приложения, которые можно использовать в качестве средства выбора изображений: enter image description here

А потом, когда пользователь выбирает изображение:

   @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
      if (requestCode == requestGallery) {
        onSelectFromGalleryResult(data);
      }
    }

           @SuppressWarnings("deprecation")
          private void onSelectFromGalleryResult(Intent data) {
            Uri uri = data.getData();
            if (!uri.toString().contains("file")) {
              if (uri.toString().contains("external")) {//chosen from external storage
                photoUri = Uri.parse("file://" + getRealPathFromURI(uri));
              } else {
                photoUri = Uri.parse("file://" + (Build.VERSION.SDK_INT <= 18
                    ? getRealPathFromURI_API11to18(getActivity(), uri) :
                    getRealPathFromURI_API19(getActivity(), uri)));
              }

            }

          @SuppressLint("NewApi")
          private String getRealPathFromURI_API19(Context context, Uri uri) {
            return RealPathUtil.INSTANCE.getRealPathFromURI_API19(context, uri);
          }

      public String getRealPathFromURI(Uri contentUri) {
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = getActivity().managedQuery(contentUri, proj, null, null, null);
        int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
      }
          @SuppressLint("NewApi")
          private String getRealPathFromURI_API11to18(Context context, Uri contentUri) {
            String[] proj = { MediaStore.Images.Media.DATA };
            String result = null;

            CursorLoader cursorLoader = new CursorLoader(
                context,
                contentUri, proj, null, null, null);
            Cursor cursor = cursorLoader.loadInBackground();

            if (cursor != null) {
              int column_index =
                  cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
              cursor.moveToFirst();
              result = cursor.getString(column_index);
            }
            return result;
          }
0 голосов
/ 28 января 2019

Я предлагаю использовать изображение Android Android-Image-Cropper от ArthurHub

Это дает вам все варианты, которые вы ищете enter image description here

...