Разрешить пользователю выбирать камеру или галерею для изображения

То, что я пытаюсь сделать, кажется очень простым, но после нескольких дней поиска я не могу понять это.

У меня есть приложение, которое позволяет пользователю выбирать несколько (до 5) изображений. Я использую ImageView. Когда пользователь нажимает ImageView, я хотел бы разрешить им возможность

  1. Выберите изображение из галереи или
  2. Используйте камеру, чтобы сделать снимок.

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

Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
Intent gallIntent=new Intent(Intent.ACTION_GET_CONTENT);
gallIntent.setType("image/*"); 
Intent camIntent = new Intent("android.media.action.IMAGE_CAPTURE");
pickIntent.putExtra(Intent.EXTRA_INTENT, camIntent);
pickIntent.putExtra(Intent.EXTRA_INTENT, gallIntent)
pickIntent.putExtra(Intent.EXTRA_TITLE, "Select Source");
startActivityForResult(pickIntent, IMAGE_SELECTOR);

Но, похоже, я могу добавить только один EXTRA_INTENT. Меню отображается, как и ожидалось, но единственными вариантами являются «Галерея» и «Файлы… без камеры»).

Есть ли лучший / более простой способ сделать это, чего мне не хватает? Спасибо за любую помощь.


person Wulfgar    schedule 15.12.2010    source источник
comment
К вашему сведению, аналогичный ответ, дополняющий превосходный ответ Дэвида ниже. stackoverflow.com/a/11676554/294884 еще раз спасибо Дэвиду от всех !!!   -  person Fattie    schedule 02.06.2014
comment
Взгляните на этот ответ с намерением, которое объединяет оба запроса (камеру и галерею) в уникальное намерение: stackoverflow.com/a/32475805 / 2232889   -  person Mario Velasco    schedule 09.09.2015
comment
Просто: используйте такую ​​библиотеку, как this.   -  person Vansuita Jr.    schedule 07.02.2017


Ответы (17)


Вам нужно будет создать свой собственный диалог выбора, объединяющий оба результата разрешения намерений.

Для этого вам нужно будет запросить PackageManager с помощью PackageManager.queryIntentActivities () для обоих исходных намерений и создать окончательный список возможных намерений с одним новым намерением для каждого полученного действия, например:

List<Intent> yourIntentsList = new ArrayList<Intent>();

List<ResolveInfo> listCam = packageManager.queryIntentActivities(camIntent, 0);
for (ResolveInfo res : listCam) {
    final Intent finalIntent = new Intent(camIntent);
    finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
    yourIntentsList.add(finalIntent);
}

List<ResolveInfo> listGall = packageManager.queryIntentActivities(gallIntent, 0);
for (ResolveInfo res : listGall) {
    final Intent finalIntent = new Intent(gallIntent);
    finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
    yourIntentsList.add(finalIntent);
}

(Я написал это прямо здесь, поэтому это может не скомпилироваться)

Затем для получения дополнительной информации о создании настраиваемого диалогового окна из списка см. https://developer.android.com/guide/topics/ui/dialogs.html#AlertDialog

person Kevin Gaudin    schedule 16.12.2010

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

Вместо того, чтобы создавать диалог со списком параметров Intent, гораздо лучше использовать Intent.createChooser, чтобы получить доступ к графическим значкам и коротким именам различных приложений браузера «Камера», «Галерея» и даже сторонних файловых систем. такие как «Астро» и т. д.

Здесь описывается, как использовать стандартное намерение выбора и добавлять к нему дополнительные намерения.

private Uri outputFileUri;

private void openImageIntent() {

    // Determine Uri of camera image to save.
    final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator);
    root.mkdirs();
    final String fname = Utils.getUniqueImageFilename();
    final File sdImageMainDirectory = new File(root, fname);
    outputFileUri = Uri.fromFile(sdImageMainDirectory);

    // Camera.
    final List<Intent> cameraIntents = new ArrayList<Intent>();
    final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    final PackageManager packageManager = getPackageManager();
    final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
    for(ResolveInfo res : listCam) {
        final String packageName = res.activityInfo.packageName;
        final Intent intent = new Intent(captureIntent);
        intent.setComponent(new ComponentName(packageName, res.activityInfo.name));
        intent.setPackage(packageName);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        cameraIntents.add(intent);
    }

    // Filesystem.
    final Intent galleryIntent = new Intent();
    galleryIntent.setType("image/*");
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

    // Chooser of filesystem options.
    final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");

    // Add the camera options.
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));

    startActivityForResult(chooserIntent, YOUR_SELECT_PICTURE_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == YOUR_SELECT_PICTURE_REQUEST_CODE) {
            final boolean isCamera;
            if (data == null) {
                isCamera = true;
            } else {
                final String action = data.getAction();
                if (action == null) {
                    isCamera = false;
                } else {
                    isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                }
            }

            Uri selectedImageUri;
            if (isCamera) {
                selectedImageUri = outputFileUri;
            } else {
                selectedImageUri = data == null ? null : data.getData();
            }
        }
    }
}
person David Manpearl    schedule 10.09.2012
comment
отлично работает! но как я могу понять, откуда исходит изображение? Мой фактический код обрабатывает только намерение, если пользователь выбрал камеру. - person Lucas Jota; 19.11.2012
comment
Лукас, я добавил правку, которая показывает, как определить, является ли источник изображения камерой или галереей (isCamera) в методе onActivityResult. Он также определяет URI сохраненного изображения, который может сильно отличаться в зависимости от платформы и устройства. Единственный надежный способ узнать URI камеры на всех устройствах - указать его заранее. - person David Manpearl; 29.11.2012
comment
Очень хороший! Просто быстрое улучшение: в первом еще isCamera = MediaStore.ACTION_IMAGE_CAPTURE.equals (data.getAction ()); Одна линия, чтобы править ими всеми;) - person Glatzial; 23.01.2013
comment
Рекомендую сделать поле outputFileUri статическим из-за возможного изменения ориентации. И .... Одна строка, чтобы управлять ими ВСЕМИ: Uri selectedImageUri = (intent == null? True: MediaStore.ACTION_IMAGE_CAPTURE.equals (intent.getAction ()))? outputFileUri: (намерение == ноль? нуль: намерение.getData ()); - person peter.bartos; 18.03.2013
comment
Это здорово, спасибо. Всего одна небольшая проблема, он всегда использует тему Holo, даже если все мои действия используют Holo.Light. Как я могу изменить тему всплывающего окна? Спасибо - person Darren; 16.05.2013
comment
В моем случае final String fname = Utils.getUniqueImageFilename(); не работает ... он говорит Utils cannot be resolved :( - person Shajeel Afzal; 27.07.2013
comment
@Shajeel, Utils.getUniqueImageFilename() - это мой собственный метод создания уникального имени файла. Есть много способов сделать это. Один из самых простых - использовать что-то вроде "img_"+ System.currentTimeMillis() + ".jpg". Другой - File.createTempFile(). - person David Manpearl; 28.07.2013
comment
ох, понял. А как насчет расширений? могу я указать кроме .jpg? и является ли указание расширения необязательным или обязательным? - person Shajeel Afzal; 28.07.2013
comment
Да, я тоже здесь застрял ... Мне нужно правильное расширение, потому что файл затем загружается на веб-сервер, где он будет отображаться ... если расширение неправильное, то он сломается на веб-сервере. Спасибо. - person Todd Painton; 28.07.2013
comment
Я считаю, что камера Android может снимать только в формате jpeg, поэтому вы всегда должны использовать расширение имени файла .jpg (на самом деле есть способы получить исходные необработанные форматы из обратного вызова камеры, но они имеют размер эскиза и их сложно декодировать, поэтому не идите по этому пути, кроме случаев крайней необходимости из-за требований псевдореального времени или аналогичных). - person David Manpearl; 30.07.2013
comment
Это отлично сработало для меня, но у меня была одна проблема, когда использование камеры в качестве источника не вызывало onActivityResult, а сама камера не отклонялась. Основная причина заключалась в отсутствии разрешения в манифесте: ‹uses-permission android: name = android.permission.WRITE_EXTERNAL_STORAGE /› - person BitsEvolved; 01.09.2013
comment
Спасибо за этот ответ, он отлично работает. И благодаря @BitsEvolved за то, что камера не отклоняется, просто добавьте ‹uses-permission android: name = android.permission.WRITE_EXTERNAL_STORAGE /› в манифест. - person jayellos; 20.02.2014
comment
Как этот код работает для людей на KitKat OS 4.4? Похоже, что выборы «Гранки» и «Фотографии» были заменены на «Документы», что не очень удобно. В этом сообщении androiddev.orkitra.com/?p=128645, похоже, говорится, что это ожидаемый поведение, но кажется не очень хорошим. - person Ryan; 30.05.2014
comment
@David, как и все, я говорю спасибо - критически важным моментом для меня было определить, использует ли пользователь камеру или галерею. Ваши данные == null были для меня секретом! БЛАГОДАРНОСТЬ! - person Fattie; 02.06.2014
comment
Я использовал этот код как есть, но isCamara всегда возвращает false, даже если я выбираю камеру из намерения выбора. Любая идея?? - person akshay7692; 02.08.2014
comment
@Ryan см. Ответ Plexus ниже. - person Hackmodford; 06.11.2014
comment
Может ли кто-нибудь сказать мне, почему я получаю null для outputFileUri (только при использовании камеры, с галереей он работает нормально)? Мое тестовое устройство - Galaxy s2 с Anroid 4.2. - person Tina; 19.11.2014
comment
Привет, я также хочу добавить кнопку удаления изображения .. как сделать это возможным ?? - person Akshay; 16.03.2015
comment
Только что запустил это на 5.1.1. Я вижу data! = Null и data.getAction () == null. Это приводит к сбою прикрепления изображения, снятого камерой, поскольку uri в конечном итоге становится нулевым. Есть указатели? - person Rohan; 15.06.2015
comment
Как сказал Рохан, это изменено в 5.1.1. Вам нужно будет сделать if (data == null || data.getData() == null). - person Ryan; 26.06.2015
comment
Я обнаружил, что это if (data == null || (data.getData() == null && data.getClipData() == null)), поскольку data.getClipData() может быть не нулевым, если пользователь выбрал несколько изображений из библиотеки. - person ticofab; 28.07.2015
comment
@Tina Известно, что каждый сталкивается с исключением NullPointerException при работе со встроенным приложением камеры. Когда мы запускаем камеру, она фактически перезапускает нашу деятельность, в результате чего outputFileUri становится нулевым. Поэтому, когда мы используем outputFileUri для отображения захваченного изображения или записанного видео, мы получим исключение NullPointerException. Поэтому, чтобы исправить это, мы должны использовать onSaveInstanceState () и onRestoreInstanceState (), чтобы сохранить значение outputFileUri. - person Swapnil; 01.10.2015
comment
Использование Intent.ACTION_PICK вместо Intent.ACTION_GET_CONTENT вернет более естественное приложение «Фотографии» вместо приложения «Документы» в итоговом средстве выбора действий. - person 92tonywills; 07.12.2015
comment
в моем случае камера Google не открывается, когда я касаюсь камеры из средства выбора. Хотя и камера, и галерея указаны в окне выбора. Я использую Android 6.0 Marshmallow. - person Sam; 10.12.2015
comment
Я пробую if (data == null || data.getScheme().equals("file")), и он работает хорошо - person Raymond Lukanta; 24.05.2016
comment
Всегда получались пустые изображения с этим ответом, поэтому мне пришлось его адаптировать: см. stackoverflow.com/questions/38090474/ - person Antzi; 01.07.2016
comment
Это хороший ответ, но результат довольно запутанный. Например, теперь у меня есть возможность выбирать из файлового проводника ES и системы Android. Проводник файлов ES прост, но подождите, пока вы не получите доступ к системе Android, он покажет параметры для диспетчера файлов ES, проводника файлов по умолчанию, галереи и т. Д. Эти параметры уже доступны раньше. Теперь я только хотел сузить выбор до галереи, файловой системы + внешних приложений, которые могут получить доступ к файловой системе (если таковая имеется) и камере. - person Neon Warge; 25.01.2017
comment
Привет, когда я выбираю камеру, она возвращает null, просто если я выбираю из галереи работает! - person ; 29.01.2017
comment
Кто-нибудь достаточно любезен, чтобы поделиться версией этого кода firemonkey (fmx)? Например, я не могу найти createChooser в JIntent. Спасибо. - person sandman; 27.02.2017
comment
При использовании камеры я всегда получаю resultCode == Activity.RESULT_CANCELED в onActivityResult. На Android 7+ - person MobileMon; 26.06.2017
comment
Я использовал этот код. при нажатии кнопки у меня есть 2 варианта камеры и документа (я хочу галерею). второй момент - когда я выбираю одно и то же изображение два раза, получаю сообщение об ошибке, что изображение не найдено. когда выбираю первый раз работает. - person Ramdeo angh; 06.07.2017
comment
Мое приложение открывает камеру, но если я нажимаю ОК, ничего не происходит. Есть идеи по этому поводу? Я не знаю в чем проблема - person Alonso Ato Neyra; 21.08.2018

Я нашел это. С использованием:

galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

для одной из целей показывает пользователю возможность выбора «документов» в Android 4, что меня очень сбивает с толку. Использование этого вместо этого показывает вариант "галерея":

Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
person plexus    schedule 08.09.2014
comment
это работает нормально .. но когда мы просматриваем изображение с камеры, портретное изображение отображается в ландшафтном режиме .. - person ; 07.02.2015
comment
@ user5060065 и другие, у которых возникли проблемы с ориентацией выбранного изображения, см. stackoverflow.com/a/6931373/1975002, чтобы получить правильной ориентации, а затем при необходимости поверните его. - person Michaël Polla; 21.08.2016

У меня также была эта проблема, и я создал AlertDialog и использовал метод setItems () вместе со слушателем DialogInterface:

AlertDialog.Builder getImageFrom = new AlertDialog.Builder(Fotos.this);
getImageFrom.setTitle("Select:");
final CharSequence[] opsChars = {getResources().getString(R.string.takepic), getResources().getString(R.string.opengallery)};
getImageFrom.setItems(opsChars, new android.content.DialogInterface.OnClickListener(){

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if(which == 0){
            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
        }else
            if(which == 1){
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,
                    getResources().getString(R.string.pickgallery)), SELECT_PICTURE);
            }
        dialog.dismiss();
    }
});
person Paulina D.    schedule 01.02.2012

Я объединил несколько решений, чтобы создать полноценную утилиту для выбора изображения из галереи или камеры. Это особенности ImagePicker util (также в Github lib):

  • Объединенные намерения для восстановления галереи и камеры.
  • Изменить размер выбранных больших изображений (например, 2500 x 1600)
  • При необходимости поверните изображение

Снимок экрана:

Начальное намерение ImagePicker

Изменить: вот фрагмент кода для объединения объединенного намерения для приложений "Галерея" и "Камера". Вы можете увидеть полный код в ImagePicker util (также в Github lib):

public static Intent getPickImageIntent(Context context) {
    Intent chooserIntent = null;

    List<Intent> intentList = new ArrayList<>();

    Intent pickIntent = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    takePhotoIntent.putExtra("return-data", true);
    takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(context)));
    intentList = addIntentsToList(context, intentList, pickIntent);
    intentList = addIntentsToList(context, intentList, takePhotoIntent);

    if (intentList.size() > 0) {
        chooserIntent = Intent.createChooser(intentList.remove(intentList.size() - 1),
                context.getString(R.string.pick_image_intent_text));
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[]{}));
    }

    return chooserIntent;
}

private static List<Intent> addIntentsToList(Context context, List<Intent> list, Intent intent) {
    List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(intent, 0);
    for (ResolveInfo resolveInfo : resInfo) {
        String packageName = resolveInfo.activityInfo.packageName;
        Intent targetedIntent = new Intent(intent);
        targetedIntent.setPackage(packageName);
        list.add(targetedIntent);
    }
    return list;
}
person Mario Velasco    schedule 09.09.2015
comment
Это действительно хорошо работает. Спасибо. Единственная проблема, с которой я столкнулся, заключается в том, что фотографии, сделанные камерой в портретной ориентации, выглядят как альбомные. Что мне нужно сделать, чтобы повернуть необходимые изображения? - person 365SplendidSuns; 02.11.2015
comment
@ 365SplendidSuns Можете ли вы проверить, входит ли он в метод getRotationFromCamera (ImagePicker.java) и какое значение он возвращает? В каком телефоне вы тестируете? - person Mario Velasco; 02.11.2015
comment
Я использую Sony Experia C и эмулятор Android Studio. Я просто поставил несколько точек останова, чтобы проверить то, о чем вы спрашивали, и кажется, что логическое значение isCamera ложно в методе getRotation, который останавливает вызов getRotationFromCamera. - person 365SplendidSuns; 02.11.2015
comment
Какую версию Android вы используете? На прошлой неделе я добавил модификацию в строку 58, проверьте, решила ли она ее: boolean isCamera = (imageReturnedIntent == null || imageReturnedIntent.getData() == null); - person Mario Velasco; 02.11.2015
comment
Хорошо, это эмулятор версии 6.0, и кажется, что строка 58 отлично работает с этим. На эмуляторе isCamera истинно, а getRotationFromCamera вызывается нормально, но ориентация int равна 0, что означает, что getRotationFromCamera возвращает 0 ... Устройство Sony использует Android 4.2, и на этом ни imageReturnedIntent, ни imageReturnedIntent.getData () не имеют значения null в строке 58 это означает, что isCamera является ложным, и я не дохожу до вызова getRotationFromCamera. - person 365SplendidSuns; 02.11.2015
comment
Вероятно, в эмуляторе нет датчиков, чтобы знать, было ли фото сделано в портретной или альбомной ориентации, но в телефоне все должно работать. Я выясню подробнее, почему он не работает на этом телефоне. Подскажите, если найдете решение. - person Mario Velasco; 02.11.2015
comment
Давайте продолжим это обсуждение в чате. - person Mario Velasco; 02.11.2015


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

private static final String STORED_INSTANCE_KEY_FILE_URI = "output_file_uri";

@Override
public void onSaveInstanceState( Bundle outState ) {
    super.onSaveInstanceState( outState );

    if ( outputFileUri != null ) {
        outState.putString( STORED_INSTANCE_KEY_FILE_URI, outputFileUri.toString() );
    }
}

@Override
public void onViewStateRestored( Bundle savedInstanceState ) {
    super.onViewStateRestored( savedInstanceState );

    if ( savedInstanceState != null ) {
      final String outputFileUriStr = savedInstanceState.getString( STORED_INSTANCE_KEY_FILE_URI );
      if ( outputFileUriStr != null && !outputFileUriStr.isEmpty() ) {
          outputFileUri = Uri.parse( outputFileUriStr );
      }
    }
}

Примечание. Я использую этот код внутри android.support.v4.app. Фрагмент ваших переопределенных методов может измениться в зависимости от того, какую версию фрагмента / действия вы используете.

person Shah    schedule 13.01.2015

Вы можете создать диалог опций

Открытая камера:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                                MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString());
                        if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
                            startActivityForResult(cameraIntent, CAMERA_IMAGE);
                        }

Открыть галерею:

if (Build.VERSION.SDK_INT <= 19) {
            Intent i = new Intent();
            i.setType("image/*");
            i.setAction(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            startActivityForResult(i, GALLARY_IMAGE);
        } else if (Build.VERSION.SDK_INT > 19) {
            Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(intent, GALLARY_IMAGE);
        }

Получить результат выбора

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == GALLARY_IMAGE) {
                Uri selectedImageUri = data.getData();
                String selectedImagePath = getRealPathFromURI(selectedImageUri);
            } else if (requestCode == CAMERA_IMAGE) {
                Bundle extras = data.getExtras();
                Bitmap bmp = (Bitmap) extras.get("data");
                SaveImage(bmp);
            }
        }
    }

 public String getRealPathFromURI(Uri uri) {
        if (uri == null) {
            return null;
        }
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null);
        if (cursor != null) {
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
        return uri.getPath();
    }

Метод сохранения захваченного изображения

 private void SaveImage(final Bitmap finalBitmap) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                String root = Environment.getExternalStorageDirectory().toString();

                File myDir = new File(root + "/Captured Images/");
                if (!myDir.exists())
                    myDir.mkdirs();

                String fname = "/image-" + System.currentTimeMillis() + ".jpg";
                File file = new File(myDir, fname);
                try {
                    FileOutputStream out = new FileOutputStream(file);
                    finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
                    out.flush();
                    out.close();
                    localImagePath = myDir + fname;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }


        });
        t.start();

    }
person Muhammad Umair Shafique    schedule 15.12.2015

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

Вместо того, чтобы создавать диалог со списком параметров Intent, гораздо лучше использовать Intent.createChooser, чтобы получить доступ к графическим значкам и коротким именам различных приложений браузера «Камера», «Галерея» и даже сторонних файловых систем. такие как «Астро» и т. д.

Здесь описывается, как использовать стандартное намерение выбора и добавлять к нему дополнительные намерения.

private void openImageIntent(){

    // Determine Uri of camera image to save.
    final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "amfb" + File.separator);
    root.mkdir();
    final String fname = "img_" + System.currentTimeMillis() + ".jpg";
    final File sdImageMainDirectory = new File(root, fname);
    outputFileUri = Uri.fromFile(sdImageMainDirectory);

    // Camera.
    final List<Intent> cameraIntents = new ArrayList<Intent>();
    final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    final PackageManager packageManager = getPackageManager();
    final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
    for (ResolveInfo res : listCam){
        final String packageName = res.activityInfo.packageName;
        final Intent intent = new Intent(captureIntent);
        intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
        intent.setPackage(packageName);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        cameraIntents.add(intent);
    }

    //FileSystem
    final Intent galleryIntent = new Intent();
    galleryIntent.setType("image/");
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

    // Chooser of filesystem options.
    final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
    // Add the camera options.
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
    startActivityForResult(chooserIntent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);

}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
            final boolean isCamera;
            if (data == null) {
                isCamera = true;
            } else {
                final String action = data.getAction();
                if (action == null) {
                    isCamera = false;
                } else {
                    isCamera = action.equals(MediaStore.ACTION_IMAGE_CAPTURE);
                }
            }

            Uri selectedImageUri;
            if (isCamera) {
                selectedImageUri = outputFileUri;
                //Bitmap factory
                BitmapFactory.Options options = new BitmapFactory.Options();
                // downsizing image as it throws OutOfMemory Exception for larger
                // images
                options.inSampleSize = 8;
                final Bitmap bitmap = BitmapFactory.decodeFile(selectedImageUri.getPath(), options);
                preview.setImageBitmap(bitmap);
            } else {
                selectedImageUri = data == null ? null : data.getData();
                Log.d("ImageURI", selectedImageUri.getLastPathSegment());
                // /Bitmap factory
                BitmapFactory.Options options = new BitmapFactory.Options();
                // downsizing image as it throws OutOfMemory Exception for larger
                // images
                options.inSampleSize = 8;
                try {//Using Input Stream to get uri did the trick
                    InputStream input = getContentResolver().openInputStream(selectedImageUri);
                    final Bitmap bitmap = BitmapFactory.decodeStream(input);
                    preview.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    } else if (resultCode == RESULT_CANCELED){
        // user cancelled Image capture
        Toast.makeText(getApplicationContext(),
                "User cancelled image capture", Toast.LENGTH_SHORT)
                .show();
    } else {
        // failed to capture image
        Toast.makeText(getApplicationContext(),
                "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                .show();
    }
}
person Community    schedule 22.02.2015
comment
Привет. Я пробовал ваше решение, но выбор изображения из галереи не работает: посмотрите здесь: stackoverflow.com/questions/36884651/ - person ; 27.04.2016
comment
На моем устройстве с зефиром это не работает при использовании камеры. для меня данные не равны нулю, но есть действие, в результате чего isCamera устанавливается в false. - person JStephen; 13.05.2016

Решена проблема с слишком большим изображением и предотвращена нехватка памяти.

    private static final int SELECT_PICTURE = 0;
    private static final int REQUEST_CAMERA = 1;
    private ImageView mImageView;

    private void selectImage() {
        final CharSequence[] items = {"Take Photo", "Choose from Library",
                "Cancel"};
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle("Add Photo!");
        builder.setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int item) {
                if (items[item].equals("Take Photo")) {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    File f = new File(android.os.Environment
                            .getExternalStorageDirectory(), "temp.jpg");
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
                    startActivityForResult(intent, REQUEST_CAMERA);
                } else if (items[item].equals("Choose from Library")) {
                    Intent intent = new Intent(
                            Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    intent.setType("image/*");
                    startActivityForResult(
                            Intent.createChooser(intent, "Select File"),
                            SELECT_PICTURE);
                } else if (items[item].equals("Cancel")) {
                    dialog.dismiss();
                }
            }
        });
        builder.show();
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == REQUEST_CAMERA) {
                File f = new File(Environment.getExternalStorageDirectory()
                        .toString());
                for (File temp : f.listFiles()) {
                    if (temp.getName().equals("temp.jpg")) {
                        f = temp;
                        break;
                    }
                }
                try {
                    Bitmap bm;
                    BitmapFactory.Options btmapOptions = new BitmapFactory.Options();
                    btmapOptions.inSampleSize = 2;
                    bm = BitmapFactory.decodeFile(f.getAbsolutePath(),
                            btmapOptions);

                    // bm = Bitmap.createScaledBitmap(bm, 70, 70, true);
                    mImageView.setImageBitmap(bm);

                    String path = android.os.Environment
                            .getExternalStorageDirectory()
                            + File.separator
                            + "test";
                    f.delete();
                    OutputStream fOut = null;
                    File file = new File(path, String.valueOf(System
                            .currentTimeMillis()) + ".jpg");
                    fOut = new FileOutputStream(file);
                    bm.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                    fOut.flush();
                    fOut.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
                String tempPath = getPath(selectedImageUri, this.getActivity());
                Bitmap bm;
                btmapOptions.inSampleSize = 2;
                BitmapFactory.Options btmapOptions = new BitmapFactory.Options();
                bm = BitmapFactory.decodeFile(tempPath, btmapOptions);
                mImageView.setImageBitmap(bm);
            }
        }
    }
    public String getPath(Uri uri, Activity activity) {
        String[] projection = {MediaStore.MediaColumns.DATA};
        Cursor cursor = activity
                .managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
person Luna Kong    schedule 02.04.2015

Добавление моего решения - оно вернет обратный вызов, будь то с камеры или с камбуза вместе с намерением:

public class ImagePickerManager extends BaseAdapter {

private List<ResolveInfo> mApplications;
private TreeSet<Integer> mImageCaptureIntents;
private TreeSet<Integer> mImagePickerIntents;
private Context mContext;
private final ImagePickerManagerListener listener;

private static enum intentType {
    choosePhoto,
    takePhoto,
    unknown;

    public int getIntValue() {
        switch (this) {
            case choosePhoto:
                return 0;
            case takePhoto:
                return 1;
            case unknown:
                return 2;
        }
        return 0;
    }
}

public interface ImagePickerManagerListener {
    void onChooseImage(Intent intent);
    void onCaptureImage(Intent intent);
}

public ImagePickerManager(Context context,ImagePickerManagerListener listenr) {
    this.mContext = context;
    this.listener = listenr;

    mImageCaptureIntents = new TreeSet<>();
    mImagePickerIntents = new TreeSet<>();

    //Picking photo intent
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    mApplications = mContext.getPackageManager().queryIntentActivities(intent, 0);

    int index = 0;
    for (int i = 0; i < mApplications.size(); i++) {
        mImagePickerIntents.add(index);
        index++;
    }

    //Capture photo intent
    intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    List<ResolveInfo> resolveInfoList = mContext.getPackageManager().queryIntentActivities(intent, 0);
    mApplications.addAll(resolveInfoList);
    for (int i = 0; i < mApplications.size(); i++) {
        mImageCaptureIntents.add(index);
        index++;
    }
}

public static void openChooseAndCaptureImageDialog(final Context context, final ImagePickerManagerListener listener) {

    Log.d("openChooseAndCaptureImageDialog", "enter");

    final AlertDialog.Builder builder = new AlertDialog.Builder(context);
    final ImagePickerManager imagePickerManager = new ImagePickerManager(context,listener);
    builder.setTitle(context.getString(R.string.image_picker_dialog_box_title));
    builder.setAdapter(imagePickerManager, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialoginterface, int i) {
            ResolveInfo resolveInfo = (ResolveInfo) imagePickerManager.getItem(i);
            Intent pickerIntent = imagePickerManager.getIntentForPackage(context,resolveInfo,i);
            switch (imagePickerManager.getIntentType(i)){
                case choosePhoto:
                    listener.onChooseImage(pickerIntent);
                    break;
                case takePhoto:
                    listener.onCaptureImage(pickerIntent);
                    break;
                case unknown:
                    break;
            }
        }
    });

    builder.setCancelable(true);
    builder.setInverseBackgroundForced(true);
    AlertDialog dialog = builder.create();
    dialog.show();
}


private intentType getIntentType(int index) {

    if (mImageCaptureIntents.contains(index)) {
       return intentType.takePhoto;
    } else if(mImagePickerIntents.contains(index)) {
        return intentType.choosePhoto;
    }
    return intentType.unknown;
}

private Intent getIntentForPackage(Context context, ResolveInfo info,int index) {
    Intent intent = context.getPackageManager().getLaunchIntentForPackage(info.activityInfo.packageName);

    ComponentName chosenName = new ComponentName(
            info.activityInfo.packageName,
            info.activityInfo.name);

    intent.setComponent(chosenName);
    intent.setFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME);
    if (mImageCaptureIntents.contains(index)) {
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
    } else if(mImagePickerIntents.contains(index)) {
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_PICK);
    }
    return intent;
}

@Override
public int getCount() {
    return mApplications.size();
}

@Override
public Object getItem(int position) {
    return mApplications.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ResolveInfo item = mApplications.get(position);
    if (convertView == null) {
        TextView applicationTextView = new TextView(mContext);
        LayoutParams param = new LayoutParams(
                LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT);
        applicationTextView.setLayoutParams(param);
        final int horizontalPadding = (int) FVRGeneralUtils.convertDpToPx(mContext, 15);
        final int verticalPadding = (int) FVRGeneralUtils.convertDpToPx(mContext, 5);
        applicationTextView.setPadding(horizontalPadding,verticalPadding, horizontalPadding, verticalPadding);
        applicationTextView.setGravity(android.view.Gravity.CENTER_VERTICAL);
        Resources.Theme th = mContext.getTheme();
        TypedValue tv = new TypedValue();

        if (th.resolveAttribute(android.R.attr.textAppearanceMedium, tv, true)) {
            applicationTextView.setTextAppearance(mContext, tv.resourceId);
        }

        applicationTextView.setMinHeight((int) FVRGeneralUtils.convertDpToPx(mContext, 25));
        applicationTextView.setCompoundDrawablePadding((int) FVRGeneralUtils.convertDpToPx(mContext, 7));
        convertView = applicationTextView;
    }

    TextView textView = (TextView) convertView;
    textView.setText(item.loadLabel(mContext.getPackageManager()));
    textView.setCompoundDrawablesWithIntrinsicBounds(item.loadIcon(mContext.getPackageManager()), null, null, null);
    return textView;
} }
person oznus    schedule 23.12.2014

Вы можете попробовать это:

Чтобы открыть галерею:

private void browseImage() {

        try {
  Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
  startActivityForResult(galleryIntent, GALLERY_IMAGE_PICK); //GALLERY_IMAGE_PICK it is a string
  } catch (Exception e) {}
     }

Чтобы открыть камеру:

 private void captureImage() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    // start the image capture Intent

    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);

}
person ZeroView    schedule 24.11.2015
comment
Это паста из другого источника на SO. Например - что делает getOutputMediaFileUri? Приведите полные примеры с пояснениями. - person kilokahn; 07.02.2019

Это просто с помощью AlertDialog и Intent.ACTION_PICK.

    //camOption is a string array contains two items (Camera, Gallery)
    AlertDialog.Builder builder = new AlertDialog.Builder(CarPhotos.this);
    builder.setTitle(R.string.selectSource)
    .setItems(R.array.imgOption, new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int which)

     {

        if (which==0) {
        Intent intent = new Intent(this, CameraActivity.class);
        startActivityForResult(intent, REQ_CAMERA_IMAGE);               }

        if (which==1) {
        Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, RESULT_LOAD_IMAGE);
            }

     }
            });
             builder.create();
             builder.show();
person Seven    schedule 22.12.2014

Основываясь на ответе Дэвида, мои два пенни на onActivityResult() части. Он заботится об изменениях, внесенных в 5.1.1, и определяет, выбрал ли пользователь одно или несколько изображений из библиотеки.

private enum Outcome {
    camera, singleLibrary, multipleLibrary, unknown
}

/**
 * Returns a List<Uri> containing the image uri(s) chosen by the user
 *
 * @param data      The data intent coming from the onActivityResult()
 * @param cameraUri The uri that had been passed to the intent when the chooser was invoked.
 * @return A List<Uri>, never null.
 */
public List<Uri> getPicturesUriFromIntent(Intent data, Uri cameraUri) {

    Outcome outcome = Outcome.unknown;

    if (data == null || (data.getData() == null && data.getClipData() == null)) {
        outcome = Outcome.camera;
    } else if (data.getData() != null && data.getClipData() == null) {
        outcome = Outcome.singleLibrary;
    } else if (data.getData() == null) {
        outcome = Outcome.multipleLibrary;
    } else {
        final String action = data.getAction();
        if (action != null && action.equals(MediaStore.ACTION_IMAGE_CAPTURE)) {
            outcome = Outcome.camera;
        }
    }

    // list the uri(s) we got back
    List<Uri> uris = new ArrayList<>();
    switch (outcome) {
        case camera:
            uris.add(cameraUri);
            break;

        case singleLibrary:
            uris.add(data.getData());
            break;

        case multipleLibrary:
            final ClipData clipData = data.getClipData();
            for (int i = 0; i < clipData.getItemCount(); i++) {
                ClipData.Item item = clipData.getItemAt(i);
                uris.add(item.getUri());
            }
            break;
    }

    return uris;
}
person ticofab    schedule 28.07.2015

Попробуй так

final CharSequence[] items = { "Take Photo", "Choose from Library",
            "Cancel" };

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
    builder.setTitle("Add Photo!");
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (items[item].equals("Take Photo")) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                File f = new File(android.os.Environment
                        .getExternalStorageDirectory(), "temp.jpg");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
                startActivityForResult(intent, REQUEST_CAMERA);
            } else if (items[item].equals("Choose from Library")) {
                Intent intent = new Intent(
                        Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setType("image/*");
                startActivityForResult(
                        Intent.createChooser(intent, "Select File"),
                        SELECT_FILE);
            } else if (items[item].equals("Cancel")) {
                dialog.dismiss();
            }
        }
    });
    builder.show();

Затем создайте метод onactivityresult и сделайте что-то вроде этого

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == REQUEST_CAMERA) {
            File f = new File(Environment.getExternalStorageDirectory()
                    .toString());
            for (File temp : f.listFiles()) {
                if (temp.getName().equals("temp.jpg")) {
                    f = temp;
                    break;
                }
            }
            try {
                Bitmap bm;
                BitmapFactory.Options btmapOptions = new BitmapFactory.Options();

                bm = BitmapFactory.decodeFile(f.getAbsolutePath(),
                        btmapOptions);

                // bm = Bitmap.createScaledBitmap(bm, 70, 70, true);
                ivImage.setImageBitmap(bm);

                String path = android.os.Environment
                        .getExternalStorageDirectory()
                        + File.separator
                        + "Phoenix" + File.separator + "default";
                f.delete();
                OutputStream fOut = null;
                File file = new File(path, String.valueOf(System
                        .currentTimeMillis()) + ".jpg");
                try {
                    fOut = new FileOutputStream(file);
                    bm.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                    fOut.flush();
                    fOut.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (requestCode == SELECT_FILE) {
            Uri selectedImageUri = data.getData();

            String tempPath = getPath(selectedImageUri, MainActivity.this);
            Bitmap bm;
            BitmapFactory.Options btmapOptions = new BitmapFactory.Options();
            bm = BitmapFactory.decodeFile(tempPath, btmapOptions);
            ivImage.setImageBitmap(bm);
        }
    }
}

См. Этот http://www.theappguruz.com/blog/android-take-photo-camera-gallery-code-sample

person Aditya Vyas-Lakhan    schedule 19.01.2017

Выбор камеры или галереи для изображения в Android

Я много работал над Camera or Gallery Image Selection и создал для этой работы некоторый служебный класс. С использованием этого класса «Слишком просто выбрать камеру или галерею» у вас ушло всего 5-10 минут вашей разработки.

Шаг 1. Добавьте эти классы в свой код.

ImagePickerUtils: - http://www.codesend.com/view/f8f7c637716bf1c693d1490635ed49b3/

BitmapUtils: - http://www.codesend.com/view/81c1c2a3f39f1f7e627f01f67be282cf/

ConvertUriToFilePath: - http://www.codesend.com/view/f4668a29860235dd1b66eb419c5a58b5/

MediaUtils: - https://codeshare.io/5vKEMl

Нам нужно добавить эти разрешения в менифест:

  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-feature android:name="android.hardware.camera" />
  <uses-feature android:name="android.hardware.camera.autofocus" />

Эта функция класса (checkAndRequestPermissions) автоматически проверяет разрешение в Android-Marshmallow и Android-Nougat.

Шаг-2. Вызов класса камеры для запуска намерения камеры:

 //Create a global veriable .  
     private Uri mCameraUri;
     private static final int CAMERA_REQUEST_CODE = 100;

// Call this function when you wants to select or capture an Image.
       mCameraUri = ImagePickerUtils.createTakePictureIntent(this, CAMERA_REQUEST_CODE);

Шаг 3. Добавьте onActivityResult в Activity для получения данных от Intent

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            Uri fileUri = ImagePickerUtils.getFileUriOfImage(this, data, mCameraUri);
            try {
                Bitmap bitmap = null;
                if (CAMERA_REQUEST_CODE == requestCode) {
                    bitmap = new BitmapUtils().getDownsampledBitmap(this, fileUri, imageView.getWidth(), imageView.getHeight());
                }
                if (bitmap != null)
                imageView.setImageBitmap(bitmap);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

Надеюсь, это поможет вам. Если у кого-то есть предложения по улучшению этого класса, пожалуйста, оставьте свой отзыв в комментариях.

person A-Droid Tech    schedule 28.04.2017
comment
Это проблема. Где находится класс MediaUtils, который используется в BitmapUtils и ImagePickerUtils? - person Roger RV; 23.11.2017
comment
@RogerRV, спасибо, что уведомили меня, я только что обновил ответ новым файлом класса. - person A-Droid Tech; 23.11.2017
comment
Благодаря вам сейчас проверю. Пытался решить для себя, работает но совсем не работает - person Roger RV; 23.11.2017

Согласно ответу Дэвида Манперла
https://stackoverflow.com/a/12347567/7226732 < / а>

нам просто нужно изменить onActivityResult () как

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == YOUR_SELECT_PICTURE_REQUEST_CODE) {
            final boolean isCamera;
            if (data.getExtras() == null) {
                isCamera = true;
            } else {
                final String action = data.getAction();
                if (action == null) {
                    isCamera = false;
                } else {
                    isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                }
            }
            Uri selectedImageUri;
            if (isCamera) {
                selectedImageUri = fileUri;
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri);
                    Toast.makeText(CreateWaterType.this, "Image Saved!", Toast.LENGTH_SHORT).show();
                    image_view.setImageBitmap(bitmap);

                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(CreateWaterType.this, "Failed!", Toast.LENGTH_SHORT).show();
                }

            } else {
                selectedImageUri = data == null ? null : data.getData();
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri);

                    Toast.makeText(CreateWaterType.this, "Image Saved!", Toast.LENGTH_SHORT).show();
                    image_view.setImageBitmap(bitmap);

                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(CreateWaterType.this, "Failed!", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
}

и установите захват или выберите изображения в режиме просмотра.

person Mohammad Adil    schedule 26.09.2017