#java #android #url #uri #subsampling
#java #Android #url #uri #подвыборка
Вопрос:
У меня есть метод, в котором URL запрашивается из моей базы данных и отправляется как дополнительный перед открытием действия, в котором вы можете масштабировать, панорамировать и т.д.
topLevelMessageImage.setOnClickListener(v -> {
ParseQuery<ParseObject> imageQuery = new ParseQuery<>(ParseConstants.CLASS_YEET);
imageQuery.whereEqualTo(ParseConstants.KEY_OBJECT_ID, topLevelCommentObject.getObjectId());
imageQuery.findInBackground((user, e2) -> {
if (e2 == null) for (ParseObject userObject : user) {
if (userObject.getParseFile("image") != null) {
String imageURL = userObject.getParseFile("image").getUrl();
Log.w(getClass().toString(), imageURL);
// Asynchronously display the message image downloaded from Parse
if (imageURL != null) {
Intent intent = new Intent(getApplicationContext(), MediaPreviewActivity.class);
intent.putExtra("imageUrl", imageURL);
this.startActivity(intent);
}
}
}
});
});
Когда начинается действие, я получаю следующее исключение:
10-01 20:46:08.202 16149-16460/com.yitter.android E/SubsamplingScaleImageView: Failed to initialise bitmap decoder
java.io.FileNotFoundException: No content provider: https://parsefiles.back4app.com/GDprTC66bNMp3mXWNvWJbZhWwjedoucvp6NlNKVl/03a8e1618392395811c9830333c0443f_6cf1e0ef-47af-4ddc-88cc-196debd77a9a.jpeg
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1090)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:942)
at android.content.ContentResolver.openInputStream(ContentResolver.java:662)
at com.davemorrissey.labs.subscaleview.decoder.SkiaImageRegionDecoder.init(SkiaImageRegionDecoder.java:67)
at com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView$TilesInitTask.doInBackground(SubsamplingScaleImageView.java:1415)
at com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView$TilesInitTask.doInBackground(SubsamplingScaleImageView.java:1391)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Я полагаю, я не могу просто передать SubsamplingScaleImageView URL-адрес, а? Я думаю, я тоже не могу использовать Picasso? Что мне делать вместо этого?
private void locateImageView() {
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
if (bundle.getString("imageUrl") != null) {
String imageUrl = bundle.getString("imageUrl");
Log.w(getClass().toString(), imageUrl);
imageView = (SubsamplingScaleImageView) findViewById(R.id.image);
URL url = new URL(imageUrl);
URI uri = url.toURI();
imageView.setImage(ImageSource.uri(String.valueOf(uri)));
/*Picasso.with(getApplicationContext())
.load(imageUrl)
.placeholder(R.color.placeholderblue)
.memoryPolicy(MemoryPolicy.NO_CACHE).into(((SubsamplingScaleImageView) findViewById(R.id.image)));*/
}
}
Я попробовал это, и это сработало…
try {
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
imageView.setImage(ImageSource.bitmap(myBitmap);
} catch (IOException e) {
// Log exception
Log.w(getClass().toString(), e);
}
Ответ №1:
Я полагаю, я не могу просто передать SubsamplingScaleImageView URL-адрес, а?
Он не может обрабатывать http
/ https
URLs, если вы это имеете в виду.
Я думаю, я тоже не могу использовать Picasso?
Не совсем. Его роль заключается в загрузке полного растрового изображения, чего вы не хотите.
Что мне делать вместо этого?
Загрузите изображение самостоятельно, используя ваш любимый HTTP client API ( HttpUrlConnection
, OkHttp и т. Д.) В файл. Затем загрузите файл в SubsamplingScaleImageView
.
Комментарии:
1. Достаточно справедливо. Можете ли вы объяснить последний бит, как в синтаксисе для загрузки файла. Это ImageView.setImage(источник изображения. Файл (???); Что-то в этом роде?
2. @santafebound: ваш существующий код должен быть в порядке, если значение, которое вы передаете,
uri()
является URL-адресом соfile:///
схемой. Самый простой способ получить этоUri.fromFile(...).toString()
, где...
находитсяFile
объект, представляющий вашу загрузку.3. Спасибо за совет. Это сработало! Я опубликовал свой обновленный код выше.
4. @santafebound: Ну, на самом деле, ваш код загружается полностью
Bitmap
. Это будет работать только для небольших изображений. СмыслSubsamplingScaleImageView
заключается в обработке больших изображений, и в этом случае вы хотите, чтобы он загружал данные.