0

AndroidPlayストアとは別に更新するアプリを開発しています。起動時に、新しいバージョンをチェックし、必要に応じてサーバーから新しい.apkファイルをダウンロードします。

問題は、HTTPリクエストによって実行された.apkファイルのダウンロードURLが、モバイルインターネット設定の変更を要求するVodafoneランディングページにリダイレクトされることです。アプリによってダウンロードされた.apkファイルは、実際にはこのhtmlWebページです。

ここに画像の説明を入力してください

Androidインターネットブラウザを介してWebサイトにアクセスしても、このページにリダイレクトされることはありません。ホスティングサーバーのMIME設定が正しく設定されています。別のプロジェクトで同じコード、ホスティングプロバイダー、携帯電話会社を問題なく使用していますが、そのプロジェクトはOS 3.2でToshibaタブレットを実行しており、このプロジェクトはOS4.1でSamsungタブレットです。

それを機能させるために何をテストまたは変更できますか、それともキャリアまたはタブレット/ 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);
}
}
4

1 に答える 1

1

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); 

これが同じ問題を抱えている他の誰かに役立つことを願っています。

于 2013-02-04T13:20:30.560 に答える