今天项目中遇到这样一个需求 ,根据后台接口里pdf,doc,dwg文档的地址 是一个URL ,需要根据文档的url 下载到本地(内部存储或内存卡)并用手机中能打开该文档的软件弹出来并打开,(这里需要做一个缓存,第一次查看这个文档是在服务器上下载并打开,以后打开不需要下载直接打开本地的文档)在网上找了些资料 写了以下代码,下面分享给大家;

效果图:

android中打开world 安卓手机如何打开.docx;文件_android

代码:

这是一个单独的类 首先接收intent传过来的url我是用url的后14位作为存储本地的文件名(这里根据自己服务器的文件命名规则而定) 拿到文件路径之后 判断本地是否有此文件 有则打开没有则从服务器上下载并打开 ;

Intent intent = act.getIntent();
		final String Strname = intent.getStringExtra("docurl");
		//截取最后14位 作为文件名
		String s = Strname.substring(Strname.length()-14);
		//文件存储
		file1 = new File(Environment.getExternalStorageDirectory(), getFileName(s));
		new Thread() {
			public void run() {
				File file = new File( file1.getAbsolutePath());
				//判断是否有此文件
				if (file.exists()) {
					//有缓存文件,拿到路径 直接打开
					Message msg = Message.obtain();
					msg.obj = haha;
					msg.what = DOWNLOAD_SUCCESS;
					handler.sendMessage(msg);
					mProgressDialog.dismiss();
					return;
				}
//				本地没有此文件 则从网上下载打开
				File downloadfile = downLoad(Strname, file1.getAbsolutePath(), mProgressDialog);
//				Log.i("Log",file1.getAbsolutePath());
				Message msg = Message.obtain();
				if (downloadfile != null) {
					// 下载成功,安装....
					msg.obj = downloadfile;
					msg.what = DOWNLOAD_SUCCESS;
				} else {
					// 提示用户下载失败.
					msg.what = DOWNLOAD_ERROR;
				}
				handler.sendMessage(msg);
				mProgressDialog.dismiss();
			};
		}.start();

下载文档代码;

传入需要下载的文档的url 和存入内存的路径和dialog

public static File downLoad(String serverpath, String savedfilepath, ProgressDialog pd) {
		try {
			URL url = new URL(serverpath);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(5000);
			if (conn.getResponseCode() == 200) {
				int max = conn.getContentLength();
				pd.setMax(max);
				InputStream is = conn.getInputStream();
				File file = new File(savedfilepath);
				FileOutputStream fos = new FileOutputStream(file);
				int len = 0;
				byte[] buffer = new byte[1024];
				int total = 0;
				while ((len = is.read(buffer)) != -1) {
					fos.write(buffer, 0, len);
					total += len;
					pd.setProgress(total);
				}
				fos.flush();
				fos.close();
				is.close();
				return file;
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
	
		}

	}

打开文件选择器

Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case DOWNLOAD_SUCCESS:
				File file = (File) msg.obj;
				Intent intent = new Intent("android.intent.action.VIEW");
				intent.addCategory("android.intent.category.DEFAULT");
				intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
				intent.setDataAndType (Uri.fromFile(file), "application/pdf");
//				startActivity(intent);
				startActivity(Intent.createChooser(intent, "标题"));
				/**
				 * 弹出选择框之后   把本activity销毁
				 */
				finish();
				break;
			case DOWNLOAD_ERROR:
				Util.showToast(act,"文件加载失败");
				break;
			}
		}
	};

整体代码

public class list_item_doc extends BaseActivity {

	private ProgressDialog mProgressDialog;

	// 下载失败
	public static final int DOWNLOAD_ERROR = 2;
	// 下载成功
	public static final int DOWNLOAD_SUCCESS = 1;
	private  File file1;
	@Override
	protected void onCreate(Bundle arg0) {
		// TODO Auto-generated method stub
		super.onCreate(arg0);

		initView();
	}

	private void initView() {
		// TODO Auto-generated method stub
		Intent intent = act.getIntent();
		final String Strname = intent.getStringExtra("url");
		mProgressDialog = new ProgressDialog(act);
		mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		mProgressDialog.setCancelable(false);
		mProgressDialog.show();
		//截取最后14位 作为文件名
		String s = Strname.substring(Strname.length()-14);
		//文件存储
		file1 = new File(Environment.getExternalStorageDirectory(), getFileName(s));
		new Thread() {
			public void run() {
	
				File haha = new File( file1.getAbsolutePath());
				//判断是否有此文件
				if (haha.exists()) {
					//有缓存文件,拿到路径 直接打开
					Message msg = Message.obtain();
					msg.obj = haha;
					msg.what = DOWNLOAD_SUCCESS;
					handler.sendMessage(msg);
					mProgressDialog.dismiss();
					return;
				}
//				本地没有此文件 则从网上下载打开
				File downloadfile = downLoad(Strname, file1.getAbsolutePath(), mProgressDialog);
//				Log.i("Log",file1.getAbsolutePath());
				Message msg = Message.obtain();
				if (downloadfile != null) {
					// 下载成功,安装....
					msg.obj = downloadfile;
					msg.what = DOWNLOAD_SUCCESS;
				} else {
					// 提示用户下载失败.
					msg.what = DOWNLOAD_ERROR;
				}
				handler.sendMessage(msg);
				mProgressDialog.dismiss();
			};
		}.start();
	}

	/**
	 * 下载完成后  直接打开文件
	 */
	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case DOWNLOAD_SUCCESS:
				File file = (File) msg.obj;
				Intent intent = new Intent("android.intent.action.VIEW");
				intent.addCategory("android.intent.category.DEFAULT");
				intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
				intent.setDataAndType (Uri.fromFile(file), "application/pdf");
//				startActivity(intent);
				startActivity(Intent.createChooser(intent, "标题"));
				/**
				 * 弹出选择框   把本activity销毁
				 */
				finish();
				break;
			case DOWNLOAD_ERROR:
				Util.showToast(act,"文件加载失败");
				break;
			}
		}
	};
/**
 *
 */


	/**
	 * 传入文件 url  文件路径  和 弹出的dialog  进行 下载文档
     */
	public static File downLoad(String serverpath, String savedfilepath, ProgressDialog pd) {
		try {
			URL url = new URL(serverpath);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(5000);
			if (conn.getResponseCode() == 200) {
				int max = conn.getContentLength();
				pd.setMax(max);
				InputStream is = conn.getInputStream();
				File file = new File(savedfilepath);		
				FileOutputStream fos = new FileOutputStream(file);
				int len = 0;
				byte[] buffer = new byte[1024];
				int total = 0;
				while ((len = is.read(buffer)) != -1) {
					fos.write(buffer, 0, len);
					total += len;
					pd.setProgress(total);
				}
				fos.flush();
				fos.close();
				is.close();
				return file;
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

	public static String getFileName(String serverurl) {
		return serverurl.substring(serverurl.lastIndexOf("/") + 1);
	}

}

由于第一次写博客 有些地方看不懂的可以评论问我!