Intereting Posts
Android – Учебник по блокноту – жизненный цикл – некоторые работы выполняются дважды? Как остановить медиаплеер должным образом, андроид Ориентировочная точка установки Android для анимации масштаба Выбор языка для упрощенного китайского языка Как поворачивать представления при изменении ориентации без повторной компоновки? Как воспроизвести звуковое уведомление с помощью Chrome для Android с помощью Javascript? Ошибка. Невозможно настроить расширение «публикации» после его доступа. Получить информацию о текущих видимых фрагментах в android dumpsys Как часто вы можете обновлять текст без беспорядка Удалите сервисы Google Play из приложения в Android Studio Как приостановить Eclipse на любом исключении? CommitAllowingStateLoss () в действиях фрагмента Android Marshmallow – изменение состояния прав Пикассо загружается в неправильное изображение при использовании шаблона держателя изображения Android Studio не признает импорт эспрессо

Как выбрать изображение из галереи (SD-карта) для моего приложения?

Первоначально этот вопрос задавали для Android 1.6.

Я работаю над параметрами фотографий в своем приложении.

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

Solutions Collecting From Web of "Как выбрать изображение из галереи (SD-карта) для моего приложения?"

Обновленный ответ, почти 5 лет спустя:

Код в исходном ответе больше не работает надежно, поскольку изображения из разных источников иногда возвращаются с другим содержимым URI, то есть content:// вместо file:// . Лучшее решение – просто использовать context.getContentResolver().openInputStream(intent.getData()) , поскольку это вернет InputStream, который вы сможете обрабатывать по context.getContentResolver().openInputStream(intent.getData()) .

Например, BitmapFactory.decodeStream() отлично работает в этой ситуации, так как вы также можете использовать поля Options и inSampleSize для уменьшения размера больших изображений и предотвращения проблем с памятью.

Однако такие вещи, как Google Drive, возвращают URI к изображениям, которые еще не были загружены. Поэтому вам нужно выполнить код getContentResolver () в фоновом потоке.


Оригинальный ответ:

Другие ответы объяснили, как отправить намерение, но они не объяснили, как справиться с ответом. Вот пример кода, как это сделать:

 protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { super.onActivityResult(requestCode, resultCode, imageReturnedIntent); switch(requestCode) { case REQ_CODE_PICK_IMAGE: if(resultCode == RESULT_OK){ Uri selectedImage = imageReturnedIntent.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query( selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String filePath = cursor.getString(columnIndex); cursor.close(); Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath); } } } 

После этого у вас есть выбранное изображение, сохраненное в «yourSelectedImage», чтобы делать все, что вы хотите. Этот код работает, получая местоположение изображения в базе данных ContentResolver, но этого недостаточно. Каждое изображение имеет около 18 столбцов информации, начиная от пути к файлу и заканчивая «последней модификацией даты» до координат GPS, где была сделана фотография, хотя многие из полей фактически не используются.

Чтобы сэкономить время, поскольку на самом деле вам не нужны другие поля, поиск курсора выполняется с помощью фильтра. Фильтр работает, указав имя нужного столбца, MediaStore.Images.Media.DATA, который является контуром, а затем передает эту строку [] в запрос курсора. Запрос курсора возвращает путь, но вы не знаете, в каком столбце он находится, пока не будет использоваться код columnIndex . Это просто получает номер столбца на основе его имени, тот же самый, который используется в процессе фильтрации. Как только вы получите это, вы, наконец, сможете декодировать изображение в растровое изображение с последней строкой кода, которую я дал.

 private static final int SELECT_PHOTO = 100; 

Начать намерение

 Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, SELECT_PHOTO); 

Результат процесса

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { super.onActivityResult(requestCode, resultCode, imageReturnedIntent); switch(requestCode) { case SELECT_PHOTO: if(resultCode == RESULT_OK){ Uri selectedImage = imageReturnedIntent.getData(); InputStream imageStream = getContentResolver().openInputStream(selectedImage); Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream); } } } 

Кроме того, вы можете также уменьшить размер изображения, чтобы избежать ошибок OutOfMemory.

 private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o); // The new size we want to scale to final int REQUIRED_SIZE = 140; // Find the correct scale value. It should be the power of 2. int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 1; while (true) { if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) { break; } width_tmp /= 2; height_tmp /= 2; scale *= 2; } // Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2); } 

Вы должны завести цель галереи для получения результата.

 Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, ACTIVITY_SELECT_IMAGE); 

Затем в onActivityForResult вызовите intent.getData() чтобы получить Uri изображения. Затем вам нужно получить изображение из ContentProvider.

Вот проверенный код для изображения и видео. Он будет работать для всех API менее 19 и более 19.

Образ:

 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, 10); } else if (Build.VERSION.SDK_INT > 19) { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 10); } 

Видео:

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

,

  @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == 10) { Uri selectedImageUri = data.getData(); String selectedImagePath = getRealPathFromURI(selectedImageUri); } else if (requestCode == 20) { Uri selectedVideoUri = data.getData(); String selectedVideoPath = getRealPathFromURI(selectedVideoUri); } } } 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(); } 

Сделайте это, чтобы запустить галерею и позволить пользователю выбрать изображение:

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, IMAGE_PICK); 

Затем в вашем onActivityResult() используйте URI изображения, которое возвращается для установки изображения на вашем ImageView.

 public class EMView extends Activity { ImageView img,img1; int column_index; Intent intent=null; // Declare our Views, so we can access them later String logo,imagePath,Logo; Cursor cursor; //YOU CAN EDIT THIS TO WHATEVER YOU WANT private static final int SELECT_PICTURE = 1; String selectedImagePath; //ADDED String filemanagerstring; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); img= (ImageView)findViewById(R.id.gimg1); ((Button) 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); } }); } //UPDATED @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { if (requestCode == SELECT_PICTURE) { Uri selectedImageUri = data.getData(); //OI FILE Manager filemanagerstring = selectedImageUri.getPath(); //MEDIA GALLERY selectedImagePath = getPath(selectedImageUri); img.setImageURI(selectedImageUri); imagePath.getBytes(); TextView txt = (TextView)findViewById(R.id.title); txt.setText(imagePath.toString()); Bitmap bm = BitmapFactory.decodeFile(imagePath); // img1.setImageBitmap(bm); } } } //UPDATED! public String getPath(Uri uri) { String[] projection = { MediaColumns.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); column_index = cursor .getColumnIndexOrThrow(MediaColumns.DATA); cursor.moveToFirst(); imagePath = cursor.getString(column_index); return cursor.getString(column_index); } } 
 public class BrowsePictureActivity extends Activity { private static final int SELECT_PICTURE = 1; private String selectedImagePath; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button) findViewById(R.id.Button01)) .setOnClickListener(new OnClickListener() { public void onClick(View arg0) { 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); } } } public String getPath(Uri uri) { if( uri == null ) { return null; } // 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(); return cursor.getString(column_index); } return uri.getPath(); } } 

По некоторым причинам все ответы в этом потоке, в onActivityResult() пытаются выполнить обработку полученного Uri , как получение реального пути изображения, а затем использовать BitmapFactory.decodeFile(path) чтобы получить Bitmap .

Этот шаг не нужен. Класс ImageView имеет метод setImageURI(uri) . Передайте свой uri, и вы должны сделать это.

 Uri imageUri = data.getData(); imageView.setImageURI(imageUri); 

Полный рабочий пример вы можете посмотреть здесь: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html

PS:
Получение Bitmap в отдельной переменной имеет смысл в тех случаях, когда загружаемое изображение слишком велико для размещения в памяти, а операция уменьшения масштаба необходима для предотвращения использования OurOfMemoryError , как показано в ответе @siamii.

Вызов selectImage метод like-

 public void chooseImage(ImageView v) { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, SELECT_PHOTO); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, imageReturnedIntent); if(imageReturnedIntent != null) { Uri selectedImage = imageReturnedIntent.getData(); switch(requestCode) { case SELECT_PHOTO: if(resultCode == RESULT_OK) { Bitmap datifoto = null; temp.setImageBitmap(null); Uri picUri = null; picUri = imageReturnedIntent.getData();//<- get Uri here from data intent if(picUri !=null){ try { datifoto = android.provider.MediaStore.Images.Media.getBitmap(this.getContentResolver(), picUri); temp.setImageBitmap(datifoto); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } catch (OutOfMemoryError e) { Toast.makeText(getBaseContext(), "Image is too large. choose other", Toast.LENGTH_LONG).show(); } } } break; } } else { //Toast.makeText(getBaseContext(), "data null", Toast.LENGTH_SHORT).show(); } } 
 #initialize in main activity path = Environment.getExternalStorageDirectory() + "/images/make_machine_example.jpg"; # ImageView image=(ImageView)findViewById(R.id.image); //--------------------------------------------------|| public void FromCamera(View) { Log.i("camera", "startCameraActivity()"); File file = new File(path); Uri outputFileUri = Uri.fromFile(file); Intent intent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); startActivityForResult(intent, 1); } public void FromCard() { Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, 2); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 2 && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); bitmap = BitmapFactory.decodeFile(picturePath); image.setImageBitmap(bitmap); if (bitmap != null) { ImageView rotate = (ImageView) findViewById(R.id.rotate); } } else { Log.i("SonaSys", "resultCode: " + resultCode); switch (resultCode) { case 0: Log.i("SonaSys", "User cancelled"); break; case -1: onPhotoTaken(); break; } } } protected void onPhotoTaken() { // Log message Log.i("SonaSys", "onPhotoTaken"); taken = true; imgCapFlag = true; BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; bitmap = BitmapFactory.decodeFile(path, options); image.setImageBitmap(bitmap); }