版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

主要用于通过Intent调用手机本地软件打开文件(doc、xsl、pdf、ppt、mp3、mp4等格式)、安装apk、发送邮件、拨打电话、发送短信、打开地图。

因为需要用到android.permission.READ_EXTERNAL_STORAGE权限,所以依赖《Android6.0运行时权限(基于RxPermission开源库)》。

效果图

代码分析

对打开各种后缀的文件的Intent进行封装。

目前打开HTML文件有点儿问题。

使用步骤

一、项目组织结构图

注意事项:

1、导入类文件后需要change包名以及重新import R文件路径

2、Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

将IntentActionUtil复制到项目中

  1. package com.why.project.intentactionutildemo.utils;
  2.  
  3. import android.annotation.SuppressLint;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.pm.PackageManager;
  7. import android.content.pm.ResolveInfo;
  8. import android.net.Uri;
  9.  
  10. import java.io.File;
  11. import java.util.List;
  12.  
  13. /**
  14. * Create By HaiyuKing
  15. * Used Intent的常见作用的工具类(以前叫AndroidFileUtil)
  16. * 参考资料 http://blog.csdn.net/chaoyu168/article/details/50778016
  17. * http://www.2cto.com/kf/201210/162045.html
  18. * http://blog.csdn.net/shlpyy/article/details/8706751
  19. * http://www.cnblogs.com/simov/p/3761243.html
  20. * http://blog.csdn.net/wangyang2698341/article/details/20847469
  21. */
  22. @SuppressLint("DefaultLocale")
  23. public class IntentActionUtil {
  24.  
  25. /**
  26. * 打开指定类型的文件的Intent
  27. * param - filePath : 文件路径:例如,*/
  28. public static Intent openFileIntent(String filePath) {
  29. if(isFileExit(filePath)){
  30. String endName = filePath.substring(filePath.lastIndexOf(".") + 1, filePath.length()).toLowerCase();//后缀名
  31. /* 依扩展名的类型决定MimeType */
  32. if (endName.equals("m4a") || endName.equals("mp3") || endName.equals("mid") ||
  33. endName.equals("xmf") || endName.equals("ogg") || endName.equals("wav") || endName.equals("amr")) {
  34. return getAudioFileIntent(filePath);//播放音频
  35. } else if (endName.equals("3gp") || endName.equals("mp4")) {
  36. return getVideoFileIntent(filePath);//播放视频
  37. } else if (endName.equals("jpg") || endName.equals("gif") || endName.equals("png") ||
  38. endName.equals("jpeg") || endName.equals("bmp")) {
  39. return getImageFileIntent(filePath);//打开图片
  40. } else if (endName.equals("apk")) {
  41. return getApkFileIntent(filePath);//安装软件
  42. } else if (endName.equals("ppt") || endName.equals("pptx")) {
  43. return getPptFileIntent(filePath);//打开PPT文档
  44. } else if (endName.equals("xls") || endName.equals("xlsx")) {
  45. return getExcelFileIntent(filePath);//打开excel文档
  46. } else if (endName.equals("doc") || endName.equals("docx")) {
  47. return getWordFileIntent(filePath);//打开doc文档
  48. } else if (endName.equals("pdf")) {
  49. return getPdfFileIntent(filePath);//打开PDF文档
  50. } else if (endName.equals("chm")) {
  51. return getChmFileIntent(filePath);//打开CHM文档
  52. } else if (endName.equals("txt")) {
  53. return getTextFileIntent(filePath);//打开txt文档
  54. } else if (endName.equals("zip")) {
  55. return getZipFileIntent(filePath);//打开zip压缩包
  56. } else if (endName.equals("rar")) {
  57. return getRarFileIntent(filePath);//打开rar压缩包
  58. } else if (endName.equals("html") || endName.equals("htm")) {
  59. return getHtmlFileIntent(filePath);//打开html文件
  60. }else {
  61. return getAllIntent(filePath);//打开其他的文件
  62. }
  63. }else{
  64. return null;
  65. }
  66. }
  67.  
  68. /**
  69. * 调用发邮件的Intent
  70. * param sendToEmail - 邮件主送人的地址
  71. * return
  72. */
  73. public static Intent getEmailIntent(String sendToEmail) {
  74. Uri emailUri = Uri.parse(sendToEmail);
  75. Intent intent = new Intent(Intent.ACTION_SENDTO, emailUri);
  76. return intent;
  77. }
  78. /**
  79. * 调用浏览器打开网页的Intent
  80. *
  81. * param url - 网址:例如,http://www.baidu.com
  82. * return
  83. */
  84. public static Intent getWebViewIntent(String url) {
  85. Uri uri = Uri.parse(url);
  86. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  87. return intent;
  88. }
  89.  
  90. /**
  91. * 调用地图软件显示地图定位的Intent
  92. * param x - 定位X坐标:116.398064
  93. * param y - 定位Y坐标:39.913703
  94. * return
  95. */
  96. public static Intent getMapViewIntent(double x,double y) {
  97. Uri uri = Uri.parse("geo:"+x+","+y);
  98. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  99. return intent;
  100. }
  101.  
  102. /**
  103. * 打开拨号程序,拨打电话的Intent
  104. *
  105. * param telphoneNum - 电话号码
  106. * return
  107. */
  108. public static Intent getPhoneIntent(String telphoneNum) {
  109. Uri uri = Uri.parse("tel:" + telphoneNum);
  110. Intent intent = new Intent(Intent.ACTION_DIAL, uri);
  111. return intent;
  112. }
  113.  
  114. /**
  115. * 打开短信程序,发送短信的Intent
  116. *
  117. * param telphoneNum - 电话号码
  118. * param smsBody - 短信内容文本
  119. * return
  120. */
  121. public static Intent getSMSIntent(String telphoneNum,String smsBody) {
  122. Uri uri = Uri.parse("smsto:" + telphoneNum);
  123. Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
  124. intent.putExtra("sms_body",smsBody);
  125. return intent;
  126. }
  127.  
  128. /**
  129. * Android获取一个用于打开VIDEO(视频)文件的intent
  130. */
  131. private static Intent getVideoFileIntent(String filePath) {
  132. Intent intent = new Intent("android.intent.action.VIEW");
  133. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  134. intent.putExtra("oneshot", 0);
  135. intent.putExtra("configchange", 0);
  136. Uri uri = Uri.fromFile(new File(filePath));
  137. intent.setDataAndType(uri, "video/*");
  138. return intent;
  139. }
  140.  
  141. /**
  142. * Android获取一个用于打开AUDIO(音频)文件的intent
  143. */
  144. private static Intent getAudioFileIntent(String param) {
  145. Intent intent = new Intent("android.intent.action.VIEW");
  146. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  147. intent.putExtra("oneshot", 0);
  148. intent.putExtra("configchange", 0);
  149. Uri uri = Uri.fromFile(new File(param));
  150. intent.setDataAndType(uri, "audio/*");
  151. return intent;
  152. }
  153.  
  154. /**
  155. * Android获取一个用于打开图片文件的intent
  156. */
  157. private static Intent getImageFileIntent(String filePath) {
  158. Intent intent = new Intent("android.intent.action.VIEW");
  159. intent.addCategory("android.intent.category.DEFAULT");
  160. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  161. Uri uri = Uri.fromFile(new File(filePath));
  162. intent.setDataAndType(uri, "image/*");
  163. return intent;
  164. }
  165.  
  166. /**
  167. * Android获取一个用于安装APK文件的intent
  168. */
  169. private static Intent getApkFileIntent(String filePath) {
  170. Intent intent = new Intent();
  171. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  172. intent.setAction(Intent.ACTION_VIEW);
  173. Uri uri = Uri.fromFile(new File(filePath));
  174. intent.setDataAndType(uri, "application/vnd.android.package-archive");
  175. return intent;
  176. }
  177.  
  178. /**
  179. * Android获取一个用于打开PPT文件的intent
  180. */
  181. private static Intent getPptFileIntent(String filePath) {
  182. Intent intent = new Intent("android.intent.action.VIEW");
  183. intent.addCategory("android.intent.category.DEFAULT");
  184. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  185. Uri uri = Uri.fromFile(new File(filePath));
  186. intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
  187. return intent;
  188. }
  189. /**
  190. * Android获取一个用于打开Excel文件的intent
  191. */
  192. private static Intent getExcelFileIntent(String filePath) {
  193. Intent intent = new Intent("android.intent.action.VIEW");
  194. intent.addCategory("android.intent.category.DEFAULT");
  195. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  196. Uri uri = Uri.fromFile(new File(filePath));
  197. intent.setDataAndType(uri, "application/vnd.ms-excel");
  198. return intent;
  199. }
  200. /**
  201. * Android获取一个用于打开Word文件的intent
  202. */
  203. private static Intent getWordFileIntent(String filePath) {
  204. Intent intent = new Intent("android.intent.action.VIEW");
  205. intent.addCategory("android.intent.category.DEFAULT");
  206. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  207. Uri uri = Uri.fromFile(new File(filePath));
  208. intent.setDataAndType(uri, "application/msword");
  209. return intent;
  210. }
  211.  
  212. /**
  213. * Android获取一个用于打开PDF文件的intent
  214. */
  215. private static Intent getPdfFileIntent(String filePath) {
  216. Intent intent = new Intent("android.intent.action.VIEW");
  217. intent.addCategory("android.intent.category.DEFAULT");
  218. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  219. Uri uri = Uri.fromFile(new File(filePath));
  220. intent.setDataAndType(uri, "application/pdf");
  221. return intent;
  222. }
  223.  
  224. /**
  225. * Android获取一个用于打开CHM文件的intent
  226. */
  227. private static Intent getChmFileIntent(String filePath) {
  228. Intent intent = new Intent("android.intent.action.VIEW");
  229. intent.addCategory("android.intent.category.DEFAULT");
  230. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  231. Uri uri = Uri.fromFile(new File(filePath));
  232. intent.setDataAndType(uri, "application/x-chm");
  233. return intent;
  234. }
  235.  
  236. /**
  237. * Android获取一个用于打开文本文件的intent
  238. */
  239. private static Intent getTextFileIntent(String filePath) {
  240. Intent intent = new Intent("android.intent.action.VIEW");
  241. intent.addCategory("android.intent.category.DEFAULT");
  242. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  243. Uri uri = Uri.fromFile(new File(filePath));
  244. intent.setDataAndType(uri, "text/plain");
  245. return intent;
  246. }
  247.  
  248. /**
  249. * Android获取一个用于打开ZIP文件的intent
  250. */
  251. private static Intent getZipFileIntent(String filePath) {
  252. Intent intent = new Intent("android.intent.action.VIEW");
  253. intent.addCategory("android.intent.category.DEFAULT");
  254. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  255. Uri uri = Uri.fromFile(new File(filePath));
  256. intent.setDataAndType(uri, "application/zip");
  257. return intent;
  258. }
  259. /**
  260. * Android获取一个用于打开Rar文件的intent
  261. */
  262. private static Intent getRarFileIntent(String filePath) {
  263. Intent intent = new Intent("android.intent.action.VIEW");
  264. intent.addCategory("android.intent.category.DEFAULT");
  265. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  266. Uri uri = Uri.fromFile(new File(filePath));
  267. intent.setDataAndType(uri, "application/rar");
  268. return intent;
  269. }
  270.  
  271. /**
  272. * Android获取一个用于打开Html文件的intent【有点儿问题,无法实现选择浏览器查看预览效果,且在Android6.0上无法通过“HTML查看程序”进行查看】
  273. */
  274. private static Intent getHtmlFileIntent(String filePath) {
  275. Uri uri = Uri.parse(filePath).buildUpon().encodedAuthority("com.android.htmlfileprovider")
  276. .scheme("content").encodedPath(filePath).build();//content://com.android.htmlfileprovider/storage/emulated/0/intentFile/htmldemo.html
  277. Intent intent = new Intent("android.intent.action.VIEW");
  278. intent.addCategory(Intent.CATEGORY_DEFAULT);
  279. intent.setDataAndType(uri, "text/html");
  280. return intent;
  281. }
  282.  
  283. /**
  284. * Android获取一个用于打开任意文件的intent
  285. */
  286. private static Intent getAllIntent(String filePath) {
  287.  
  288. Intent intent = new Intent();
  289. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  290. intent.setAction(Intent.ACTION_VIEW);
  291. Uri uri = Uri.fromFile(new File(filePath));
  292. intent.setDataAndType(uri, "*/*");
  293. return intent;
  294. }
  295.  
  296. /**
  297. * 判断intent是否可用
  298. */
  299. public static boolean isIntentAvailable(Context mContext, Intent intent) {
  300. final PackageManager packageManager = mContext.getPackageManager();
  301. List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
  302. PackageManager.MATCH_DEFAULT_ONLY);//PackageManager.GET_ACTIVITIES
  303. return list.size() > 0;
  304. }
  305.  
  306. /**
  307. * 判断intent是否可用
  308. * 些时候你想要知道某个AP是否有注册了一个明确的intent
  309. * 比如说你想要检查某个receiver是否存在,然后根据是否存在来这个receiver来在你的AP里面enable某些功能
  310. */
  311. public static boolean isIntentAvailable(Context context, String action) {
  312. final PackageManager packageManager = context.getPackageManager();
  313. final Intent intent = new Intent(action);
  314. List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,
  315. PackageManager.MATCH_DEFAULT_ONLY);
  316. if (resolveInfo.size() > 0) {
  317. return true;
  318. }
  319. return false;
  320. }
  321.  
  322. /**
  323. * 判断文件是否存在
  324. * param - filePath:文件路径
  325. */
  326. private static boolean isFileExit(String filePath) {
  327. if (filePath == null) {
  328. return false;
  329. }
  330. try {
  331. File f = new File(filePath);
  332. if (!f.exists()) {
  333. return false;
  334. }
  335. } catch (Exception e) {
  336. // TODO: handle exception
  337. }
  338. return true;
  339. }
  340. }

IntentActionUtil

在AndroidManifest.xml中添加权限

  1. <!-- *****************IntentActionUtil【Intent的常见作用的工具类】***************** -->
  2. <!-- 在SD卡中创建与删除文件权限 -->
  3. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  4. <!-- 向SD卡写入数据权限 -->
  5. <uses-permission android:name="android.permission.REORDER_TASKS"/>
  6. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  7. <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
  8. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

添加运行时权限的处理(本demo中采用的是修改targetSDKVersion=22)

三、使用方法

  1. tv_openEmail.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. Intent intent = new Intent();
  5. intent = IntentActionUtil.getEmailIntent("wangxxxxxx@126.com");
  6. if(IntentActionUtil.isIntentAvailable(MainActivity.this,intent)){
  7. MainActivity.this.startActivity(intent);
  8. }else{
  9. Toast.makeText(MainActivity.this, "无法打开,请安装手机邮箱软件", Toast.LENGTH_SHORT).show();
  10. }
  11. }
  12. });
  13.  
  14. tv_openWeb.setOnClickListener(new View.OnClickListener() {
  15. @Override
  16. public void onClick(View v) {
  17. Intent intent = new Intent();
  18. intent = IntentActionUtil.getWebViewIntent("http://www.baidu.com");
  19. if(IntentActionUtil.isIntentAvailable(MainActivity.this,intent)){
  20. MainActivity.this.startActivity(intent);
  21. }else{
  22. Toast.makeText(MainActivity.this, "无法打开,请安装手机浏览器软件", Toast.LENGTH_SHORT).show();
  23. }
  24. }
  25. });
  26.  
  27. tv_openMap.setOnClickListener(new View.OnClickListener() {
  28. @Override
  29. public void onClick(View v) {
  30. Intent intent = new Intent();
  31. intent = IntentActionUtil.getMapViewIntent(116.398064,39.913703);
  32. if(IntentActionUtil.isIntentAvailable(MainActivity.this,intent)){
  33. MainActivity.this.startActivity(intent);
  34. }else{
  35. Toast.makeText(MainActivity.this, "无法打开,请安装手机地图软件", Toast.LENGTH_SHORT).show();
  36. }
  37. }
  38. });
  39.  
  40. tv_openTel.setOnClickListener(new View.OnClickListener() {
  41. @Override
  42. public void onClick(View v) {
  43. Intent intent = new Intent();
  44. intent = IntentActionUtil.getPhoneIntent("10010");
  45. if(IntentActionUtil.isIntentAvailable(MainActivity.this,intent)){
  46. MainActivity.this.startActivity(intent);
  47. }
  48. }
  49. });
  50.  
  51. tv_openSMS.setOnClickListener(new View.OnClickListener() {
  52. @Override
  53. public void onClick(View v) {
  54. Intent intent = new Intent();
  55. intent = IntentActionUtil.getSMSIntent("10010","");
  56. if(IntentActionUtil.isIntentAvailable(MainActivity.this,intent)){
  57. MainActivity.this.startActivity(intent);
  58. }
  59. }
  60. });
  61.  
  62. tv_openAudio.setOnClickListener(new View.OnClickListener() {
  63. @Override
  64. public void onClick(View v) {
  65. String filePath = Environment.getExternalStorageDirectory() + "/intentFile/" + "videodemo.m4a";
  66. Intent intent = new Intent();
  67. intent = IntentActionUtil.openFileIntent(filePath);
  68. if(intent != null){
  69. MainActivity.this.startActivity(intent);
  70. }else{
  71. Toast.makeText(MainActivity.this,"文件不存在",Toast.LENGTH_SHORT).show();
  72. }
  73. }
  74. });

混淆配置

参考资料

Android--用intent打开各种文件

http://blog.csdn.net/chaoyu168/article/details/50778016

android intent和intent action大全

http://www.2cto.com/kf/201210/162045.html

判断一个intent是否可用的接口

http://blog.csdn.net/shlpyy/article/details/8706751

【Android】打开本地的html文件

http://www.cnblogs.com/simov/p/3761243.html

android intent打开各种文件的方法

http://blog.csdn.net/wangyang2698341/article/details/20847469

项目demo下载地址

https://github.com/haiyuKing/IntentActionUtilDemo

Demo中使用的文件:

链接:http://pan.baidu.com/s/1bpnJrpt 密码:4w3u

IntentActionUtil【Intent的常见作用的工具类】的更多相关文章

  1. 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)

    目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...

  2. 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)

    在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...

  3. Android 开发工具类 35_PatchUtils

    增量更新工具类[https://github.com/cundong/SmartAppUpdates] import java.io.File; import android.app.Activity ...

  4. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  5. Android 常见工具类封装

    1,MD5工具类: public class MD5Util { public final static String MD5(String s) { char hexDigits[] = { '0' ...

  6. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  7. JAVA 获取文件的MD5值大小以及常见的工具类

    /** * 获取文件的MD5值大小 * * @param file * 文件对象 * @return */ public static String getMD5(File file) { FileI ...

  8. Collections 工具类和 Arrays 工具类常见方法

    Collections Collections 工具类常用方法: 排序 查找,替换操作 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) 排序操作 void revers ...

  9. velocity merge作为工具类从web上下文和jar加载模板的两种常见情形

    很多时候,处于各种便利性或折衷或者通用性亦或是限制的原因,会借助于模板生成结果,在此介绍两种使用velocity merge的情形,第一种是和spring mvc一样,将模板放在velocityCon ...

随机推荐

  1. Python爬虫实战:使用Selenium抓取QQ空间好友说说

    前面我们接触到的,都是使用requests+BeautifulSoup组合对静态网页进行请求和数据解析,若是JS生成的内容,也介绍了通过寻找API借口来获取数据. 但是有的时候,网页数据由JS生成,A ...

  2. segmenter_worker.go

    package; ; i < engine.initOptions.NumShards; i++ {                 if i == shard {                ...

  3. authorizations.go

    {         return nil, fmt.Errorf("invalid TTL %d (must be >0)", authState.TTL)     }    ...

  4. MySQL 慢查询日志总结

    慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志 ...

  5. 【NOI赛前训练】——专项测试1·网络流

    T1: 题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1, ...

  6. APP版本更新通知流程测试要点

    一.APP版本更新通知流程图如下: 二.测试注意点: 1.Android更新直接下载APK,IOS引导至APP Store更新页面: 强制更新------只有"立即更新" 1.一般 ...

  7. window 7 安装Jmeter并配置https录制脚本

    安装与环境配置: http://blog.csdn.net/hhuangdanfeng/article/details/51564765 http://blog.csdn.net/u010573212 ...

  8. LSTM实现中文文本情感分析

    1. 背景介绍 文本情感分析是在文本分析领域的典型任务,实用价值很高.本模型是第一个上手实现的深度学习模型,目的是对深度学习做一个初步的了解,并入门深度学习在文本分析领域的应用.在进行模型的上手实现之 ...

  9. 在ASP.NET Core中给上传图片功能添加水印

    在传统的.NET框架中,我们给图片添加水印有的是通过HttpModules或者是HttpHandler,然后可以通过以下代码添加水印: var image = new WebImage(imageBy ...

  10. Access2007数据库下载地址与AccessHelper

    链接:https://pan.baidu.com/s/1pLzOlTv0nqSbhzujHZht1w 提取码:1m9l AccessHelper: using System; using System ...