转载请标明出处:  http://write.blog.csdn.net/postedit/45721779作者:skay

一般项目中有防盗版的需求,必须是正版软件才能使用,这就需要获取当前安装包的签名信息和提前规定的签名,Md5值做验证,或者发布时候要检验apk签名信息以防止发错包,造成不必要的损失。

获取签名信息,通过遍历已安装的apk 获得安装过的对应apk是否与已知apk签名一致

,包名你也可以指定任意已安装过的apk,可以获取第三方apk的签名.

/**
	 * 获取签名信息
	 *
	 * @param aContext
	 *            Context
	 * @return 签名String
	 */
	@SuppressWarnings("unused")
	private byte[] getSign(String mPakgeName) {

		List<PackageInfo> apps = pManager.getInstalledPackages(PackageManager.GET_SIGNATURES);

		Iterator<PackageInfo> iter = apps.iterator();

		PackageInfo info;
		while (iter.hasNext()) {
			info = iter.next();

			if (TextUtils.equals(info.packageName, mPakgeName)) {
				if (info.signatures.length > 0) {
					return info.signatures[0].toCharsString().getBytes();
				}
			}
		}
		return null;
	}

2   得到字节后 ,需要转化出成md5

	 /** 得到签名.
	 * @param mPakgeName
	 * @return
	 */
	private String  getgetSignMd5(String mPakgeName) {
		    byte[] signatture = getSign(mPakgeName);

		    if (signatture == null) {
	            return null;
	        }

		    if (TextUtils.isEmpty(signatture.toString()))  {
		       return null;
		    }

	    	try {
				digest = MessageDigest.getInstance("Md5");
				digest.update(signatture);
			} catch (NoSuchAlgorithmException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			//此处为第三方应用使用的签名算法
	    	  byte[] b = digest.digest();
	    	  char[] HEXCHAR = {
	    			  //列举一个签名算法 ,此处应是你方应用自己的算法
	                  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
	                  'a', 'b', 'c', 'd', 'e', 'f'
	          };
	          StringBuilder sb = new StringBuilder(b.length * 2);

	          for (int i = 0; i < b.length; i++) {
	              sb.append(HEXCHAR[(b[i] & 0xf0) >>> 4]);
	              sb.append(HEXCHAR[(b[i] & 0x0f)]);
	          }

			return sb.toString();
	 }

3 有时候我们需要获得非系统apk应用信息

/** 获取非预装的app
	 * @return
	 */
	public static List<PackageInfo> getAllApps() {
	    apps = new ArrayList<PackageInfo>();
	    paklist = pManager.getInstalledPackages(0);
	    for (int i = 0; i < paklist.size(); i++) {
	        PackageInfo pak = (PackageInfo) paklist.get(i);
	        //判断是否为非系统预装的应用程序
	        if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) { 

	            apps.add(pak);
	        }
	    }
	    return apps;
	}

xml 布局很简单 因此不再多说 不说了。比如获取微博的签名信息(传入微博的包名即可)。

apk下载地址:http://download.csdn.net/detail/sk719887916/8828765

最新文章

  1. dubbox 增加google-gprc/protobuf支持
  2. High购电商系统开发注意点
  3. 《Python 学习手册4th》 第十五章 文档
  4. [转载]delete指针之后应该赋值NULL
  5. android 5.0新特性学习--CardView
  6. javascript访问html元素的内容(2)
  7. whereis命令详解
  8. Django-website 程序案例系列-12 CSRF
  9. go语言求1到100之内的质数
  10. caffe 中solver.prototxt
  11. Oracle 查询表的字段注释
  12. 安装opencv3.x卡在ICV: Downloading ippicv_linux_20151201.tgz...
  13. 【Linux】文件夹及作用说明
  14. Debian8 下面 muduo库编译与使用
  15. configure: error: libpam required but missing
  16. Android-aidl, binder,surfaceview
  17. 软件测试模型---V模型、W模型、H模型、X模型
  18. No.2一步步学习vuejs 实例demo篇
  19. 【Python】python基础_代码编写注意事项
  20. 【tarjan+缩点】BZOJ1051-受欢迎的牛

热门文章

  1. linux下安装apache(httpd-2.4.3版本)各种坑
  2. rbac 概念
  3. Python descriptor
  4. Unsupported&#160;major.minor&#160;version&#160;52.0
  5. ZAB协议
  6. Linux--Web应用服务和MySQL数据库
  7. [supervisor] 使用小记(入门教程)
  8. 非ROOT实现静默安装的一些思考与体会,AIDL获取IPackageManager,反射ServiceManager,系统签名
  9. linux shell 判断文件是否存在等符号
  10. Objc中处理数组越界的一种办法