我正在开发一款壁纸应用。我编写了一个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();
}
}
错误只是一个stackTrace捕获异常,而我试图获取null对象的大小,输出。
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"/>
我没有尝试将此Image加载到任何imageView中,我将此Image发送到WallPaperManager以加载为Wallpaper。
我想指出我和Glide尝试了同样的事情并且出现了相同的结果!
答案 0 :(得分:1)
如果我是你,我会使用Picasso Library来处理所有这些问题
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
这行代码从您指定的URL下载图像并将其加载到imageView
但是你需要先在build gradle中编译它 有关详细信息,请访问library site
答案 1 :(得分:1)
(代表OP发布)。
问题是,坏的url图像太大而无法处理,因此Bitmap无声地失败。
D/skia: --- too Large Progressive Image (1, 5184 x 3456)> limit(16777216)
D/skia: --- decoder->decode returned false