2010-06-17 9 views
5

Próbuję pobrać i zainstalować apk z linku,Pobierz i zainstaluj apk z linku

, ale z jakiegoś powodu otrzymuję wyjątek.

Mam jednej metody downloadfile(), które pobierając plik i połączenia

do metody installfile(), która ma go zainstalować w urządzeniu.

jakiś kod:

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

i jest to metoda zainstalować plik:

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

to szczegóły wyjątek: "Żaden użytkownik 10.057 ani obecny proces ma android.permission.INSTALL_PACKAGES" .

i ustawiłem w mojej głównej aplikacji to uprawnienie w manifeście.

ktoś ma jakiś pomysł?

dziękuję,

promień.

+0

Twój kod jest zbyt niezręczny, nie ma potrzeby wychwytywania tak wielu wyjątków, powinny być używane tylko w wyjątkowych przypadkach. –

Odpowiedz

6

Nie można instalować pliki APK sposób - tylko aplikacje, które są częścią oprogramowania systemowego może to zrobić.

powinny mieć możliwość korzystania z ACTION_VIEWIntent, o typie MIME application/vnd.android.package-archive i Uri skierowaną do pliku. Zauważ, że to może nie działać na urządzeniach, które nie mają zaznaczonej opcji "zezwalaj na instalacje inne niż rynkowe".

+0

Czy proces pobierania i zapisywania jest również nieprawidłowy? Czy jest jakiś sposób na zapisanie pliku nie na karcie SD? lub mybe zrobić coś takiego jak zapisać, zainstalować, usunąć? Czy mógłbyś przekroczyć przykład tego rozwiązania? Dzięki. – rayman

+0

Ive udało się to zrobić, dzięki! ale ogólne pytanie: w której linii w moim pytaniu mogę coudlnt użyć (chyba że aplikacja jest w oprogramowaniu)? – rayman

+0

@rayman: Nie można wywołać metody 'installPackage()'. Ale już to wiedziałeś, ponieważ to tam był twój "SecurityException", więc domyślam się, że nie rozumiem twojego pytania uzupełniającego. – CommonsWare

Powiązane problemy