Неисправность вручную.apk (загружается с сервера)

99
7

Обновления приложений происходят в приложении при запуске. Приложение проверяет сервер на последнюю версию и загружает для хранения последнего файла.apk, если доступна более новая версия. Затем приложение инициирует процесс обновления.

Иногда случается, что после загрузки и установки обновления появляется сообщение. "Ошибка анализа. Проблема заключается в разборе пакета". У нас есть 60 нечетных устройств Android в поле, и обновления работают на большинстве из них, за исключением примерно 10 из них.

Затем в новом проекте, который использует тот же процесс обновления, у нас есть планшеты, отказывающиеся обновлять с тем же сообщением об ошибке. Это происходит неоднократно на одном планшете, хотя на другой планшете (другой бренд и ОС) работает нормально.

По-видимому, нет никакой корреляции между маркой устройства или версией ОС. На планшете мы видим, что файл.apk не загружается полностью. Тем не менее, выполняется ручная загрузка и обновление из интернет-браузера.

Поэтому, чтобы попытаться суммировать некоторые устройства, загрузка файла.apk не завершается, и установка завершается с ошибкой. Может ли это быть из-за ограничений пропускной способности сети? Но тогда, конечно, эти 10 таблиц в поле должны обновляться в какой-то момент, так как процесс обновления запускается при каждом запуске приложения, и я вижу, что приложения используются снова и снова, но не обновляются.

Извините, что я пробовал, но есть много информации, которую я пытаюсь понять. Могут ли следующие строки кода останавливать загрузку через 5 секунд? В чем разница между двумя таймаутами?

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);
}
}

спросил(а) 2021-01-25T18:48:40+03:00 5 месяцев назад
1
Решение
63

Он работал после того, как я добавил следующий код, а также увеличил тайм-ауты до 30000 мс.

httpget.setHeader("Accept", "application/vnd.android.package-archive");
httpget.setHeader("Content-Type", "application/vnd.android.package-archive");
String userAgent = "Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1";
httpget.setHeader("User-Agent", userAgent);

Надеюсь, это поможет кому-то еще с той же проблемой.

ответил(а) 2021-01-25T18:48:40+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема