代码之家  ›  专栏  ›  技术社区  ›  rayman

从链接下载并安装APK

  •  5
  • rayman  · 技术社区  · 14 年前

    我想从某个链接下载并安装一个apk,

    但出于某种原因,我得到了一个例外。

    我有一个方法downloadFile(),它下载文件并调用

    to和installfile()方法,该方法应该在设备中安装它。

    一些代码:

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

    这是安装文件方法:

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

    这是异常详细信息: “用户10057和当前进程都没有android.permission.install_packages”。

    我在我的主应用程序中设置了清单中的权限。

    有人知道吗?

    谢谢,

    雷。

    2 回复  |  直到 14 年前
        1
  •  6
  •   CommonsWare    14 年前

    您不能以这种方式安装APK——只有系统固件中的应用程序才能做到这一点。

    您应该能够使用 ACTION_VIEW Intent ,mime类型为 application/vnd.android.package-archive 和A Uri 指向您的文件。请注意,这可能不适用于未选中“允许非市场安装”的设备。

        2
  •  5
  •   Alex Volovoy    14 年前