Android自動オンラインアップグレード

19205 ワード

まず、実行環境についてお話しします.android 2.3テスト(メインスレッドhttpリクエスト)、tomcat 7.0サーバとして
tomca構成:
Webappsの下のrootフォルダの下に2つのファイルが置かれています.1つはapkバージョン情報txtファイル(もちろんservletでjsonを返すこともできます)、1つは新しいapkのファイル(v 2.0)です.
//install.txt  
1
versioncode=2 2 url=http://192.168.1.131/android_apk_install.apk

 
android構成:
まず、機子が実行するのはapkがv 1である.0バージョン、サーバのv 2.バージョン0
アクセス権構成(ネットワークとsdカード書き込み):
1 <uses-permission android:name="android.permission.INTERNET" />
2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 
次の方法は、ネットワークのいくつかのツール方法です.
1.httpgetリクエスト、inputstreamを返します
 1 public static InputStream getDataByHttpGet(String url) {
 2         InputStream inputStream = null;
 3         HttpGet httpGet = new HttpGet(url);
 4         HttpClient httpClient = new DefaultHttpClient();
 5         try {
 6             HttpResponse response = httpClient.execute(httpGet);
 7             int code = response.getStatusLine().getStatusCode();
 8             if (code != 200) {
 9                 return null;
10             }
11             HttpEntity entity = response.getEntity();
12             inputStream = entity.getContent();
13         } catch (Exception e) {
14             e.printStackTrace();
15         }
16         return inputStream;
17     }


2.新しいapkの情報を取得する
 1 public static Hashtable<String, String> getAPKInstallContent(String path) {
 2         InputStream inputStream = getDataByHttpGet(path);
 3         Hashtable<String, String> hashtable = new Hashtable<String, String>();
 4         Properties properties = new Properties();
 5         if (inputStream != null) {
 6             try {
 7                 properties.load(inputStream);
 8                 Set<Entry<Object, Object>> set = properties.entrySet();
 9                 for (Entry<Object, Object> entry : set) {
10                     hashtable.put(entry.getKey().toString(), entry.getValue()
11                             .toString());
12                 }
13             } catch (IOException e) {
14                 e.printStackTrace();
15             } finally {
16                 if (inputStream != null) {
17                     try {
18                         inputStream.close();
19                     } catch (IOException e) {
20                         e.printStackTrace();
21                     }
22                 }
23             }
24         }
25         return hashtable;
26     }


3.apkのダウンロード
 1 public static boolean downloadApk(String url) {
 2         boolean flag = false;
 3         InputStream inputStream = getDataByHttpGet(url);
 4         File sd_file = Environment.getExternalStorageDirectory();
 5         File apk_file = new File(sd_file, "android_installapk.apk");
 6         OutputStream outputStream = null;
 7         try {
 8             outputStream = new FileOutputStream(apk_file);
 9             byte data[] = new byte[1024];
10             int len = 0;
11             while ((len = inputStream.read(data)) != -1) {
12                 outputStream.write(data, 0, len);
13             }
14             flag = true;
15         } catch (Exception e) {
16             e.printStackTrace();
17         }finally{
18             if (inputStream != null) {
19                 try {
20                     inputStream.close();
21                 } catch (IOException e) {
22                     e.printStackTrace();
23                 }
24             }
25             if (outputStream != null) {
26                 try {
27                     outputStream.close();
28                 } catch (IOException e) {
29                     e.printStackTrace();
30                 }
31             }
32         }
33         return flag;
34     }


次はActivity
public class MainActivity extends Activity {

    private String url = "http://192.168.1.131/install.txt";
    private String packageName;
    private PackageManager packageManager;
    private PackageInfo packageInfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Hashtable<String, String> hashtable = HttpUtils.getApkInfo(url);

        packageName = getPackageName();
        packageManager = getPackageManager();
        try {
            packageInfo = packageManager.getPackageInfo(packageName,
                    PackageManager.GET_ACTIVITIES);
            String str1 = hashtable.get("versioncode");
            int str2 = packageInfo.versionCode;
            System.out.println("  :" + str1 + "||" + "  :" + str2);
            if (!String.valueOf(str2).equals(str1)) {
                new Builder(MainActivity.this).setTitle("    !")
                        .setMessage("        ,        ?")
                        .setPositiveButton("  ", new OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                boolean flag = HttpUtils.downloadApk(hashtable
                                        .get("url"));
                                if (flag) {
                                    System.out.println("      !");
                                    Uri uri = Uri
                                            .fromFile(new File(
                                                    "/mnt/sdcard/android_installapk.apk"));
                                    Intent intent = new Intent(
                                            Intent.ACTION_VIEW);
                                    intent.setDataAndType(uri,
                                            "application/vnd.android.package-archive");
                                    startActivity(intent);
                                } else {
                                    System.out.println("      ,    ");
                                }
                            }
                        }).setNegativeButton("  ", new OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {

                            }
                        }).create().show();
            }
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
    }
}