我正在构建一个私有企业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 及更高版本上)。
就下载逻辑而言,一次下载一个字节不太可能表现良好。尝试这样的事情(对于名为 output
的File
和名为 url
的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();
}
感谢大家在这里的帮助。我通过在服务器上打开 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);
}