2010-06-17 42 views
5

Tôi đang cố tải xuống và cài đặt gói ứng dụng từ một số liên kết,Tải xuống và cài đặt apk từ liên kết

nhưng vì một lý do nào đó, tôi có ngoại lệ.

Tôi có một phương pháp downloadFile() mà tải về các tập tin và một cuộc gọi

tới và phương pháp installFile(), mà phải cài đặt nó vào điện thoại.

một số mã:

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

và đây là phương pháp cài đặt file:

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

đây là các chi tiết ngoại lệ: "Không sử dụng 10.057 cũng không hiện quá trình có android.permission.INSTALL_PACKAGES" .

và tôi đã đặt trong ứng dụng chính của tôi có quyền trong tệp kê khai.

có ai có ý tưởng gì không?

cảm ơn,

ray.

+0

mã của bạn quá vụng về, không cần phải nắm bắt nhiều ngoại lệ, chúng chỉ nên được sử dụng trong trường hợp Đặc biệt –

Trả lời

6

Bạn không thể cài đặt APK cách - chỉ ứng dụng mà là một phần của chương trình cơ sở hệ thống có thể làm điều đó.

Bạn sẽ có thể sử dụng ACTION_VIEWIntent, với loại MIME là application/vnd.android.package-archiveUri trỏ đến tệp của bạn. Lưu ý rằng điều này có thể không hoạt động trên các thiết bị không có "cho phép cài đặt không phải Market" được chọn.

+0

Việc tải xuống và lưu truy xuất cũng sai? có cách nào để lưu tệp không có trên SDCARD không? hoặc mybe làm một cái gì đó như lưu, cài đặt, xóa? Bạn có thể làm một số ví dụ về giải pháp này không? Cảm ơn. – rayman

+0

Ive đã làm được điều đó, cảm ơn! nhưng câu hỏi chung: trong đó dòng trong câu hỏi của tôi tôi coudlnt sử dụng (trừ khi các ứng dụng trong phần vững)? – rayman

+0

@rayman: Bạn không thể gọi 'installPackage()'. Nhưng bạn đã biết điều đó rồi, vì đó là nơi mà 'SecurityException' của bạn là, nên tôi đoán tôi không hiểu câu hỏi tiếp theo của bạn. – CommonsWare

Các vấn đề liên quan