Android 从服务器下载的应用程序内更新不工作。服务提供商错误?
我正在开发一个独立于Android Play Store进行更新的应用程序。启动时,它会检查更新版本,并在需要时从服务器下载新的.apk文件 问题是HTTP请求执行的.apk文件下载url被重定向到沃达丰登录页,请求更改移动互联网设置。应用程序下载的.apk文件实际上就是这个html网页 通过android internet浏览器访问任何网站都不会重定向到此页面。主机服务器上的“我的MIME设置”已正确设置。我在另一个项目上使用相同的代码,托管提供商和移动运营商没有任何问题,尽管该项目在OS 3.2上运行东芝平板电脑,而该项目是OS 4.1上的三星平板电脑 我可以测试或更改什么以使其正常工作,或者它是运营商或平板电脑/操作系统相关的问题?任何帮助都将不胜感激。如果有人想检查它,下面会包含相关代码,但正如前面提到的,我在另一个项目中没有问题Android 从服务器下载的应用程序内更新不工作。服务提供商错误?,android,download,apk,auto-update,Android,Download,Apk,Auto Update,我正在开发一个独立于Android Play Store进行更新的应用程序。启动时,它会检查更新版本,并在需要时从服务器下载新的.apk文件 问题是HTTP请求执行的.apk文件下载url被重定向到沃达丰登录页,请求更改移动互联网设置。应用程序下载的.apk文件实际上就是这个html网页 通过android internet浏览器访问任何网站都不会重定向到此页面。主机服务器上的“我的MIME设置”已正确设置。我在另一个项目上使用相同的代码,托管提供商和移动运营商没有任何问题,尽管该项目在OS
private class UpdateDownloadTask extends AsyncTask<Void, Void, String> {
HttpClient httpclient;
HttpGet httpget;
HttpResponse response;
HttpEntity httpentity;
OutputStream outputStream;
protected void onPreExecute () {
//do not lock screen or drop connection to server on login
activity.getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
//initiate progress dialogue to block user input during initial data retrieval
ProcessingDialog = ProgressDialog.show(context, "Please Wait", "Downloading Updates", true,false);
}
@Override
protected String doInBackground(Void... nothing) {
try {
//set timeouts for httpclient
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, 5000);
//setup http get
httpclient = new DefaultHttpClient(httpParameters);
httpget = new HttpGet(uriApk);
// Execute HTTP Get Request
response = httpclient.execute(httpget);
httpentity = response.getEntity();
//create location to store apk file
String path = Environment.getExternalStorageDirectory() + "/download/";
File file = new File(path);
file.mkdirs(); //if download folder not already exist
File outputFile = new File(file, apkName);
//write downloaded file to location
outputStream = new FileOutputStream(outputFile, false);
httpentity.writeTo(outputStream);
outputStream.flush();
outputStream.close();
return "success";
}
catch (Exception e) {
return "error: " + e.toString();
}
}
@Override
protected void onPostExecute(String result) {
//check if result null or empty
if (result.length() == 0 || result == null) {
Toast.makeText(context, "Could Not Download Updates, Please Try Again. Closing Application.", Toast.LENGTH_LONG).show();
activity.finish();
}
//update downloaded
if (result.equals("success")) {
//install downloaded .apk file
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + apkName)), "application/vnd.android.package-archive");
activity.startActivity(intent);
//activity.finish();
}
//update not downloaded
else {
Toast.makeText(context, "Could Not Download Updates, Please Try Again. Closing Application.", Toast.LENGTH_LONG).show();
activity.finish();
}
//close update dialog
try {
ProcessingDialog.dismiss();
} catch (Exception e) {
// nothing
}
//release screen lock
activity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
私有类UpdateDownloadTask扩展了AsyncTask{
HttpClient-HttpClient;
HttpGet-HttpGet;
HttpResponse响应;
HttpEntity HttpEntity;
输出流输出流;
受保护的void onPreExecute(){
//登录时不要锁定屏幕或断开与服务器的连接
activity.getWindow().addFlags(LayoutParams.FLAG\u保持屏幕打开);
//在初始数据检索期间启动进度对话以阻止用户输入
ProcessingDialog=ProgressDialog.show(上下文“请稍候”,“下载更新”,true,false);
}
@凌驾
受保护的字符串doInBackground(无效…无){
试一试{
//设置httpclient的超时
HttpParams httpParameters=新的BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters,5000);
HttpConnectionParams.setSoTimeout(httpParameters,5000);
//设置http获取
httpclient=新的默认httpclient(httpParameters);
httpget=新的httpget(uriApk);
//执行HTTP Get请求
response=httpclient.execute(httpget);
httpentity=response.getEntity();
//创建存储apk文件的位置
String path=Environment.getExternalStorageDirectory()+“/download/”;
文件=新文件(路径);
file.mkdirs();//如果下载文件夹不存在
File outputFile=新文件(文件,apkName);
//将下载的文件写入位置
outputStream=新文件outputStream(outputFile,false);
httpentity.writeTo(outputStream);
outputStream.flush();
outputStream.close();
返回“成功”;
}
捕获(例外e){
return“error:+e.toString();
}
}
@凌驾
受保护的void onPostExecute(字符串结果){
//检查结果是否为null或空
if(result.length()=0 | | result==null){
Toast.makeText(上下文,“无法下载更新,请重试。关闭应用程序。”,Toast.LENGTH_LONG.show();
activity.finish();
}
//下载更新
如果(结果等于(“成功”)){
//安装下载的.apk文件
意向意向=新意向(意向.行动\视图);
setDataAndType(Uri.fromFile(新文件(Environment.getExternalStorageDirectory()+“/download/”+apkName)),“application/vnd.android.package archive”);
活动。开始触觉(意图);
//activity.finish();
}
//更新未下载
否则{
Toast.makeText(上下文,“无法下载更新,请重试。关闭应用程序。”,Toast.LENGTH_LONG.show();
activity.finish();
}
//关闭更新对话框
试一试{
ProcessingDialog.discouse();
}捕获(例外e){
//没什么
}
//释放屏幕锁
activity.getWindow().clearFlags(LayoutParams.FLAG\u保持屏幕打开);
}
}
我必须通过Android互联网浏览器将运营商设置为“不调整任何网站”。之后,我添加了以下代码以使其正常工作
httpget.setHeader("Accept", "application/vnd.android.package-archive");
httpget.setHeader("Content-Type", "application/vnd.android.package-archive");
String userAgent = "Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1";
httpget.setHeader("User-Agent", userAgent);
希望这能帮助其他有同样问题的人