2010-06-17 4 views
5

I`am essayant de télécharger et d'installer un apk de quelque lien,Télécharger et installer apk d'un lien

mais pour une raison que je reçois une exception.

J'ai une méthode DownloadFile() qui le téléchargement du fichier et un appel

à et méthode installFile(), qui devait l'installer dans l'appareil.

du code:

public void downloadFile() 
{ 
    String fileName = "someApplication.apk"; 
    MsgProxyLogger.debug(TAG, "TAG:Starting to download"); 
    try 
    { 

     URL u = new URL(
       "http://10.122.233.22/test/someApplication.apk"); 

     try 
     { 
      HttpURLConnection c = (HttpURLConnection) u.openConnection(); 

      try 
      { 
       c.setRequestMethod("GET"); 
       c.setDoOutput(true); 

       try 
       { 
        c.connect(); 


        FileOutputStream f = context.openFileOutput(fileName, 
          context.MODE_WORLD_READABLE); 

        try 
        { 
         InputStream in = c.getInputStream(); 

         byte[] buffer = new byte[1024]; 
         int len1 = 0; 
         int totsize = 0; 
         try 
         { 
          while ((len1 = in.read(buffer)) > 0) 
          { 
           totsize += len1; 
           f.write(buffer, 0, len1);// .write(buffer); 
          } 
         } catch (IOException e) 
         { 
          e.printStackTrace(); 
         } 
         f.close(); 
         MsgProxyLogger.debug(TAG, TAG 
           + ":Saved file with name: " + fileName); 

            InstallFile(fileName); 


        } catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 

       } catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 

      } catch (ProtocolException e) 
      { 
       e.printStackTrace(); 
      } 
     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

    } catch (MalformedURLException e) 
    { 
     e.printStackTrace(); 
    } 
} 

et c'est la méthode de fichier d'installation:

private void InstallFile(String fileName) 
{ 
    MsgProxyLogger.debug(TAG, TAG + ":Installing file " + fileName); 

    String src = String.format(
      "file:///data/data/com.test/files/", 
      fileName); 

    Uri mPackageURI = Uri.parse(src); 
    PackageManager pm = context.getPackageManager(); 

    int installFlags = 0; 
    try 
    { 
     PackageInfo pi = pm.getPackageInfo("com.mirs.agentcore.msgproxy", 
       PackageManager.GET_UNINSTALLED_PACKAGES); 
     if (pi != null) 
     { 
      MsgProxyLogger.debug(TAG, TAG + ":replacing " + fileName); 

      installFlags |= PackageManager.REPLACE_EXISTING_PACKAGE; 
     } 
    } catch (NameNotFoundException e) 
    { 
    } 

    try 
    { 
     // PackageInstallObserver observer = new PackageInstallObserver(); 
     pm.installPackage(mPackageURI); 
    } catch (SecurityException e) 
    { 
         //!!!!!!!!!!!!!here i get an security exception!!!!!!!!!!! 
     MsgProxyLogger.debug(TAG, TAG + ":not permission? " + fileName); 
    } 

ce sont les détails d'exception: "Ni l'utilisateur ni processus 10057 en cours a android.permission.INSTALL_PACKAGES" .

et j'ai mis dans mon application principale cette autorisation dans le manifeste.

quelqu'un a une idée?

merci,

ray.

+0

votre code est trop maladroit, il n'y a pas besoin d'attraper autant d'exceptions, ils devraient être utilisés uniquement dans des cas exceptionnels –

Répondre

6

Vous ne pouvez pas installer APK de cette façon - seules les applications qui font partie du firmware du système peut le faire.

Vous devriez être en mesure d'utiliser un ACTION_VIEWIntent, avec un type MIME de application/vnd.android.package-archive et un Uri pointant vers votre fichier. Notez que cela peut ne pas fonctionner sur les périphériques qui n'ont pas "Autoriser les installations non-Market" cochées.

+0

Le processus de téléchargement et de sauvegarde est-il également incorrect? existe-t-il un moyen d'enregistrer le fichier pas sur la carte SD? ou mybe faire quelque chose comme enregistrer, installer, supprimer? Pourriez-vous s'il vous plaît passé un exemple de cette solution? Merci. – rayman

+0

Ive a réussi à le faire, merci! mais la question générale: dans quelle ligne dans ma question je peux utiliser (à moins que l'application est dans le firmware)? – rayman

+0

@rayman: Vous ne pouvez pas appeler 'installPackage()'. Mais vous le saviez déjà, puisque c'est là que votre 'SecurityException' était, donc je suppose que je n'ai pas compris votre question de suivi. – CommonsWare

Questions connexes