Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發之android_apk 在線安裝(源代碼分享)

Android開發之android_apk 在線安裝(源代碼分享)

編輯:關於Android編程

android_apk的在線安裝,除了要設計Android 客戶端的代碼外,還要搭建服務器的代碼,仿真實現中Android軟件的在線升級。

Android 客戶端的代碼截圖如下。

\

MainActivity

package com.example.f03_packmanager;

import java.io.File;
import java.util.concurrent.ExecutionException;

import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
	// 先在文件清單添加獲取網絡訪問權限和准許讀寫sdcard的permission;
	private Button button;
	private ProgressDialog dialog;// 查詢版本更新信息的進度對話框
	private String messagePath = "http://111.0.124.108:8080/http/servlet/Install";// 獲取版本更新的URL
	private Message message;
	private PackUtiles packUtiles;// 獲取當前版本信息的封裝類
	private AlertDialog.Builder builder;// 下載更新的對話框

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		dialog = new ProgressDialog(MainActivity.this);
		dialog.setTitle("提示");
		dialog.setMessage("download.....");
		builder = new AlertDialog.Builder(MainActivity.this);
		builder.setTitle("下載更新");
		builder.setMessage("是否下載最新的版本?");
		builder.setCancelable(false);// 設置不能隨意關閉提示下載更新的對話框
		button = (Button) this.findViewById(R.id.button1);
		packUtiles = new PackUtiles(MainActivity.this);
		button.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				try {
					message = new getAPKUrl().execute(messagePath)
							.get();
					boolean flag = packUtiles.update(packUtiles.getVersion(),
							message.getVsersionCode());
					Log.i("tag", "------->" + flag);
					if (flag) {

						builder.setPositiveButton("確定", new OnClickListener() {

							@Override
							public void onClick(DialogInterface arg0, int arg1) {
								// TODO Auto-generated method stub
								new downLoadAPK().execute(message.getApkUrl());
							}
						});
						builder.setNegativeButton("取消", new OnClickListener() {

							@Override
							public void onClick(DialogInterface arg0, int arg1) {
								// TODO Auto-generated method stub

							}
						});
						builder.create().show();
					}

				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (ExecutionException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}

	// 獲取版本更新信息的異步任務
	public class getAPKUrl extends AsyncTask {
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
			dialog.show();
		}

		@Override
		protected Message doInBackground(String... params) {
			// TODO Auto-generated method stub
			return HttpUtiles.getMessage(params[0]);
		}

		@Override
		protected void onPostExecute(Message result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			dialog.dismiss();
		}
	}

	public class downLoadAPK extends AsyncTask {
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
		}

		@Override
		protected Void doInBackground(String... params) {
			// TODO Auto-generated method stub
			String uri=HttpUtiles.downLoadApk(params[0]);
			Log.i("TAG2", "-------->"+uri);
			//通過文件路徑安裝指定版本
			Uri uri2=Uri.fromFile(new File(uri));
			Intent intent=new Intent(Intent.ACTION_VIEW);
			intent.setDataAndType(uri2, "application/vnd.android.package-archive");
			startActivity(intent);
			return null;
		}

		@Override
		protected void onPostExecute(Void result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
		}
	}

}

HttpUtiles獲取服務器的版本信息,一個方法為以json格式獲取版本的數據,一個為下載最新的版本到sdcard中

package com.example.f03_packmanager;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Environment;
import android.util.Log;

public class HttpUtiles {
     //下載版本信息,格式為json
	public static Message getMessage(String path) {
		Message message = new Message();
		HttpClient client = new DefaultHttpClient();
		HttpPost httpPost = new HttpPost(path);
		try {
			HttpResponse httpResponse = client.execute(httpPost);
			if(httpResponse.getStatusLine().getStatusCode()==200){
				String json=EntityUtils.toString(httpResponse.getEntity());
				try {
					JSONObject  jsonObject=new JSONObject(json).getJSONObject("message");
					message.setVsersionCode(jsonObject.getInt("vsersionCode"));
					message.setApkUrl(jsonObject.getString("apkUrl"));
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
		return message;

	}
	//下載指定版本到sdcard中
	public static String downLoadApk(String path){
		byte[]data=null;
		String uri=null;
		HttpClient client = new DefaultHttpClient();
		HttpPost httpPost = new HttpPost(path);
		FileOutputStream fileOutputStream=null;
		try {
			HttpResponse httpResponse = client.execute(httpPost);
			if(httpResponse.getStatusLine().getStatusCode()==200){
				data=EntityUtils.toByteArray(httpResponse.getEntity());
				if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
				    File file=Environment.getExternalStorageDirectory();
				    String name=path.substring(path.lastIndexOf("/")+1,path.length());
					fileOutputStream=new FileOutputStream(new File(file, name));
					fileOutputStream.write(data, 0, data.length);
					uri=file.getAbsolutePath()+"/"+name;
				}
			}
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(fileOutputStream!=null){
				try {
					fileOutputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		Log.i("HTTP", "-------->"+uri);
		return uri;
		
	}

}
Message類指定數據返回的格式

package com.example.f03_packmanager;

public class Message {
	
	private int vsersionCode;
	private String apkUrl;
	public int getVsersionCode() {
		return vsersionCode;
	}
	public void setVsersionCode(int vsersionCode) {
		this.vsersionCode = vsersionCode;
	}
	public String getApkUrl() {
		return apkUrl;
	}
	public void setApkUrl(String apkUrl) {
		this.apkUrl = apkUrl;
	}
	@Override
	public String toString() {
		return "Message [vsersionCode=" + vsersionCode + ", apkUrl=" + apkUrl
				+ "]";
	}
	

}
PackUtilse獲取軟件當前的版本信息
package com.example.f03_packmanager;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;

public class PackUtiles {

	private Context context;
	private PackageManager manager;
	private PackageInfo info;

	public PackUtiles(Context context) {
		// TODO Auto-generated constructor stub
		this.context = context;
		initDate();
	}

	public void initDate() {
		manager = context.getPackageManager();
		try {
			info = manager.getPackageInfo(context.getPackageName(),
					PackageManager.GET_ACTIVITIES);
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public int getVersion() {

		return info.versionCode;
	}
	
    public String getVersionName(){
    	
    	return info.versionName;
    }
    //比較本地版本和服務器的版本號的大小
    public boolean update(int oldVersion,int newVersion){
    	boolean flag=newVersion>oldVersion?true:false;
    	return flag;
    }
} 
    

到此Android的代碼就編寫完成了,下面我們來介紹一下服務器端的代碼,事先要導入json的jar包,另外一點注意的是所有的http地址在自己使用的時候都記得改成自己筆記本的ip地址,此外別忘了把要更新的軟件apk放在webroot目錄下。

package com.login.install;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONSerializer;

public class Install extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public Install() {
		super();
	}

	/**
	 * Destruction of the servlet. 
*/ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet.
* * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } /** * The doPost method of the servlet.
* * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); Message message=new Message(); message.setVsersionCode(2); message.setApkUrl("http://111.0.124.108:8080/http/F03_PackManager.apk"); Map map=new HashMap(); map.put("message", message); out.print(JSONSerializer.toJSON(map)); out.flush(); out.close(); } /** * Initialization of the servlet.
* * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here } }



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved