0

アプリケーションの更新は、起動時にアプリで行われます。アプリはサーバーで最新バージョンをチェックし、新しいバージョンが利用可能な場合は最新の.apkファイルをストレージにダウンロードします。次に、アプリは更新プロセスを開始します。

アップデートをダウンロードしてインストールしようとすると、メッセージが表示されることがあります。「解析エラー。パッケージの解析に問題があります。」フィールドには60台の奇妙なAndroidデバイスがあり、そのうちの約10台を除いてほとんどのデバイスでアップデートが機能します。

次に、同じ更新プロセスを利用する新しいプロジェクトで、同じエラーメッセージで更新を拒否するタブレットがあります。これは同じタブレットで繰り返し発生しますが、別のタブレット(異なるブランドとOS)では正常に機能します。

デバイスのブランドとOSのバージョンの間に相関関係はないようです。タブレットでは、.apkファイルが完全にダウンロードされていないことは明らかです。ただし、インターネットブラウザから手動でダウンロードして更新することはできます。

そのため、一部のデバイスで要約すると、.apkファイルのダウンロードが完了せず、インストールが失敗します。これは、ネットワーク帯域幅の制約が原因である可能性がありますか?ただし、アプリケーションが起動するたびに更新プロセスが開始され、アプリが何度も使用されているが更新されていないことがわかるため、フィールドにある10個のタブレットはある時点で更新されるはずです。

とりとめのないことについては申し訳ありませんが、私が理解しようとしている情報はたくさんあります。以下のコード行は、5秒後にダウンロードを停止する可能性がありますか?2つのタイムアウトの違いは何ですか?

HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, 5000);

以下は標準アップデートAsyncTaskです。どんな助けでもいただければ幸いです。私は現時点で少し困惑していて、時間は私の側にありません。

   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

0

次のコードを追加し、タイムアウトを 30000 ミリ秒に増やした後も機能しました。

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-06T09:32:53.143 に答える