【问题标题】:Unable to load photos from URL in Android无法从 Android 中的 URL 加载照片
【发布时间】:2017-07-15 11:15:07
【问题描述】:

我正在开发壁纸应用程序。我编写了一个 AsyncTask 来从选定的 url 下载照片并将其加载为墙纸(全部在背景中)。现在,AsyncTask 有时会起作用。而且我自己无法理解无法从 URL 加载/下载图像(作为位图)的原因。两个 url(好的和坏的)都在工作并在浏览器上加载正确的图像。

我的 AsyncTask 类:

@Override
protected Void doInBackground(String... params) {
    Bitmap output = null;
    try {
        URL url = new URL(params[0]);
        Log.d(TAG, "_log: output URL is: "+url.toString());

        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream inputStream = connection.getInputStream();
        output = BitmapFactory.decodeStream(inputStream);

        Log.d(TAG, "_log: output size "+output.getByteCount());
    } catch (MalformedURLException e) {
        e.printStackTrace();
        Log.d(TAG, "_log: output with MalformedURLException "+e.toString());
    } catch (IOException e) {
        Log.d(TAG, "_log: output with IOException "+e.toString());
        e.printStackTrace();
    } catch (Exception e) {
        Log.d(TAG, "_log: output with Exception "+e.toString());
        e.printStackTrace();
    } finally {
        if (output != null) util.setupWallpaper(context, output);
        else Log.d(TAG, "_log: output is null");
    }
    return null;
}

setupWallpaper 函数是:

public void setupWallpaper(Context context, Bitmap image) {
    WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);
    try {
        if (image == null) {
            makeToast(context, "Image is null!");
        } else {
            wallpaperManager.setBitmap(image);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

当我试图获取空对象的大小时,错误只是一个堆栈跟踪异常,输出。

output with Exception java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getByteCount()' on a null object reference

RetrieveFeed.doInBackground(RetrieveFeed.java:57)
RetrieveFeed.doInBackground(RetrieveFeed.java:27)

权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>

我没有尝试将此图像加载到任何 imageView 中,而是将此图像发送到 WallPaperManager 以作为墙纸加载。

我想指出,我用 Glide 尝试了同样的事情并且出现了同样的结果!

【问题讨论】:

  • 小提示 - 你不需要设置 setDoInput(true) 因为这个值默认为真
  • 你为什么不试试Picaso 而不是用 AsyncTask 来做呢?
  • 您是独立加载还是按顺序加载这些 URL。您是否尝试更改订单?
  • 那么您需要将您的解决方案与以下developer.android.com/topic/performance/graphics/…结合起来
  • @VadimKotov,对不起,伙计。自2016年以来我一直没有从事android开发。但我认为您不应该在移动端转换图像。后端开发者必须要么压缩图像,要么给你两个或三个 URL,如 HD、720 和 480,这样你就可以加载任何你想要的。尝试在移动端压缩图片,会给设备带来压力,并且在不同的设备类型上会得到不可预知的结果。

标签: java android exception android-asynctask


【解决方案1】:

(代表 OP 发布)

问题是,坏的 url 图像太大而无法处理,所以 Bitmap 会默默地失败。

D/skia: --- too Large Progressive Image (1, 5184 x 3456)> limit(16777216)
D/skia: --- decoder->decode returned false

【讨论】:

    【解决方案2】:

    如果我是你,我会使用毕加索图书馆来处理所有这些

    Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
    

    这行代码从你指定的 URL 下载图片并加载到 imageView 中。

    但你需要先在 build.gradle 中编译它。
    更多详情请访问library site

    【讨论】:

    • 毕加索是否将图像作为位图加载到 WallpaperManager 类。原因,我没有在任何imageView中加载图像,我直接将其作为位图扔给WallPaperManager以设置为墙纸。
    • 如果你有兴趣可以访问这个你在[第二个答案][1] [1]中找到它:stackoverflow.com/questions/20181491/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多