2011-05-30 2 views
0

J'ai une application hébergée sur SourceForge (https://sourceforge.net/projects/pokedroid/). J'ai décidé d'ajouter un bouton pour télécharger la dernière version de l'application directement à partir du serveur CVS. Le .apk se télécharge correctement, mais lorsque j'essaye de l'installer, le programme d'installation du paquet donne une erreur "can not parse package". Le code que j'utilise:Impossible d'installer .apk à partir de l'application

private class DownloadAndInstall extends AsyncTask<String, Integer, Boolean> 
{ 
    protected Boolean doInBackground(String... derp) 
    { 
     String ur=derp[0]; 
     String fileName=derp[1]; 
     ByteArrayBuffer baf = new ByteArrayBuffer(50); 

     try 
     { 
      URL url = new URL(ur); 
      URLConnection ucon = null; 
      ucon = url.openConnection(); 

      InputStream is = ucon.getInputStream(); 
      BufferedInputStream bis = new BufferedInputStream(is); 

      int current = 0; 
      int updateCount=0; 
      while ((current = bis.read()) != -1) 
      { 
       if(updateCount==256) 
       { 
        publishProgress(baf.length()); 
        updateCount=0; 
       } 
       baf.append((byte) current); 
       updateCount++; 
      } 

      FileOutputStream fos = PokeDroid.openFileOutput(fileName, Context.MODE_WORLD_READABLE); 
      fos.write(baf.toByteArray()); 
      fos.close(); 

     } catch (Exception e) { 
      Log.e("pokedroid", e.toString()); 
     } 

     MessageDigest digest = null; 
     try { 
      digest = java.security.MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      Log.e("pokedroid", e.toString()); 
     } 
     digest.update(baf.toByteArray()); 
     byte[] h = digest.digest(); 

     if(baf.length()==0) 
      return null; 
     String[] fileList=fileList(); 
     boolean exists=false; 
     for(String i:fileList) 
      if(i.equals("updatehash.md5")) 
       exists=true; 

     String newHash=new String(h); 
     Log.e("pokedroid", "new="+newHash); 

     if(exists) 
     { 
      try 
      { 
       String oldHash=loadObject("updatehash.md5"); 
       Log.e("pokedroid", "old="+oldHash); 
       if(oldHash.equals(newHash)) 
        return false; 
       else 
        saveObject(newHash, "updatehash.md5"); 
      } 
      catch (Exception e) 
      { 
       Log.e("pokedroid",e.toString()); 
      } 
     } 
     else 
     { 
      try { 
       saveObject(newHash, "updatehash.md5"); 
      } catch (IOException e) { 
       Log.e("pokedroid",e.toString()); 
      } 
     } 
     return true; 
    } 

    protected void onProgressUpdate(Integer...integers) 
    { 
     p.setMessage("Downloading update...\n"+integers[0]/1000+"kb downloaded so far."); 
    } 

    protected void onPostExecute(Boolean b) 
    { 
     if(b==null) 
     { 
      noConnection.show(); 
      deleteFile("PokeDroid.apk"); 
      p.dismiss(); 
      return; 
     } 
     if(!b) 
      noNewUpdate.show(); 
     else 
     { 
      Intent intent=new Intent(); 
      intent.setAction(android.content.Intent.ACTION_VIEW); 
      intent.setDataAndType(Uri.parse("file:///data/data/com.games.pokedroid/files/PokeDroid.apk"), "application/vnd.android.package-archive"); 
      startActivity(intent); 
      deleteFile("PokeDroid.apk"); 
     } 
     p.dismiss(); 
    } 

    public void saveObject(String obj, String filename) throws IOException 
    { 
     FileOutputStream fos = openFileOutput(filename,Context.MODE_PRIVATE); 
     ObjectOutputStream out = new ObjectOutputStream(fos); 
     out.writeObject(obj); 
     out.close(); 
     fos.close(); 
    } 

    public String loadObject(String filename) throws StreamCorruptedException, IOException, ClassNotFoundException 
    { 
     FileInputStream fis=openFileInput(filename); 
     ObjectInputStream in=new ObjectInputStream(fis); 
     String out=(String) in.readObject(); 
     in.close(); 
     fis.close(); 
     return out; 
    } 
} 

Ceci est une sous-classe dans mon activité, bien sûr. Qu'est-ce que je fais mal?

+0

Vous devez vous assurer que vous créez et tentez d'ACTION_VIEW le même fichier. Et le fait de coder en dur un chemin absolu dans le stockage privé de votre application me semble constituer des hypothèses injustifiées. Si vous voulez rendre le monde lisible de toute façon, pourquoi ne pas simplement mettre sur la carte SD? (bon, d'accord, oui, cela le rend non seulement lisible mais plus facile à trouver - mais cela peut vous aider à régler le problème) –

+0

Salut notverycreative, Je veux faire la même chose que vous avez fait, mais après startActivityForResult (intention) ; il me donne l'erreur que "Il y avait un problème d'analyse du paquet". Pouvez-vous m'aider s'il vous plaît dans ceci? –

+0

Il peut y avoir un problème avec le package (par exemple, incorrectement signé, endommagé lors du transfert, etc.). Si ce n'est pas ça, honnêtement je ne sais pas; Je n'ai rien fait de plus avec Android depuis que j'ai posté cette question il y a environ un an. Vous voudrez peut-être poser une nouvelle question à la place. Désolé si je ne suis pas très utile:/ –

Répondre

3

Je peux voir un problème dans votre code:

startActivity(intent); 
deleteFile("PokeDroid.apk"); 

Ce code envoie l'intention et supprime le fichier. Notez que startActivity est une fonction asynchrone. C'est à dire. il envoie la demande, mais n'attend pas la fin de cette requête. Ainsi, lorsque l'intention est réellement reçue par l'activité de l'installateur d'application (appelons-le ainsi), votre fichier .apk a déjà été supprimé par vous.

Comment fixer:

Vous devez remplacer ces deux lignes de code avec:

startActivityForResult(intent); 

Et puis en onActivityResult fonction:

deleteFile("PokeDroid.apk"); 
+0

Oh, wow, je ne peux pas croire que j'ai raté ça. Je vais donner un coup de feu. –

+0

Yup, a travaillé comme un charme! Je vous remercie! –

1

Avez-vous vérifié que votre téléphone portable est configuré pour accepter les applications tierces?

est l'apk signé?

+1

C'est probablement le problème. Une version non signée ne remplacera jamais une version signée. Et puis bien sûr aussi la 3ème partie. ;) – Eric

Questions connexes