Получите/выберите изображение от встроенного приложения для Галереи Android программно

Я пытаюсь открыть изображение / изображение в Галерее встроенное приложение из моего приложения.

У меня есть URI изображения (изображение расположено на SD-карте).

У Вас есть какие-либо предложения?

265
задан hcpl 22 May 2013 в 20:48
поделиться

2 ответа

Это это полное решение. Я только что обновил этот пример кода информацией, предоставленной в ответе @mad ниже. Также ознакомьтесь с приведенным ниже решением от @Khobaib, в котором объясняется, как работать с изображениями picasa.

Обновление

Я только что просмотрел свой исходный ответ и создал простой проект Android Studio, который вы можете оформить с github и импортировать прямо в свою систему.

https://github.com/hanscappelle/SO-2169649

(обратите внимание, что выбор нескольких файлов все еще требует работы)

Выбор одного изображения

С поддержкой изображений из файловых проводников благодаря пользователю mad .

public class BrowsePictureActivity extends Activity {

    // this is the action code we use in our intent, 
    // this way we know we're looking at the response from our own action
    private static final int SELECT_PICTURE = 1;

    private String selectedImagePath;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.Button01)
                .setOnClickListener(new OnClickListener() {

                    public void onClick(View arg0) {

                        // in onCreate or any event where your want the user to
                        // select a file
                        Intent intent = new Intent();
                        intent.setType("image/*");
                        intent.setAction(Intent.ACTION_GET_CONTENT);
                        startActivityForResult(Intent.createChooser(intent,
                                "Select Picture"), SELECT_PICTURE);
                    }
                });
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
            }
        }
    }

    /**
     * helper to retrieve the path of an image URI
     */
    public String getPath(Uri uri) {
            // just some safety built in 
            if( uri == null ) {
                // TODO perform some logging or show user feedback
                return null;
            }
            // try to retrieve the image from the media store first
            // this will only work for images selected from gallery
            String[] projection = { MediaStore.Images.Media.DATA };
            Cursor cursor = managedQuery(uri, projection, null, null, null);
            if( cursor != null ){
                int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                String path = cursor.getString(column_index);
                cursor.close();
                return path;
            }
            // this is our fallback here
            return uri.getPath();
    }

}

Выбор нескольких изображений

Так как кто-то запросил эту информацию в комментарии, и лучше собрать информацию.

Установите дополнительный параметр EXTRA_ALLOW_MULTIPLE для цели:

intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);

И в проверке обработки результатов для этого параметра:

if (Intent.ACTION_SEND_MULTIPLE.equals(data.getAction()))
        && Intent.hasExtra(Intent.EXTRA_STREAM)) {
    // retrieve a collection of selected images
    ArrayList<Parcelable> list = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
    // iterate over these images
    if( list != null ) {
       for (Parcelable parcel : list) {
         Uri uri = (Uri) parcel;
         // TODO handle the images one by one here
       }
   }
} 

Обратите внимание, что это поддерживается только уровнем API 18+.

349
ответ дан 23 November 2019 в 02:26
поделиться

Предполагая, что у вас есть папка изображение в вашем каталоге карт SD только для изображений.

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
// tells your intent to get the contents
// opens the URI for your image directory on your sdcard
intent.setType("file:///sdcard/image/*"); 
startActivityForResult(intent, 1);

Тогда вы можете решить с тем, что вы хотели бы сделать с контентом обратно в свою деятельность.

Это был пример для получения имени пути для изображения, проверьте это с вашим кодом, чтобы убедиться, что вы можете обрабатывать возвращение результатов. Вы можете изменить код по мере необходимости, чтобы лучше соответствовать вашим потребностям.

protected final void onActivityResult(final int requestCode, final int
                     resultCode, final Intent i) {
    super.onActivityResult(requestCode, resultCode, i);

  // this matches the request code in the above call
  if (requestCode == 1) {
      Uri _uri = i.getData();

    // this will be null if no image was selected...
    if (_uri != null) {
      // now we get the path to the image file
     cursor = getContentResolver().query(_uri, null,
                                      null, null, null);
     cursor.moveToFirst();
     String imageFilePath = cursor.getString(0);
     cursor.close();
     }
   }

Мой совет - это попытаться получить образы, работающие правильно, я думаю, что проблема - это содержание доступа к изображениям на SDCard. Взгляните на Отображение изображений на SD-карте .

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

Держите меня в курсе обновления этого вопроса с вашим прогрессом. Удачи

10
ответ дан 23 November 2019 в 02:26
поделиться
Другие вопросы по тегам:

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