Не удалось выбрать изображение из приложения Google Фото.

not необходимо поместить реализацию в файл заголовка, см. альтернативное решение в конце этого ответа.

В любом случае причина, по которой ваш код не работает, что при создании экземпляра шаблона компилятор создает новый класс с заданным аргументом шаблона. Например:

template
struct Foo
{
    T bar;
    void doSomething(T param) {/* do stuff using T */}
};

// somewhere in a .cpp
Foo f; 

При чтении этой строки компилятор создаст новый класс (назовем его FooInt), что эквивалентно следующему:

struct FooInt
{
    int bar;
    void doSomething(int param) {/* do stuff using int */}
}

Следовательно, компилятор должен иметь доступ к реализации методов, чтобы создать экземпляр с аргументом шаблона (в данном случае int). Если эти реализации не были в заголовке, они не были бы доступны, поэтому компилятор не смог бы создать экземпляр шаблона.

Общим решением для этого является запись объявления шаблона в заголовок файла, затем реализовать класс в файле реализации (например, .tpp) и включить этот файл реализации в конец заголовка.

// Foo.h
template 
struct Foo
{
    void doSomething(T param);
};

#include "Foo.tpp"

// Foo.tpp
template 
void Foo::doSomething(T param)
{
    //implementation
}

Таким образом, реализация по-прежнему отделена от объявления, но доступен компилятору.

Другое решение состоит в том, чтобы сохранить реализацию отдельно и явно создать все экземпляры шаблона, которые вам понадобятся:

// Foo.h

// no implementation
template  struct Foo { ... };

//----------------------------------------    
// Foo.cpp

// implementation of Foo's methods

// explicit instantiations
template class Foo;
template class Foo;
// You will only be able to use Foo with int or float

Если мое объяснение isn ' t достаточно ясно, вы можете взглянуть на C ++ Super-FAQ по этому вопросу .

1
задан jilbot 13 July 2018 в 17:29
поделиться

3 ответа

Проблема в том, что я не был подключен к сети, поэтому Google Фото не удалось получить выбранное изображение. См. Мой ответ на @ adityakamble49.

0
ответ дан jilbot 17 August 2018 в 12:20
поделиться

Используйте ACTION_GET_CONTENT Intent Action - Intent.ACTION_GET_CONTENT

Вызов после selectImage() метода для запуска выбора изображения Intent, в котором будут отображаться все приложения, доступные для выбора изображения из

private val RC_SELECT_IMGAE = 101

private fun selectImage() {
    val selectImageIntent = Intent(Intent.ACTION_GET_CONTENT, MediaStore.Images.Media
            .EXTERNAL_CONTENT_URI)
    startActivityForResult(selectImageIntent, RC_SELECT_IMGAE)
}

Затем обработайте обратный вызов путем переопределения метода onActivityResult() в Activity

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    when (requestCode) {
        RC_SELECT_IMGAE -> {
            if (data != null) {
                val uri = data.data
                displaySelectedImage(getBitmapFromUri(uri))
            }
        }
        else -> super.onActivityResult(requestCode, resultCode, data)
    }
}

Наконец, обновите представление изображения с помощью растрового изображения, как показано ниже

private fun getBitmapFromUri(uri: Uri): Bitmap {
    val parcelFileDescriptor = contentResolver.openFileDescriptor(uri, "r")
    val fileDescriptor = parcelFileDescriptor?.fileDescriptor
    val image = BitmapFactory.decodeFileDescriptor(fileDescriptor)
    parcelFileDescriptor.close()
    return image
}

private fun displaySelectedImage(imageBitmap: Bitmap) {
    iv_selected_image.setImageBitmap(imageBitmap)
}

Найдите рабочий пример выбора изображения здесь - ImagePickerExample

Вы можете добавить FileProvider в случае, если он дает какой-либо URI Exception

0
ответ дан adityakamble49 17 August 2018 в 12:20
поделиться
  • 1
    ACTION_PICK не работает. Это позволяет мне выбирать только галерею, а не приложение для фотографий Google. Это одно из многих решений, которые я уже пробовал во время своего поиска, прежде чем публиковать на SO. – jilbot 14 July 2018 в 14:13
  • 2
    Я должен упомянуть, что если включить include.type = & quot; image / * & quot; в этом запросе ACTION_PICK я могу выбрать фотографию из фотографий Google, но она возвращает RESULT_CANCELED в onActivityResult вместо изображения. – jilbot 14 July 2018 в 14:33
  • 3
    @jilbot Работает на моей стороне, используя тот же код, что и выше. Я быстро создал образец приложения для выбора изображений. Оформить заказ здесь - github.com/adityakamble49/image-picker-example – adityakamble49 14 July 2018 в 15:05
  • 4
    Спасибо, что нашли время, чтобы обеспечить это! Тем временем я обнаружил, что проблема в том, что мое устройство не было подключено к сети. Я включил WiFi и теперь могу получить фотографию, которую нужно загрузить из облака. Я ошибочно ожидал, что мои фотографии Google будут храниться на устройстве, но, похоже, они находятся только в облаке. Поэтому мне нужно больше узнать о приложении для фотографий, в том числе, когда и когда он хранит мои фотографии на устройстве. В любом случае ACTION_PICK и ACTION_GET_CONTENT теперь работают должным образом. – jilbot 14 July 2018 в 15:28
  • 5
    @jilbot Рад помочь. Вы можете уверенно поддержать и одобрить ответ, чтобы поблагодарить. :) Я обновил сообщение и пример с действием ACTION_GET_CONTENT. Теперь он работает с автономными, а также с онлайн-файлами. – adityakamble49 14 July 2018 в 15:41

Попробуем вот так:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        } else {
            intent = new Intent(Intent.ACTION_GET_CONTENT);
        }
0
ответ дан Gobu CSG 17 August 2018 в 12:20
поделиться
  • 1
    ACTION_OPEN_DOCUMENT не работает. В этом случае приложение полностью пропускает слайд-шоу (так что нет возможности выбрать «Фотографии» или любое другое приложение) и идет прямо на экран фотографий галереи. – jilbot 13 July 2018 в 17:48
Другие вопросы по тегам:

Похожие вопросы: