首页 文章 精选 留言 我的

精选列表

搜索[安全相关],共10011篇文章
优秀的个人博客,低调大师

Java操作Windows剪切板相关函数示例

以下共有4个函数分别是: 1.从剪切板获得文字。 2.将字符串复制到剪切板。 3.从剪切板获得图片。 4.复制图片到剪切板。 [java] view plain copy /** *从剪切板获得文字。 */ publicstaticStringgetSysClipboardText(){ Stringret=""; ClipboardsysClip=Toolkit.getDefaultToolkit().getSystemClipboard(); //获取剪切板中的内容 TransferableclipTf=sysClip.getContents(null); if(clipTf!=null){ //检查内容是否是文本类型 if(clipTf.isDataFlavorSupported(DataFlavor.stringFlavor)){ try{ ret=(String)clipTf .getTransferData(DataFlavor.stringFlavor); }catch(Exceptione){ e.printStackTrace(); } } } returnret; } /** *将字符串复制到剪切板。 */ publicstaticvoidsetSysClipboardText(StringwriteMe){ Clipboardclip=Toolkit.getDefaultToolkit().getSystemClipboard(); TransferabletText=newStringSelection(writeMe); clip.setContents(tText,null); } /** *从剪切板获得图片。 */ publicstaticImagegetImageFromClipboard()throwsException{ Clipboardsysc=Toolkit.getDefaultToolkit().getSystemClipboard(); Transferablecc=sysc.getContents(null); if(cc==null) returnnull; elseif(cc.isDataFlavorSupported(DataFlavor.imageFlavor)) return(Image)cc.getTransferData(DataFlavor.imageFlavor); returnnull; } /** *复制图片到剪切板。 */ publicstaticvoidsetClipboardImage(finalImageimage){ Transferabletrans=newTransferable(){ publicDataFlavor[]getTransferDataFlavors(){ returnnewDataFlavor[]{DataFlavor.imageFlavor}; } publicbooleanisDataFlavorSupported(DataFlavorflavor){ returnDataFlavor.imageFlavor.equals(flavor); } publicObjectgetTransferData(DataFlavorflavor) throwsUnsupportedFlavorException,IOException{ if(isDataFlavorSupported(flavor)) returnimage; thrownewUnsupportedFlavorException(flavor); } }; Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null); }

优秀的个人博客,低调大师

Android插件化开发核心类ClassLoader相关详解

最近在研究插件化开发,顺便就了解了 ClassLoader 这个类加载器,顺藤摸瓜,查到了jvm里面的双亲委派模型,这里就简单的讲一下什么是预定义类加载器和双亲委派模型? 学好java基础,顺便学好jvm虚拟机,对阅读源码和插件化开发很有帮助。 1、预定义类加载器 JVM预定义的三种类型类加载器: 1.启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib 下面的类库加载到内存中(比如 rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。 2.标准扩展(Extension)类加载器:是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将 < Java_Runtime_Home >/lib/ext 或者由系统变量 java.ext.dir 指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。 3.系统(System)类加载器:是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。由于这个类加载器是 ClassLoader 中的 getSystemClassLoader() 方法的返回值,所以一般也被称为系统类加载器。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。 除了以上列举的三种类加载器,还有一种比较特殊的类型 — 线程上下文类加载器。 应用程序由这三种类加载器互相配合进行加载的,如果有必须,还可以加入自己定义的类加载器。这些类加载器之间的关系一般如下图: 类加载器之间的关系 2、双亲委派模型(双亲委派机制) 双亲委派模型要求除了顶层的启动类加载器之外,其余的类加载器都应当有自己的父类加载器。这里的类加载器之间的父子关系一般不会以继承的关系来实现,而是使用组合关系来复用父加载器的代码。 双亲委派模型的式作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完全这个加载请求时,子加载器才会尝试自己去加载。 3、双亲委派模型的破坏 1、第1次“被破坏” 双亲委派模型的第一次“被破坏”其实发生在双亲委派模型出现之前--即JDK1.2发布之前。由于双亲委派模型是在JDK1.2之后才被引入的,而类加载器和抽象类 java.lang.ClassLoader 则是JDK1.0时候就已经存在,面对已经存在 的用户自定义类加载器的实现代码,Java设计者引入双亲委派模型时不得不做出一些妥协。为了向前兼容,JDK1.2之后的 java.lang.ClassLoader 添加了一个新的 proceted 方法 findClass() ,在此之前,用户去继承 java.lang.ClassLoader 的唯一目的就是重写 loadClass() 方法,因为虚拟在进行类加载的时候会调用加载器的私有方法 loadClassInternal(),而这个方法的唯一逻辑就是去调用自己的 loadClass() 。JDK1.2之后已不再提倡用户再去覆盖 loadClass() 方法,应当把自己的类加载逻辑写到 findClass() 方法中,在 loadClass() 方法的逻辑里,如果父类加载器加载失败,则会调用自己的findClass()方法来完成加载,这样就可以保证新写出来的类加载器是符合双亲委派模型的。 2、第2次“被破坏” 双亲委派模型的第二次“被破坏”是这个模型自身的缺陷所导致的,双亲委派模型很好地解决了各个类加载器的基础类统一问题(越基础的类由越上层的加载器进行加载),基础类之所以被称为“基础”,是因为它们总是作为被调用代码调用的API。但是,如果基础类又要调用用户的代码,那该怎么办呢。 这并非是不可能的事情,一个典型的例子便是JNDI服务,它的代码由启动类加载器去加载(在JDK1.3时放进 rt.jar ),但JNDI的目的就是对资源进行集中管理和查找,它需要调用独立厂商实现部部署在应用程序的classpath下的JNDI接口提供者 (SPI, Service Provider Interface) 的代码,但启动类加载器不可能“认识”之些代码,该怎么办? 为了解决这个困境,Java设计团队只好引入了一个不太优雅的设计:线程上下文件类加载器(Thread Context ClassLoader)。这个类加载器可以通过 java.lang.Thread 类的 setContextClassLoader() 方法进行设置,如果创建线程时还未设置,它将会从父线程中继承一个;如果在应用程序的全局范围内都没有设置过,那么这个类加载器默认就是应用程序类加载器。了有线程上下文类加载器,JNDI服务使用这个线程上下文类加载器去加载所需要的SPI代码,也就是父类加载器请求子类加载器去完成类加载动作,这种行为实际上就是打通了双亲委派模型的层次结构来逆向使用类加载器,已经违背了双亲委派模型,但这也是无可奈何的事情。Java中所有涉及SPI的加载动作基本上都采用这种方式,例如JNDI,JDBC,JCE,JAXB和JBI等。 3、第3次“被破坏” 双亲委派模型的第三次“被破坏”是由于用户对程序的动态性的追求导致的,例如OSGi的出现。在OSGi环境下,类加载器不再是双亲委派模型中的树状结构,而是进一步发展为网状结构。 4、几点思考 1、Bootstrap类 Java虚拟机的第一个类加载器是Bootstrap,这个加载器很特殊,它不是Java类,因此它不需要被别人加载,它嵌套在Java虚拟机内核里面,也就是JVM启动的时候Bootstrap就已经启动,它是用C++写的二进制代码(不是字节码),它可以去加载别的类。 这也是我们在测试时为什么发现System.class.getClassLoader()结果为null的原因,这并不表示System这个类没有类加载器,而是它的加载器比较特殊,是BootstrapClassLoader,由于它不是Java类,因此获得它的引用肯定返回null。 2、委托机制具体含义 当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢? 首先当前线程的类加载器去加载线程中的第一个类(假设为类A)。 注:当前线程的类加载器可以通过Thread类的getContextClassLoader()获得,也可以通过setContextClassLoader()自己设置类加载器。 如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器去加载类B。 还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。 3、委托机制的意义 — 防止内存中出现多份同样的字节码 比如两个类A和类B都要加载System类: 如果不用委托而是自己加载自己的,那么类A就会加载一份System字节码,然后类B又会加载一份System字节码,这样内存中就出现了两份System字节码。 如果使用委托机制,会递归的向父类查找,也就是首选用Bootstrap尝试加载,如果找不到再向下。这里的System就能在Bootstrap中找到然后加载,如果此时类B也要加载System,也从Bootstrap开始,此时Bootstrap发现已经加载过了System那么直接返回内存中的System即可而不需要重新加载,这样内存中就只有一份System的字节码了。 5、一道面试题:能不能自己写个类叫java.lang.System? 答案: 通常不可以,但可以采取另类方法达到这个需求。 解释: 为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸们能找到的类,儿子就没有机会加载。而System类是Bootstrap加载器加载的,就算自己重写,也总是使用Java系统提供的System,自己写的System类根本没有机会得到加载。 但是,我们可以自己定义一个类加载器来达到这个目的,为了避免双亲委托机制,这个类加载器也必须是特殊的。由于系统自带的三个类加载器都加载特定目录下的类,如果我们自己的类加载器放在一个特殊的目录,那么系统的加载器就无法加载,也就是最终还是由我们自己的加载器加载。 参考文章: 深入理解Java虚拟机笔记---双亲委派模型关于Java类加载双亲委派机制的思考(附一道面试题)

优秀的个人博客,低调大师

4.4、Libgdx用法查询执行环境相关性

(原版的:http://www.libgdx.cn/topic/46/4-4-libgdx%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E6%9F%A5%E8%AF%A2%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E7%9B%B8%E5%85%B3%E5%B1%9E%E6%80%A7) Application接口提供了多种方法查询执行环境的属性。 获取当前应用类型 有时候须要依据特定平台进行特别的操作。Application.getType()用来返回当前正在执行的平台,示比例如以下: switch (Gdx.app.getType()) { case Android: // android specific code break; case Desktop: // desktop specific code break; case WebGl: // HTML5 specific code break; default: // Other platforms specific code } 在Android中,还能够查询当前Android的版本号: int androidVersion = Gdx.app.getVersion(); 这将返回当前使用的SDK版本号。比方3相应Android1.5。 (www.libgdx.cn版权所有所有。如需转载。注明出处) 版权声明:本文博客原创文章。博客,未经同意,不得转载。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4681095.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android——进程通信/ AIDL/Message相关知识总结贴

Android 多进程通信 http://www.apkbus.com/android-83462-1-1.html Android 跨进程通信(一) http://www.apkbus.com/android-2393-1-1.html Android 跨进程通信(二) http://www.apkbus.com/android-2394-1-1.html Android 中 AIDL 实现(跨进程通信) http://www.apkbus.com/android-15211-1-1.html Android 进程间通信 http://www.apkbus.com/android-91355-1-1.html Android 系统进程间通信 Binder 机制 http://www.apkbus.com/android-112500-1-1.html 使用AIDL实现进程间的通信 http://www.apkbus.com/android-114839-1-1.html Android进程间通信(IPC)机制Binder简要介绍和学习计划 http://www.apkbus.com/android-99739-1-1.html 服务组件的进程间通信模型 http://www.apkbus.com/android-83850-1-1.html 使用AIDL实现进程间的通信之复杂类型传递 http://www.apkbus.com/android-114840-1-1.html 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client http://www.apkbus.com/android-99743-1-1.html android 组件间的交互和进程间 IPC 通信 http://www.apkbus.com/android-20707-1-1.html Android 之 Binder与进程间通信 http://www.apkbus.com/android-43314-1-1.html Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析 http://www.apkbus.com/android-99747-1-1.html Android进程间通信--消息机制及IPC机制实现 http://www.apkbus.com/android-3944-1-1.html 本文转自qianqianlianmeng博客园博客,原文链接:http://www.cnblogs.com/aimeng/p/3298609.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

找免费WiFi不用愁 Facebook将出相关APP

想知道哪儿有免费的Wi-Fi?以后iPhone用户打开Facebook的APP或许就能很快地找到附近的公共免费Wi-Fi了。Facebook日前证实,他们将在iOS版APP中推出搜寻公共Wi-Fi的功能,不过该项功能目前仅支持iOS使用。 Facebook将在iOS版APP中推出搜寻公共Wi-Fi的功能 据了解,这项功能会藏在功能表的“设定”里,被称作“Find Wi-Fi(寻找Wi-Fi)”。用户在启用后,Facebook App就会自动搜寻附近的可用Wi-Fi,并呈现在地图上。不过,鉴于目前Facebook只在某些指定的国家内推出该功能,所以该应用尚无法全面有效。 “寻找免费Wi-Fi”或许也是Facebook继先前的无人机与卫星网络计划后,另一项提供上网途径的推广策略,同时目标用户也比较针对发展中国家的城市居民,而不是农村。3年前Facebook也曾与思科合作,为商家部署Wi-Fi。一旦用户在商家的粉丝团专页登录,就可以通过Facebook帐号,自动登入并使用店家的上网服务。 该寻找Wi-Fi的小工具,应该是通过Wi-Fi的信号强度,来反向判断无线热点的位置。实际上目前的手机也普遍会结合Wi-Fi热点的信号,来帮助进行GPS定位,因此Facebook的方法或许也是采用该理念而设计的应用。 不过,由于该功能操作的简便性,将能够侧面帮助实体商家展示广告,同时帮助Facebook APP构建出更多特色功能,来吸引新用户和提升老用户的粘性。但关于该应用的进一步演进,Facebook尚未给出更多介绍。 本文转自d1net(转载)

优秀的个人博客,低调大师

正确理解SQL Server配置timeout相关选项

正确理解SQL Server配置选项“remote login timeout”和“remote query timeout” 查看配置选项的设置 sp_configure 远程登录超时 参考:https://msdn.microsoft.com/en-us/library/ms175136.aspx “The remote login timeout option specifies the number of seconds to wait before returning from a failed attempt to log in to a remote server. For example, if you are trying to log in to a remote server and that server is down, remote login timeout helps make sure that you do not have to wait indefinitely before your computer stops trying to log in. The default value for this option is 10 seconds. A value of 0 allows for an infinite wait. The default value for this option is 20 seconds in SQL Server 2008. The remote login timeout option affects connections to OLE DB providers made for heterogeneous queries. The setting takes effect immediately without restarting the server.” EXECsp_configure'remotelogintimeout',35; GO RECONFIGURE; GO 远程查询超时 参考:https://msdn.microsoft.com/en-us/library/ms189040.aspx “The remote query timeout option specifies how long, in seconds, a remote operation can take before SQL Server times out. The default value for this option is 600, which allows a 10-minute wait. This value applies to an outgoing connection initiated by the Database Engine as a remote query. This value has no effect on queries received by the Database Engine. To disable the time-out, set the value to 0. A query will wait until it is canceled. For heterogeneous queries, remote query timeout specifies the number of seconds (initialized in the command object using the DBPROP_COMMANDTIMEOUT rowset property) that a remote provider should wait for result sets before the query times out. This value is also used to set DBPROP_GENERALTIMEOUT if supported by the remote provider. This will cause any other operations to time out after the specified number of seconds. For remote stored procedures, remote query timeout specifies the number of seconds that must elapse after sending a remote EXEC statement before the remote stored procedure times out. The setting takes effect immediately without restarting the server. ” EXECsp_configure'remotequerytimeout',0; GO RECONFIGURE; GO 远程服务器和链接服务器的对应选项 参考:https://msdn.microsoft.com/en-us/library/ms178532.aspx sp_serveroption[@server=]'server' ,[@optname=]'option_name' ,[@optvalue=]'option_value'; connect timeout Time-out valuein seconds for connecting to a linked server. If 0, use the sp_configure default. query timeout Time-out value for queries against a linked server. If 0, use the sp_configure default. 我只简单解释一句,这几个选项只是针对“outgoing connections”。

优秀的个人博客,低调大师

项目实战工具类(一):PhoneUtil(手机信息相关)

可以使用的功能: 1、获取手机系统版本号 2、获取手机型号 3、获取手机宽度 4、获取手机高度 5、获取手机imei串号 ,GSM手机的 IMEI 和 CDMA手机的 MEID. 6、获取手机sim卡号 7、获取手机号 8、判断sd卡是否挂载 9、获取sd卡剩余空间的大小 10、获取sd卡空间的总大小 11、判断是否是平板 12、判断一个apk是否安装 13、拨打电话 14、打开网页 15、获取应用权限 名称列表 16、获取手机内安装的应用 17、获取手机安装非系统应用 18、获取安装应用的信息 19、打开指定包名的应用 20、卸载指定包名的应用 21、手机号判断 工具类: 1 import java.io.File; 2 import java.util.ArrayList; 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 import java.util.regex.Matcher; 7 import java.util.regex.Pattern; 8 9 import android.content.Context; 10 import android.content.Intent; 11 import android.content.pm.ApplicationInfo; 12 import android.content.pm.PackageInfo; 13 import android.content.pm.PackageManager; 14 import android.content.pm.PackageManager.NameNotFoundException; 15 import android.content.pm.PermissionGroupInfo; 16 import android.content.pm.PermissionInfo; 17 import android.content.pm.ResolveInfo; 18 import android.content.res.Configuration; 19 import android.net.Uri; 20 import android.os.Environment; 21 import android.os.StatFs; 22 import android.telephony.TelephonyManager; 23 import android.util.TypedValue; 24 import android.view.WindowManager; 25 26 public class PhoneUtil { 27 private static PhoneUtil phoneUtil; 28 29 public static PhoneUtil getInstance() { 30 if (phoneUtil == null) { 31 synchronized (PhoneUtil.class) { 32 if (phoneUtil == null) { 33 phoneUtil = new PhoneUtil(); 34 } 35 } 36 } 37 return phoneUtil; 38 } 39 40 /** 41 * 获取手机系统版本号 42 * 43 * @return 44 */ 45 public int getSDKVersionNumber() { 46 int sdkVersion; 47 try { 48 sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK_INT); 49 } catch (NumberFormatException e) { 50 e.printStackTrace(); 51 sdkVersion = 0; 52 } 53 return sdkVersion; 54 } 55 56 /** 57 * 获取手机型号 58 */ 59 public String getPhoneModel() { 60 return android.os.Build.MODEL; 61 } 62 63 /** 64 * 获取手机宽度 65 */ 66 @SuppressWarnings("deprecation") 67 public int getPhoneWidth(Context context) { 68 WindowManager wm = (WindowManager) context 69 .getSystemService(Context.WINDOW_SERVICE); 70 return wm.getDefaultDisplay().getWidth(); 71 } 72 73 /** 74 * 获取手机高度 75 * 76 * @param context 77 */ 78 @SuppressWarnings("deprecation") 79 public int getPhoneHeight(Context context) { 80 WindowManager wm = (WindowManager) context 81 .getSystemService(Context.WINDOW_SERVICE); 82 return wm.getDefaultDisplay().getHeight(); 83 } 84 85 /** 86 * 获取手机imei串号 ,GSM手机的 IMEI 和 CDMA手机的 MEID. 87 * 88 * @param context 89 */ 90 public String getPhoneImei(Context context) { 91 TelephonyManager tm = (TelephonyManager) context 92 .getSystemService(Context.TELEPHONY_SERVICE); 93 if (tm == null) 94 return null; 95 return tm.getDeviceId(); 96 } 97 98 /** 99 * 获取手机sim卡号 100 * 101 * @param context 102 */ 103 public String getPhoneSim(Context context) { 104 TelephonyManager tm = (TelephonyManager) context 105 .getSystemService(Context.TELEPHONY_SERVICE); 106 if (tm == null) 107 return null; 108 return tm.getSubscriberId(); 109 } 110 111 /** 112 * 获取手机号 113 * 114 * @param context 115 */ 116 public String getPhoneNum(Context context) { 117 TelephonyManager tm = (TelephonyManager) context 118 .getSystemService(Context.TELEPHONY_SERVICE); 119 if (tm == null) 120 return null; 121 return tm.getLine1Number(); 122 } 123 124 /** 125 * 判断sd卡是否挂载 126 */ 127 public boolean isSDCardMount() { 128 if (android.os.Environment.getExternalStorageState().equals( 129 android.os.Environment.MEDIA_MOUNTED)) { 130 return true; 131 } else { 132 return false; 133 } 134 } 135 136 /** 137 * 获取sd卡剩余空间的大小 138 */ 139 @SuppressWarnings("deprecation") 140 public long getSDFreeSize() { 141 File path = Environment.getExternalStorageDirectory(); // 取得SD卡文件路径 142 StatFs sf = new StatFs(path.getPath()); 143 long blockSize = sf.getBlockSize(); // 获取单个数据块的大小(Byte) 144 long freeBlocks = sf.getAvailableBlocks();// 空闲的数据块的数量 145 // 返回SD卡空闲大小 146 return (freeBlocks * blockSize) / 1024 / 1024; // 单位MB 147 } 148 149 /** 150 * 获取sd卡空间的总大小 151 */ 152 @SuppressWarnings("deprecation") 153 public long getSDAllSize() { 154 File path = Environment.getExternalStorageDirectory(); // 取得SD卡文件路径 155 StatFs sf = new StatFs(path.getPath()); 156 long blockSize = sf.getBlockSize(); // 获取单个数据块的大小(Byte) 157 long allBlocks = sf.getBlockCount(); // 获取所有数据块数 158 // 返回SD卡大小 159 return (allBlocks * blockSize) / 1024 / 1024; // 单位MB 160 } 161 162 /** 163 * 判断是否是平板 164 */ 165 public boolean isTablet(Context context) { 166 return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; 167 } 168 169 /** 170 * 判断一个apk是否安装 171 * 172 * @param context 173 * @param packageName 174 */ 175 public boolean isApkInstalled(Context context, String packageName) { 176 PackageManager pm = context.getPackageManager(); 177 try { 178 pm.getPackageInfo(packageName, 0); 179 } catch (PackageManager.NameNotFoundException e) { 180 return false; 181 } 182 return true; 183 } 184 185 /** 186 * 拨打电话 187 * 188 * @param context 189 * @param phoneNum 190 */ 191 public void call(Context context, String phoneNum) throws Exception { 192 if (phoneNum != null && !phoneNum.equals("")) { 193 Uri uri = Uri.parse("tel:" + phoneNum); 194 Intent intent = new Intent(Intent.ACTION_DIAL, uri); 195 context.startActivity(intent); 196 } 197 } 198 199 /** 200 * 打开网页 201 */ 202 public void openWeb(Context context, String url) { 203 try { 204 Uri uri = Uri.parse(url); 205 context.startActivity(new Intent(Intent.ACTION_VIEW, uri)); 206 } catch (Exception e) { 207 e.printStackTrace(); 208 } 209 } 210 211 /** 212 * 获取应用权限 名称列表 213 */ 214 public String[] getAppPermissions(Context context) 215 throws NameNotFoundException { 216 PackageManager pm = context.getPackageManager(); 217 PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 218 PackageManager.GET_PERMISSIONS); 219 return getAppPermissions(packageInfo); 220 } 221 222 public String[] getAppPermissions(PackageInfo packageInfo) 223 throws NameNotFoundException { 224 return packageInfo.requestedPermissions; 225 } 226 227 /** 228 * 获取手机内安装的应用 229 */ 230 public List<PackageInfo> getInstalledApp(Context context) { 231 PackageManager pm = context.getPackageManager(); 232 return pm.getInstalledPackages(0); 233 } 234 235 /** 236 * 获取手机安装非系统应用 237 */ 238 @SuppressWarnings("static-access") 239 public List<PackageInfo> getUserInstalledApp(Context context) { 240 List<PackageInfo> infos = getInstalledApp(context); 241 List<PackageInfo> apps = new ArrayList<PackageInfo>(); 242 for (PackageInfo info : infos) { 243 if ((info.applicationInfo.flags & info.applicationInfo.FLAG_SYSTEM) <= 0) { 244 apps.add(info); 245 } 246 } 247 infos.clear(); 248 infos = null; 249 return apps; 250 } 251 252 /** 253 * 获取安装应用的信息 254 */ 255 public Map<String, Object> getInstalledAppInfo(Context context, 256 PackageInfo info) { 257 Map<String, Object> appInfos = new HashMap<String, Object>(); 258 PackageManager pm = context.getPackageManager(); 259 ApplicationInfo aif = info.applicationInfo; 260 appInfos.put("icon", pm.getApplicationIcon(aif)); 261 appInfos.put("lable", pm.getApplicationLabel(aif)); 262 appInfos.put("packageName", aif.packageName); 263 return appInfos; 264 } 265 266 /** 267 * 打开指定包名的应用 268 */ 269 public void startAppPkg(Context context, String pkg) { 270 Intent startIntent = context.getPackageManager() 271 .getLaunchIntentForPackage(pkg); 272 startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 273 context.startActivity(startIntent); 274 } 275 276 /** 277 * 卸载指定包名的应用 278 */ 279 public void unInstallApk(Context context, String packageName) { 280 Uri uri = Uri.parse("package:" + packageName); 281 Intent intent = new Intent(Intent.ACTION_DELETE); 282 intent.setData(uri); 283 context.startActivity(intent); 284 } 285 286 /** 287 * 手机号判断 288 */ 289 public static boolean isMobileNO(String mobile) { 290 Pattern p = Pattern 291 .compile("^((145|147)|(15[^4])|(17[0-9])|((13|18)[0-9]))\\d{8}$"); 292 Matcher m = p.matcher(mobile); 293 return m.matches(); 294 } 295 296 }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册