Android 从服务器下载的应用程序内更新不工作。服务提供商错误?

Android 从服务器下载的应用程序内更新不工作。服务提供商错误?,android,download,apk,auto-update,Android,Download,Apk,Auto Update,我正在开发一个独立于Android Play Store进行更新的应用程序。启动时,它会检查更新版本,并在需要时从服务器下载新的.apk文件 问题是HTTP请求执行的.apk文件下载url被重定向到沃达丰登录页,请求更改移动互联网设置。应用程序下载的.apk文件实际上就是这个html网页 通过android internet浏览器访问任何网站都不会重定向到此页面。主机服务器上的“我的MIME设置”已正确设置。我在另一个项目上使用相同的代码,托管提供商和移动运营商没有任何问题,尽管该项目在OS

我正在开发一个独立于Android Play Store进行更新的应用程序。启动时,它会检查更新版本,并在需要时从服务器下载新的.apk文件

问题是HTTP请求执行的.apk文件下载url被重定向到沃达丰登录页,请求更改移动互联网设置。应用程序下载的.apk文件实际上就是这个html网页

通过android internet浏览器访问任何网站都不会重定向到此页面。主机服务器上的“我的MIME设置”已正确设置。我在另一个项目上使用相同的代码,托管提供商和移动运营商没有任何问题,尽管该项目在OS 3.2上运行东芝平板电脑,而该项目是OS 4.1上的三星平板电脑

我可以测试或更改什么以使其正常工作,或者它是运营商或平板电脑/操作系统相关的问题?任何帮助都将不胜感激。如果有人想检查它,下面会包含相关代码,但正如前面提到的,我在另一个项目中没有问题

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); 
希望这能帮助其他有同样问题的人