2017-02-24 47 views
0

我正在做壁紙應用。我已經寫了一個AsyncTask來從選定的URL下載照片並將其加載爲牆紙(全部在後臺)。現在,有時AsyncTask函數。而且,我自己無法理解無法從URL加載/下載圖像(以位圖的形式)的原因。 url(好的和壞的)都在瀏覽器上運行並加載正確的圖像。無法從Android載入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 ,我將這張圖片發送到牆上PaperManager加載爲牆紙。

我想指出的是,我用Glide試過同樣的事情,並且出現了相同的結果!

+0

一點的話 - 你並不需要設置setDoInput(真)爲你加載這些URL獨立或順序此值默認爲 – j2ko

+0

真。你嘗試改變順序嗎? – j2ko

+0

@ j2ko,謝謝。並沒有特定的順序。好的網址總是加載照片,而糟糕的網址永不加載照片。 –

回答

1

如果我是你,我會用畢加索庫來處理這一切 Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 這行代碼下載的URL從圖像ü說明並ImageView的

加載它,但你首先需要編譯它in build gradle 欲瞭解更多詳情,請訪問library site

+0

畢加索是否將圖像作爲位圖加載到WallpaperManager類中。原因是,我沒有在任何imageView中加載圖像,我直接將它作爲位圖投影到WallPaperManager以設置爲牆紙。 –

+1

你可以訪問這個,如果你有興趣,你可以在 找到它[第二回答] [1] [1]:http://stackoverflow.com/questions/20181491/use-picasso-to-get-a-用位圖回調 – 2017-02-24 15:23:23

1

(發佈代表OP)

問題是,不好的url圖像太大,無法處理,所以位圖失敗默默。

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

是的。我知道。謝謝。 –