2013-02-01 3 views
0

Les mises à jour d'application se produisent dans l'application au démarrage. L'application vérifie sur un serveur la dernière version et télécharge sur le stockage le dernier fichier .apk si une version plus récente est disponible. L'application lance ensuite le processus de mise à jour.Les mises à jour manuelles de .apk échouant de manière aléatoire (téléchargées du serveur)

Ce qui arrive parfois est qu'après le téléchargement et en essayant d'installer la mise à jour un message apparaît. "Erreur d'analyse: un problème est survenu lors de l'analyse du package." Nous avons 60 appareils Android dans le domaine et les mises à jour fonctionnent sur la plupart d'entre eux, sauf pour environ 10 d'entre eux.

Ensuite, dans un nouveau projet qui utilise le même processus de mise à jour, des tablettes refusent de se mettre à jour avec le même message d'erreur. Cela se produit à plusieurs reprises sur la même tablette, bien que sur une autre tablette (marque différente et OS) cela fonctionne bien.

Il semble qu'il n'y ait pas de corrélation entre la marque de l'appareil ou la version du système d'exploitation. Sur la tablette que nous avons, il est évident que le fichier .apk ne télécharge pas complètement. Faire un téléchargement manuel et mise à jour à partir du navigateur Internet fonctionne bien. Donc, pour essayer de résumer sur certains périphériques le téléchargement du fichier .apk ne se termine pas et l'installation échoue. Cela pourrait-il être dû aux contraintes de bande passante réseau? Mais alors sûrement ces 10 tablettes sur le terrain devraient être mises à jour à un moment donné puisque le processus de mise à jour est démarré à chaque démarrage de l'application et je peux voir que les applications sont utilisées encore et encore mais pas mises à jour. Désolé pour la randonnée, mais il y a beaucoup d'informations que j'essaie de comprendre. Ces lignes de code ci-dessous pourraient-elles arrêter le téléchargement après 5 secondes? Quelle est la différence entre les deux délais d'attente?

HttpConnectionParams.setConnectionTimeout(httpParameters, 5000); 
HttpConnectionParams.setSoTimeout(httpParameters, 5000); 

Voici la mise à jour standard AsyncTask. Toute aide serait appréciée. Je suis un peu déconcerté en ce moment et le temps n'est pas de mon côté.

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

Répondre

0

Il a travaillé après avoir ajouté le code suivant et a également augmenté les délais d'attente à 30000 ms.

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

Hope this helps quelqu'un d'autre avec le même problème.

Questions connexes