1

我正在构建一个私有企业 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");
4

2 回答 2

1

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

就下载逻辑而言,一次下载一个字节的性能不太可能很好。尝试这样的事情(对于File命名outputURL命名url):

  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();
  }
于 2012-12-09T18:31:01.353 回答
1

我要感谢大家在这里的帮助。我通过在服务器上打开 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);
}
于 2012-12-09T19:50:53.163 回答