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?
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) –
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? –
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:/ –