admin 管理员组文章数量: 887007
最近一个项目中用到下载文件,下载完成后并提示用户选择打开。之前有做过自动更新(下载apk文件),但是现在下载的是office文件,所以要重新写了。
实现思路:
1.下载文件 (多线程下载及更新UI显示下载进度)
2.下载完成后:弹窗提示用户是否打开(这里我用的是原生的AlertDialog,如果嫌不好看,可以自定)
3.用户选择“打开”后,调用手机自带软件打开它
点击下载按钮开始下载文件:
long fileLength = 0;//下载的文件长度 long contentLength;//文件的总长度 private String filePath;//文件的保存路径 int len; private DocAdapterHandler handler;
//点击下载文件 viewHolder.download.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog = new ProgressDialog(context, R.style.dialog); dialog.setMessage("0%"); dialog.setInverseBackgroundForced(false); dialog.show(); Thread thread = new Thread() { public void run() { try { downFile(UrlUtil.HOST_IMAGE_URL + mod.getPath(), mod.getFname()); } catch (Exception e) { } } }; thread.start(); } });
/** * @param urlString:文件的URL * @param fileName:文件名 */ private void downFile(String urlString, String fileName) { HttpURLConnection urlConnection = null; filePath = Environment.getExternalStorageDirectory() + "/" + fileName; Log.e("******文件的保存路径", filePath); try { File file = new File(filePath); if (file.exists()) { file.delete(); fileLength = file.length(); } urlConnection = (HttpURLConnection) new URL(urlString).openConnection(); urlConnection.setReadTimeout(10000); urlConnection.setConnectTimeout(10000); urlConnection.setRequestProperty("RANGE", "bytes=" + fileLength + "-"); urlConnection.setRequestProperty("Charset", "UTF-8"); urlConnection.connect(); contentLength = urlConnection.getContentLength(); if (fileLength < (contentLength < 0 ? 1 : contentLength)) { InputStream inputStream = urlConnection.getInputStream(); FileOutputStream fos = new FileOutputStream(filePath, fileLength > 0); byte[] bytes = new byte[1024]; while ((len = inputStream.read(bytes)) > 0) { fos.write(bytes, 0, len); fileLength += len; Message message1 = new Message(); message1.what = 1; handler.sendMessage(message1); } fos.flush(); fos.getFD().sync(); fos.close(); inputStream.close(); Message message2 = new Message(); message2.what = 2; handler.sendMessage(message2); } } catch (IOException e) { e.printStackTrace(); } if (urlConnection != null) { urlConnection.disconnect(); } }
Handler类
private class DocAdapterHandler extends Handler { public void handleMessage(Message msg) { if (!Thread.currentThread().isInterrupted()) { switch (msg.what) { case 0: dialog.setMessage(contentLength + "%"); Log.i("********文件长度-:", contentLength + ""); break; case 1: long x = (fileLength / contentLength * 100); dialog.setMessage(x + "%"); break; case 2: dialog.dismiss(); Toast.makeText(context.getApplicationContext(), "下载完成", Toast.LENGTH_LONG).show(); MediaPlayerUtil.startOK(); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("下载完成"); builder.setNegativeButton("取消", null); builder.setPositiveButton("打开", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(); File file = new File(filePath); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Intent.ACTION_VIEW); String type = getMIMEType(file); //设置intent的data和Type属性。 intent.setDataAndType(Uri.fromFile(file), type); try { context.startActivity(intent); } catch (ActivityNotFoundException e) { Toast.makeText(context, "您没有安装Office文件", Toast.LENGTH_SHORT).show(); } } }); builder.show(); break; } } } }
/** * 根据文件后缀名匹配MIMEType * * @param file * @return */ public static String getMIMEType(File file) { String type = "*/*"; String name = file.getName(); int index = name.lastIndexOf('.'); if (index < 0) { return type; } String end = name.substring(index, name.length()).toLowerCase(); if (TextUtils.isEmpty(end)) return type; for (int i = 0; i < MIME_MapTable.length; i++) { if (end.equals(MIME_MapTable[i][0])) type = MIME_MapTable[i][1]; } return type; } private static final String[][] MIME_MapTable = { {".3gp", "video/3gpp"}, {".apk", "application/vnd.android.package-archive"}, {".asf", "video/x-ms-asf"}, {".avi", "video/x-msvideo"}, {".bin", "application/octet-stream"}, {".bmp", "image/bmp"}, {".c", "text/plain"}, {".class", "application/octet-stream"}, {".conf", "text/plain"}, {".cpp", "text/plain"}, {".doc", "application/msword"}, {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, {".xls", "application/vnd.ms-excel"}, {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, {".exe", "application/octet-stream"}, {".gif", "image/gif"}, {".gtar", "application/x-gtar"}, {".gz", "application/x-gzip"}, {".h", "text/plain"}, {".htm", "text/html"}, {".html", "text/html"}, {".jar", "application/java-archive"}, {".java", "text/plain"}, {".jpeg", "image/jpeg"}, {".jpg", "image/jpeg"}, {".js", "application/x-javascript"}, {".log", "text/plain"}, {".m3u", "audio/x-mpegurl"}, {".m4a", "audio/mp4a-latm"}, {".m4b", "audio/mp4a-latm"}, {".m4p", "audio/mp4a-latm"}, {".m4u", "video/vnd.mpegurl"}, {".m4v", "video/x-m4v"}, {".mov", "video/quicktime"}, {".mp2", "audio/x-mpeg"}, {".mp3", "audio/x-mpeg"}, {".mp4", "video/mp4"}, {".mpc", "application/vnd.mpohun.certificate"}, {".mpe", "video/mpeg"}, {".mpeg", "video/mpeg"}, {".mpg", "video/mpeg"}, {".mpg4", "video/mp4"}, {".mpga", "audio/mpeg"}, {".msg", "application/vnd.ms-outlook"}, {".ogg", "audio/ogg"}, {".pdf", "application/pdf"}, {".png", "image/png"}, {".pps", "application/vnd.ms-powerpoint"}, {".ppt", "application/vnd.ms-powerpoint"}, {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, {".prop", "text/plain"}, {".rc", "text/plain"}, {".rmvb", "audio/x-pn-realaudio"}, {".rtf", "application/rtf"}, {".sh", "text/plain"}, {".tar", "application/x-tar"}, {".tgz", "application/x-compressed"}, {".txt", "text/plain"}, {".wav", "audio/x-wav"}, {".wma", "audio/x-ms-wma"}, {".wmv", "audio/x-ms-wmv"}, {".wps", "application/vnd.ms-works"}, {".xml", "text/plain"}, {".z", "application/x-compress"}, {".zip", "application/x-zip-compressed"}, {"", "*/*"} };
运行效果:
OK,到此就结束了!最后再奉献上如果是自动更新apk时的代码:
/** * 自动安装apk文件 * @param context * @param file */ public static void openApk(Context context,File file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); context.startActivity(intent); }
版权声明:本文标题:android开发中文件下载并自动安装或选择打开 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1729875163h1364244.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论