在微信开放平台等申请API key 和secret时经常要用到apk文件签名,那么如何读取呢?

下面贴一下相关读取源码:

一共两个文件MainActivity和MD5,

  1. package com.lcg.gensinature;
  2.  
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.content.Context;
  6. import android.content.DialogInterface;
  7. import android.content.pm.PackageInfo;
  8. import android.content.pm.PackageManager;
  9. import android.content.pm.PackageManager.NameNotFoundException;
  10. import android.content.pm.Signature;
  11. import android.os.Bundle;
  12. import android.text.ClipboardManager;
  13. import android.text.Editable;
  14. import android.text.TextUtils;
  15. import android.util.Log;
  16. import android.view.View;
  17. import android.view.View.OnClickListener;
  18. import android.widget.Button;
  19. import android.widget.EditText;
  20. import android.widget.TextView;
  21. import android.widget.Toast;
  22.  
  23. public class MainActivity extends Activity
  24. {
  25. private Button mCopyBtn;
  26. private Button mGenBtn;
  27. private EditText mPackageEt;
  28. private TextView md5SignTv;
  29.  
  30. public static byte[] getSign(Context paramContext, String paramString)
  31. {
  32.  
  33. PackageInfo localPackageInfo;
  34. int i;
  35. byte[] arrayOfByte;
  36. try
  37. {
  38. localPackageInfo = paramContext.getPackageManager().getPackageInfo(paramString, 64);
  39. i = 0;
  40. if (i >= localPackageInfo.signatures.length)
  41. {
  42.  
  43. return null;
  44. }
  45. System.out.println(i);
  46. arrayOfByte = localPackageInfo.signatures[i].toByteArray();
  47. System.out.println(arrayOfByte);
  48. return arrayOfByte;
  49. }
  50. catch (PackageManager.NameNotFoundException localNameNotFoundException)
  51. {
  52. return null;
  53. }
  54.  
  55. }
  56.  
  57. protected void onCreate(Bundle paramBundle)
  58. {
  59. super.onCreate(paramBundle);
  60. setContentView(R.layout.activity_main);
  61. this.mPackageEt = ((EditText)findViewById(R.id.pkgNameEt));
  62. this.mGenBtn = ((Button)findViewById(R.id.getBtn));
  63. this.mGenBtn.setOnClickListener(new View.OnClickListener()
  64. {
  65. public void onClick(View paramView)
  66. {
  67. String str1 = MainActivity.this.mPackageEt.getText().toString();
  68. if (TextUtils.isEmpty(str1));
  69. byte[] arrayOfByte;
  70.  
  71. arrayOfByte = MainActivity.getSign(MainActivity.this.getApplicationContext(), str1);
  72.  
  73. String str2 = "";
  74. try
  75. {
  76. str2 = MD5.hexdigest(arrayOfByte);
  77. Log.d("genSinature", "gen md5=" + str2);
  78. System.out.println(str2);
  79. MainActivity.this.md5SignTv.setText(str2);
  80.  
  81. ClipboardManager cmb = (ClipboardManager)MainActivity.this.getSystemService(MainActivity.this.CLIPBOARD_SERVICE);
  82. cmb.setText(str2);
  83. Toast.makeText(MainActivity.this, "已经复制到剪贴板", 1).show();
  84. return;
  85. }
  86. catch (Exception e)
  87. {
  88. e.printStackTrace();
  89. }
  90. }
  91. });
  92. this.md5SignTv = ((TextView)findViewById(R.id.resultTv));
  93.  
  94. showDialog();
  95. }
  96.  
  97. private void showDialog()
  98. {
  99. AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);
  100. localBuilder.setCancelable(false);
  101. localBuilder.setTitle("警告ʾ").setMessage("将读取APP信息");
  102. localBuilder.setPositiveButton("拒绝", null);
  103. localBuilder.setNegativeButton("同意", new DialogInterface.OnClickListener()
  104. {
  105. public void onClick(DialogInterface paramDialogInterface, int paramInt)
  106. {
  107. MainActivity.this.finish();
  108. }
  109. });
  110. localBuilder.show();
  111. }
  112. }

  

  1. package com.lcg.gensinature;
  2.  
  3. import java.security.MessageDigest;
  4.  
  5. public class MD5
  6. {
  7. private static final char[] hexDigits = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102 };
  8.  
  9. public static String hexdigest(String paramString)
  10. {
  11. try
  12. {
  13. String str = hexdigest(paramString.getBytes());
  14. return str;
  15. }
  16. catch (Exception localException)
  17. {
  18. }
  19. return null;
  20. }
  21.  
  22. public static String hexdigest(byte[] paramArrayOfByte)
  23. {
  24. try
  25. {
  26. MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
  27. System.out.println(paramArrayOfByte);
  28. localMessageDigest.update(paramArrayOfByte);
  29. byte[] arrayOfByte = localMessageDigest.digest();
  30. System.out.println(arrayOfByte);
  31.  
  32. char[] arrayOfChar = new char[32];
  33. int i = 0;
  34. int j = 0;
  35. for(i=0;i<16;i++){
  36.  
  37. int k = arrayOfByte[i];
  38. int l = j + 1;
  39. arrayOfChar[j] = hexDigits[(0xF & k >>> 4)];
  40. j = l + 1;
  41. arrayOfChar[l] = hexDigits[(k & 0xF)];
  42. }
  43. if (i >= 16)
  44. return new String(arrayOfChar);
  45. }
  46. catch (Exception e)
  47. {
  48. e.printStackTrace();
  49. }
  50. return null;
  51. }
  52. }

  更多精彩内容请访问 http://www.leegtang.com

读取Android APK文件签名的方法的更多相关文章

  1. android apk的签名和权限问题

    一. android apk的签名问题(http://blog.csdn.net/lyq8479/article/details/6401093) 1.为什么要给Android应用程序签名?      ...

  2. apk文件签名绕过

    声明: 1.本文转载自:http://www.2cto.com/Article/201311/256406.html,为了留作日后参考上传博客 2.如有转载请复试上面连接,尊重原创 apk文件签名绕过 ...

  3. 如何给apk文件签名

    1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...

  4. Visual Studio 2017为Android APK包签名

    Visual Studio 2017为Android APK包签名   为Android APK包签名,可以保证后期的App顺利升级.在Visual Studio 2015中,IDE会自动生成两个AP ...

  5. Android之APK文件签名——keytool和jarsigner

    一.生成密钥库将位置定位在jdk的bin文件中,输入以下命名行:keytool -genkey -alias ChangeBackgroundWidget.keystore -keyalg RSA - ...

  6. [Android]使用platform密钥来给apk文件签名的命令

    1.使用platform密钥对apk进行签名 1.1.进入<Android_Source_Path>/build/target/product/security,找到[platform.p ...

  7. Android APK如何签名

    Android项目以它的包名作为唯一标识,如果在同一设备上安装两个相同的应用,后面安装的应用就会覆盖前面安装的应用.为了避免这种情况的发生,我们需要对作为产品发布的应用进行签名. 签名其实有两个作用: ...

  8. android APK 文件的生成过程

    步骤: 1. 用 aapt工具生成R文件aapt  package  -m -J  gen目录 -M AndroidManifest.xml  -S res目录  -I 编译版本sdk的android ...

  9. (转载)重新对APK文件签名

    1.将证书(debug.keystore)复制到与需要重新签名的apk文件相同的目录下(如:复制到D:\Sign) 2.在cmd中切换到需要重新签名的apk文件的目录下 3.使用WinRAR打开要重新 ...

随机推荐

  1. java+数据库+D3.js 实时查询人物关系图

    先看下 效果 某个用户,邀请了自己的朋友 ,自己的朋友邀请了其他朋友,1 展示邀请关系,2 点击头像显示邀请人和被邀请人的关系.(网上这种资料很少, 另外很多都是从JSON文件取 数据, 这里是从数据 ...

  2. WinDbug抓取进程dump

    安装WinDbug(包含在 Windows Kits-debugger 中)后,运行如下命令将会在 explorer.exe进程发生崩溃后抓取相应的内存数据到D盘根目录下的一个文件夹中 adplus. ...

  3. Andriod:如何卸载模拟器上已经安装的应用程序?

    根据学习对HelloWorld进行手术的时候,遇到了一个问题: 就是在修改了布局后,重新链接模拟器时报错: Installing helloworld.apk... Re-installation f ...

  4. Open quote is expected for attribute "{1}" associated with an element type "name".

    xml属性必须用引号“”,不能缺少.

  5. I18N 国际编码

    <%@ page language="java" import="java.util.*, cn.hncu.domain.*" pageEncoding= ...

  6. HDU2076

    夹角有多大(题目已修改,注意读题) Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. (原创)speex与wav格式音频文件的互相转换(二)

    之前写过了如何将speex与wav格式的音频互相转换,如果没有看过的请看一下连接 http://www.cnblogs.com/dongweiq/p/4515186.html 虽然自己实现了相关的压缩 ...

  8. 解决无法获取 GridView 隐藏列值问题

    今天遇到了一个要获取GridView隐藏列值的问题,试了好几种方法,要么获取不到,要么获取到了类列的值也隐藏了,但在样式中这一列会多出一块,,但最后找到了一个功能实现而且实现了列完美隐藏的方法和大家分 ...

  9. 3dmax使用K帧工具创建一个行走动作

    第一步,创建一个biped骨骼. 这个就不截图了,因为基本都会. 记住一点,先改变了关键点再去修改,不然修改的是前一个关键帧的动作. 第二步,开启自动关键帧,然后给初始位置双脚添加踩踏关键点.设置关键 ...

  10. [python]pep8编码规范

    一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车.3 类 ...