2017-05-05 17 views
-1

HttpUrlConnectionでapkをダウンロードする際に問題が発生しました。httpUrlConnectionでダウンロードを再開するとapkがダウンロードに失敗する

約30MBのアプリを開発し、最新のバージョンを確認してダウンロードするマネージャを作成します。 サイズの関係から、接続が切断されたり、システムによってシステムがシャットダウンされた場合、ダウンロードしたファイルサイズを確認してダウンロードを再開しました。

問題は、ダウンロードプロセス全体が一度中断された場合、apkのダウンロードをインストールするときに解析エラーが発生したことです。 これはエラーメッセージです。

解析エラー:パッケージの解析中に問題が発生しました。

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がここにnullになりませんダウンロードしたファイルです:

そして、ここでは、ダウンロードの私のコードです。 StartPositionはapkfileのサイズで、apkFile.length()で取得します。 Endpositionはapkの全体のサイズでconn.getContentLength()で取得します。

修正するアイデアはありますか?ありがとう。追加モードに

FileOutputStream fileOutputStream = new FileOutputStream(aApkFile); 

変更:

+0

'FileOutputStream fileOutputStream = new FileOutputStream(aApkFile);'新しいファイルを作成します。だからあなたは以前の部分的なダウンロードを捨てるでしょう。あなたはparcelableではなかったapkが元のものより少ないバイトを持っていたことに言及しなかった。私たちに知らせてください。 – greenapps

答えて

0

あなたがして、元部分的なファイルを削除され、元とダウンロードしたファイルの

FileOutputStream fileOutputStream = new FileOutputStream(aApkFile, true); 

チェックファイルのサイズ。すべてのバイトがカウントされます!

+0

ありがとうございます。 – Cheng

+0

また、Connection.getResponseCode()をチェックする必要があることがわかりました。 私のテストでは、wifiをオフにしてしばらくしてから電源を入れると、応答コードはほとんど206になります。その応答コードでダウンロードを続行すると、apkファイルはほとんど壊れています。 'if(mConnection.getResponseCode()!= 200)を追加しました{ ;続行します。 } ' 接続が安定していることを確認してください。 – Cheng

+0

確かに。基本的なもの。 – greenapps

関連する問題