平時都是用AS敲命令獲取簽名信息。。。還沒有在代碼中獲取過簽名~
也算是老編程了,沒做過這個稍微有點尷尬。。。本着有好輪子就用的原則,網上找了幾篇博客,這塊內容已經很完善了,我也沒什么可以優化的。。。
主要參(zhao)考(chao)了http://blog.csdn.net/hcwfc/article/details/41560591這篇博客,下面貼上代碼:
獲取簽名封裝類:
public class AppInfoUtils {
public final static String SHA1 = "SHA1";
/**
* 返回一個簽名的對應類型的字符串
*
* @param context
* @param packageName
* @param type
*
* @return
*/
public static String getSingInfo(Context context, String packageName, String type) {
String tmp = null;
Signature[] signs = getSignatures(context, packageName);
for (Signature sig : signs) {
if (SHA1.equals(type)) {
tmp = getSignatureString(sig, SHA1);
break;
}
}
return tmp;
}
/**
* 返回對應包的簽名信息
*
* @param context
* @param packageName
*
* @return
*/
public static Signature[] getSignatures(Context context, String packageName) {
PackageInfo packageInfo = null;
try {
packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
return packageInfo.signatures;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 獲取相應的類型的字符串(把簽名的byte[]信息轉換成16進制)
*
* @param sig
* @param type
*
* @return
*/
public static String getSignatureString(Signature sig, String type) {
byte[] hexBytes = sig.toByteArray();
String fingerprint = "error!";
try {
MessageDigest digest = MessageDigest.getInstance(type);
if (digest != null) {
byte[] digestBytes = digest.digest(hexBytes);
StringBuilder sb = new StringBuilder();
for (byte digestByte : digestBytes) {
sb.append((Integer.toHexString((digestByte & 0xFF) | 0x100)).substring(1, 3));
}
fingerprint = sb.toString();
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return fingerprint;
}
}
在代碼中調用(獲取SHA1值):
String signal = AppInfoUtils.getSingInfo(getApplicationContext(), getPackageName(), AppInfoUtils.SHA1);
同理,我們也可以獲取MD5和SHA256的值。
不習慣直接轉載,喜歡自己擼一下,不過文中肯定會附上原作的id的~
