Я пытаюсь открыть изображение / изображение в Галерее встроенное приложение из моего приложения.
У меня есть URI изображения (изображение расположено на SD-карте).
У Вас есть какие-либо предложения?
Это это полное решение. Я только что обновил этот пример кода информацией, предоставленной в ответе @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+.
Предполагая, что у вас есть папка изображение в вашем каталоге карт 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-карте .
Если вы можете вывести это и запустить, возможно, на примере поставляемого правильного провайдера, вы должны быть в состоянии выяснить работу для вашего кода.
Держите меня в курсе обновления этого вопроса с вашим прогрессом. Удачи