下载apk并在安卓应用程序中开始安装提示



我正在构建一个私有企业Android应用程序。我的目标是检测何时有可用更新并为用户提供下载。如果用户选择下载更新文件,则下载并显示android应用程序安装提示。

我成功检查更新,问题是apk文件未下载(创建空文件),因此"解析包时出现问题"错误显示在Android应用程序安装提示中。

法典:

public void downloadfileto(String fileurl, String filename) { 
    String myString; 
    try { 
            FileOutputStream f = new FileOutputStream(filename); 
            try { 
                    URL url = new URL(fileurl); 
                    URLConnection urlConn = url.openConnection(); 
                    InputStream is = urlConn.getInputStream(); 
                    BufferedInputStream bis = new BufferedInputStream(is, 8000); 
                    int current = 0; 
                    while ((current = bis.read()) != -1) { 
                            f.write((byte) current); 
                    } 
            } catch (Exception e) { 
                    myString = e.getMessage(); 
            } 
            f.flush(); 
            f.close(); 
            install(filename);
    } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
    } catch (IOException e) { 
            e.printStackTrace(); 
    } 
} 
protected void install(String fileName) {
    Intent install = new Intent(Intent.ACTION_VIEW);
    install.setDataAndType(Uri.fromFile(new File(fileName)),
            "application/vnd.android.package-archive");
    startActivity(install);
}

函数 downloadfileto 的调用方式为:

downloadfileto("http://some-url/ind.apk", "data/data/my.package.name/app.apk");

即使您成功下载,也无法安装APK文件,因为安装程序进程将无法读取该文件。此外,正如 Chris Stratton 指出的那样,您的硬编码路径是草率的(在 Android 4.1 及更早版本上)和灾难性的(在 Android 4.2 及更高版本上)。

就下载逻辑而言,一次下载一个字节不太可能表现良好。尝试这样的事情(对于名为 outputFile和名为 urlURL):

  HttpURLConnection c=(HttpURLConnection)url.openConnection();
  c.setRequestMethod("GET");
  c.setReadTimeout(15000);
  c.connect();
  FileOutputStream fos=new FileOutputStream(output.getPath());
  BufferedOutputStream out=new BufferedOutputStream(fos);
  try {
    InputStream in=c.getInputStream();
    byte[] buffer=new byte[8192];
    int len=0;
    while ((len=in.read(buffer)) > 0) {
      out.write(buffer, 0, len);
    }
    out.flush();
  }
  finally {
    fos.getFD().sync();
    out.close();
  }
我要

感谢大家在这里的帮助。我通过在服务器上打开 php 脚本来解决问题,该脚本使用 web 视图计算下载、检测下载、下载路径和启动安装应用程序的活动。

文件名始终采用"ind-version.apk"的形式(例如:ind-1-0.apk),并且由于我在检查更新时获得了新更新的版本号,因此我决定将其放入附加内容中并使用它来确定文件名。

法典:

    WebView myWebView = (WebView) findViewById(R.id.helpview);
    showDialog();
    myWebView.setWebViewClient(new WebViewClient());
    myWebView.loadUrl(url);
    myWebView.getSettings().setJavaScriptEnabled(false);
    myWebView.setWebViewClient(new WebViewClient() {
         @Override  
         public void onPageFinished(WebView view, String url) {
             super.onPageFinished(view, url);
             dismissDialog();
         }  
    });
    myWebView.setDownloadListener(new DownloadListener() {
        public void onDownloadStart(String url, String userAgent,
                String contentDisposition, String mimetype,
                long contentLength) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(url));
            startActivity(intent);
            Bundle extras = getIntent().getExtras();
            String v = extras.getString("v");
            v = v.replace(".", "-");
            Log.i("File", v);
            File loc = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
            Log.i("File", loc.toString() + "/ind-" + v + ".apk");
            install(loc.toString() + "/ind-" + v + ".apk");
        }
    });

并安装:

protected void install(String fileName) {
    Intent install = new Intent(Intent.ACTION_VIEW);
    install.setDataAndType(Uri.fromFile(new File(fileName)),
            "application/vnd.android.package-archive");
    startActivity(install);
}

相关内容

  • 没有找到相关文章