3

更新が利用可能かどうかを確認するアプリケーションを開発しています。問題は、アプリケーションが最新バージョンであることを認識できないことです。

サーバーにファイルがあり、そのファイルには最新のバージョン番号 (1.0.1) が含まれています。アプリケーションのバージョンも 1.0.1 ですが、アップデートを確認すると、アップデートが利用可能であることが示され、テキストには最新のインストール済みバージョンが 1.0.1 であると表示されます。

だからここに私のコードがあります:

(checkupdatebutton)
{
    setContentView(R.layout.updater);


    DefaultHttpClient httpclient = new DefaultHttpClient();

    try {
        HttpGet httppost = new HttpGet("http://myserver.com/latestversion.txt");
        HttpResponse response;
        response = httpclient.execute(httppost);
        HttpEntity ht = response.getEntity();
        BufferedHttpEntity buf = new BufferedHttpEntity(ht);
        InputStream is = buf.getContent();
        BufferedReader r = new BufferedReader(new InputStreamReader(is,"UTF-8"));
        StringBuilder total = new StringBuilder();
        String line;
        while ((line = r.readLine()) != null) {
            total.append(line + "\n");
            }
            TextView versionupdnew = (TextView)findViewById(R.id.versionupdnew);
            //Set text to value of my file (latestversion.txt)
            versionupdnew.setText(total);

            TextView installedversion = (TextView)findViewById(R.id.versionupdcur);
            installedversion.setText(R.string.version);

            TextView title = (TextView)findViewById(R.id.title);
            if(installedversion.equals(versionupdnew))
            {
            //Current version is latest
        title.setText("No update needed!");
            Button buttonUpdate = (Button)findViewById(R.id.buttonUpdate);
            buttonUpdate.setEnabled(false);
            }else{
              title.setText("New version is available!");
            }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
    }
}
4

3 に答える 3

2

TextView.equals()2 つのボックスのテキスト値が等しい場合は true を返しません。2 つのボックスのテキスト値を比較します。

例えば:

if(installedversion.getText().toString().equals(versionupdnew.getText().toString()))

TextView.getText()この関数は a を返さないことに注意してくださいString( API ドキュメントでは a を返すと記載されていますがCharSequence、それが use に設定されている場合、SpannableまたはEditable別の型にキャストできる場合toString()は、これらの型を使用すると、ボックスのテキスト値が aStringおよび inとして返されます)。私の経験は、2 つの s の値を比較する最も信頼できる方法ですView)

于 2013-06-29T19:08:27.437 に答える
2

SharedPreferences を使用して最新バージョンを保存します。それ以外の場合、R.string.version を使用すると、インストールされた apk に付属のバージョンが常にチェックされ、新しいバージョンがダウンロードされても、これは更新されません。

バージョンを整数にマッピングすると、バージョン文字列を解析する必要がなくなります。新しいバージョンはそれぞれ、最後のバージョンよりも 1 大きくなります。

  1. 現在のバージョンを取得します。

    // use preferences to get the current version, with default = 1 
    // (replace 1 with the version that came with the apk)
    preferences.getInt("current_version", 1); 
    
  2. サーバーからバージョンを取得します。

  3. サーバーのバージョンが現在のバージョンよりも大きいかどうかを確認し、必要に応じて更新します。

    if (server_version > current_version) {
       update();
       preferences_editor.putInt("current_version", server_version).commit();
    }
    
  4. 次に更新が必要かどうかを確認するときは、最新の更新バージョンと照合します。

于 2013-06-29T19:21:47.100 に答える
0

現在の問題では、文字列ではなく TextView を比較しているため、文字列を比較すると役立ちます。

別のアプローチをお勧めしますが、

-サーバー上に「check_version」などの小さなAPIをセットアップできます

-「www.myServer.com/check_version.php?v=1.0.1」のように、現在のバージョン番号を API に渡します。

- API は、いくつかの JSON 文を返します

{
   status:"UPDATE_AVAILABLE",
   message: "An update is available",
   url: "http://play.google.com?xxxyyyzzz"
}

ここでは、「ステータス」フィールドを使用して、更新が利用可能かどうかを判断できます..更新が重要かどうかも通知できます..可能な値を持つことができるように

  • "UPDATE_AVAILABLE"

  • "アップデートしてください"

  • "最新"。

    「LATEST」の場合、メッセージと URL は空白にすることができます。すべての比較ロジックはサーバー上にあります。

于 2013-06-29T19:38:53.337 に答える