アプリケーションの更新は、起動時にアプリで行われます。アプリはサーバーで最新バージョンをチェックし、新しいバージョンが利用可能な場合は最新の.apkファイルをストレージにダウンロードします。次に、アプリは更新プロセスを開始します。
アップデートをダウンロードしてインストールしようとすると、メッセージが表示されることがあります。「解析エラー。パッケージの解析に問題があります。」フィールドには60台の奇妙なAndroidデバイスがあり、そのうちの約10台を除いてほとんどのデバイスでアップデートが機能します。
次に、同じ更新プロセスを利用する新しいプロジェクトで、同じエラーメッセージで更新を拒否するタブレットがあります。これは同じタブレットで繰り返し発生しますが、別のタブレット(異なるブランドとOS)では正常に機能します。
デバイスのブランドとOSのバージョンの間に相関関係はないようです。タブレットでは、.apkファイルが完全にダウンロードされていないことは明らかです。ただし、インターネットブラウザから手動でダウンロードして更新することはできます。
そのため、一部のデバイスで要約すると、.apkファイルのダウンロードが完了せず、インストールが失敗します。これは、ネットワーク帯域幅の制約が原因である可能性がありますか?ただし、アプリケーションが起動するたびに更新プロセスが開始され、アプリが何度も使用されているが更新されていないことがわかるため、フィールドにある10個のタブレットはある時点で更新されるはずです。
とりとめのないことについては申し訳ありませんが、私が理解しようとしている情報はたくさんあります。以下のコード行は、5秒後にダウンロードを停止する可能性がありますか?2つのタイムアウトの違いは何ですか?
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, 5000);
以下は標準アップデートAsyncTask
です。どんな助けでもいただければ幸いです。私は現時点で少し困惑していて、時間は私の側にありません。
private class UpdateDownloadTask extends AsyncTask<Void, Void, String> {
HttpClient httpclient;
HttpGet httpget;
HttpResponse response;
HttpEntity httpentity;
OutputStream outputStream;
protected void onPreExecute () {
//do not lock screen or drop connection to server on login
activity.getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
//initiate progress dialogue to block user input during initial data retrieval
ProcessingDialog = ProgressDialog.show(context, "Please Wait", "Downloading Updates", true,false);
}
@Override
protected String doInBackground(Void... nothing) {
try {
//set timeouts for httpclient
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, 5000);
//setup http get
httpclient = new DefaultHttpClient(httpParameters);
httpget = new HttpGet(uriApk);
// Execute HTTP Get Request
response = httpclient.execute(httpget);
httpentity = response.getEntity();
//create location to store apk file
String path = Environment.getExternalStorageDirectory() + "/download/";
File file = new File(path);
file.mkdirs(); //if download folder not already exist
File outputFile = new File(file, apkName);
//write downloaded file to location
outputStream = new FileOutputStream(outputFile, false);
httpentity.writeTo(outputStream);
outputStream.flush();
outputStream.close();
return "success";
}
catch (Exception e) {
return "error: " + e.toString();
}
}
@Override
protected void onPostExecute(String result) {
//check if result null or empty
if (result.length() == 0 || result == null) {
Toast.makeText(context, "Could Not Download Updates, Please Try Again. Closing Application.", Toast.LENGTH_LONG).show();
activity.finish();
}
//update downloaded
if (result.equals("success")) {
//install downloaded .apk file
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + apkName)), "application/vnd.android.package-archive");
activity.startActivity(intent);
//activity.finish();
}
//update not downloaded
else {
Toast.makeText(context, "Could Not Download Updates, Please Try Again. Closing Application.", Toast.LENGTH_LONG).show();
activity.finish();
}
//close update dialog
try {
ProcessingDialog.dismiss();
} catch (Exception e) {
// nothing
}
//release screen lock
activity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}