Я пытаюсь реализовать функцию, при которой пользователь может выбрать файл изображения из хранилища, и это изображение отображается в уменьшенном изображении ImageView.
Компонент выбора файла выглядит правильно:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, GET_ATTACHMENT_RESULT);
//...
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GET_ATTACHMENT_RESULT){
if (resultCode == RESULT_CANCELED){
// Anything TODO here?
} else if (resultCode == RESULT_OK){
Uri uri = data.getData();
addTimeFragment.onImageUrlReceived(uri);
}
}
}
Возвращаемый Uri выглядит как Uri содержимого и имеет некоторый путь, например:
content://com.android.providers.media.documents/document/image%3A14702
Вызов Uri.getPath () возвращает:
/document/image:14702
Я пробовал множество различных решений, найденных в многочисленных сообщениях переполнения стека, включая Picasso (идеальное решение), создание растровых изображений из различных методов, настройку URI ImageView и т. д ...
Нет программного метода настройки ресурса ImageView, работает даже на PNG, расположенных в моих чертежах. Я могу только успешно установить android:src
в XML.
Проверка работоспособности:
- ImageView видим, правильно ограничен и имеет соответствующую высоту и ширину.
- Я могу установить исходное изображение в XML, и оно появляется.Я также установил цвет фона, чтобы он был на экране.Все хорошо в XML.
- Я также могу успешно программно установить цвет фона ImageView, поэтому я знаю, что ссылаюсь на правильный ImageView в коде.
XML:
<ImageView
android:id="@+id/thumbnail"
android:layout_width="48dp"
android:layout_height="48dp"
app:layout_constraintTop_toBottomOf="@id/time_entry_spacer"
app:layout_constraintStart_toStartOf="@id/camera_bg"
android:layout_marginBottom="4dp"
android:layout_marginStart="6dp"
android:background="#220000FF"/>
НазначениеImageView:
//attachThumbnail is my ImageView
attachThumbnail = getActivity().findViewById(R.id.thumbnail);
attachThumbnail.setBackgroundColor(context.getResources().getColor(R.color.colorAccent)); // This works as a sanity check
Различные сбои с методом onImageUrlReceived:
public void onImageUrlReceived(Uri uri){
Log.d(APP_TAG, "URI: " + uri.toString());
Log.d(APP_TAG, "URI: " + uri.getPath());
// Even loading a known drawable fails
// Picasso.with(context).load(R.drawable.calendar).fit().error(R.drawable.error).into(attachThumbnail);
// Picasso.with(context).load(uri).fit().error(R.drawable.error).into(attachThumbnail);
// Picasso.with(context).load(uri.getPath()).fit().error(R.drawable.error).into(attachThumbnail);
// File imgFile = new File(url);
// if(imgFile.exists()){
// Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
//
// attachThumbnail.setImageBitmap(myBitmap);
// }
// attachThumbnail.setImageURI(uri);
// Bitmap bitmap = null;
// try {
// bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
// } catch (IOException e) {
// e.printStackTrace();
// }
// attachThumbnail.setImageBitmap(bitmap);
// Bitmap b = BitmapFactory.decodeFile(uri.getPath());
// attachThumbnail.setImageBitmap(b);
// See DownloadImage AsyncTask below
// new DownloadImage(attachThumbnail).execute(uri.getPath());
// InputStream with scaling
// try {
// InputStream ims = getActivity().getContentResolver().openInputStream(uri);
// Bitmap b = BitmapFactory.decodeStream(ims);
// Bitmap b2 = Bitmap.createScaledBitmap(b, 50, 50, false);
// attachThumbnail.setImageBitmap(b2);
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// }
// InputStream without Scaling
// Bitmap bitmap = null;
// try {
// bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(uri));
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// }
// attachThumbnail.setImageBitmap(bitmap);
}
public class DownloadImage extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImage(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.d("Error", e.getStackTrace().toString());
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
Любые другие мысли или идеи здесь очень приветствуются.Я определенно бью свою голову об стену на этом.
Спасибо.