2017-05-05 3 views
-1

Ich triff ein Problem beim Download apk mit HttpUrlConnection.Download apk gescheitert, wenn Lebenslauf Download mit httpUrlConnection

Ich entwickle eine App über 30MB, und ich erstelle einen Manager, um die neueste Version zu überprüfen und herunterzuladen. Aufgrund seiner Größe habe ich die heruntergeladene Dateigröße überprüft und den Download fortgesetzt, wenn die Verbindung unterbrochen wurde oder die App vom System heruntergefahren wurde.

Das Problem ist, dass ein Parse-Fehler bei der Installation von download apk aufgetreten ist, wenn der gesamte Download-Prozess einmal unterbrochen wurde. Dies ist die Fehlermeldung:

Parse-Fehler: Es gab ein Problem bei der Analyse des Pakets.

Und hier ist mein Code des Herunterladens:

private File downloadApk(File aApkFile, String aUrl, long aStartPosition, long aEndPosition) { 
    try { 
     URL url = new URL(aUrl); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setConnectTimeout(5 * 1000); 
     conn.setReadTimeout(5 * 1000); 
     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("Connection", "Keep-Alive"); 
     conn.setRequestProperty("Range", StringFormatter.format("bytes=%s-", aStartPosition)); 
     conn.connect(); 
     sendUpdateNotification(0, 100); // update notifaction info 
     InputStream inputStream = conn.getInputStream(); 
     FileOutputStream fileOutputStream = new FileOutputStream(aApkFile); 

     int currentPercent = 0; 
     long currentDownloadSize = aStartPosition; 
     byte readBuffer[] = new byte[1024 * 10]; 
     int byteReadSize = 0; 
     while (!((byteReadSize = inputStream.read(readBuffer)) <= 0)) { 
      fileOutputStream.write(readBuffer, 0, byteReadSize); 
      currentDownloadSize += byteReadSize; 
      int index = (int) (currentDownloadSize * 100/aEndPosition); 
      if (index != currentPercent) { 
       currentPercent = index; 
       sendUpdateNotification(currentPercent, 100); 
      } 
     } 
     fileOutputStream.close(); 
     inputStream.close(); 
     conn.disconnect(); 
     return aApkFile; 
    } catch (MalformedURLException aE) { 
     aE.printStackTrace(); 
     Log.e("Version", aE.getMessage()); 
    } catch (IOException aE) { 
     aE.printStackTrace(); 
     Log.e("Version", aE.getMessage()); 
    } 
    return null; 
} 

ApkFile ist die heruntergeladene Datei, die hier nicht null sein wird. StartPosition ist die Größe der Apk-Datei und wird von apkFile.length() abgerufen. Endposition ist die gesamte Größe von apk und get von conn.getContentLength().

Gibt es irgendwelche Ideen, um es zu beheben? Vielen Dank.

+0

'FileOutputStream fileOutputStream = neuer FileOutputStream (aApkFile);' Sie erstellen dort eine neue Datei. Sie würden also einen früheren partiellen Download wegwerfen. Du hast nicht erwähnt, dass die apk, die nicht parzellierbar war, weniger Bytes als die ursprüngliche hatte. Bitte informieren Sie uns. – greenapps

Antwort

0

Sie löschen eine frühere Teildatei mit:

FileOutputStream fileOutputStream = new FileOutputStream(aApkFile); 

Wechsel zum Anfügen-Modus:

FileOutputStream fileOutputStream = new FileOutputStream(aApkFile, true); 

überprüfen Dateigröße von Original und heruntergeladene Datei. Jedes Byte zählt!

+0

Danke, es funktioniert. – Cheng

+0

Außerdem habe ich festgestellt, dass Connection.getResponseCode() überprüft werden sollte. In meinem Test, wenn ich WiFi ausschalten und es nach einer Weile einschalten, sind die Response-Code meist 206. Und wenn Download mit diesem Response-Code fortsetzen, sind die apk-Datei meist gebrochen. Also fügte ich 'if (mConnection.getResponseCode()! = 200) { weiter; } ' , um sicherzustellen, dass die Verbindung stabil ist. – Cheng

+0

In der Tat. Grundlegende Sachen. – greenapps