在使用百度地图,微信分享等等第三方SDK的时候,都需要在对应的网站上注册应用信息,其中之一就是通过包名和签名生成一个MD5或者SHA1编码的字符串。
通常情况下,这些信息可以通过ADT工具或者keytool命令工具去获取,这两种方式百度有很多就不再累述了。主要说一下怎么使用代码获取这些信息,然后也方便使用,不像微信提供的签名工具那么抠,都不能复制这些信息,极为不方便。
首先看一下使用keytool获取的签名信息:
证书指纹有3个类型,一般要求是前两个。这里就直接贴上代码获取这些证书指纹。
<span style="font-family: Arial, Helvetica, sans-serif;">/**</span>
* 应用签名信息
* Created by Carlton on 2014/11/27.
*/
public class AppSigning
{
public final static String MD5 = "MD5";
public final static String SHA1 = "SHA1";
public final static String SHA256 = "SHA256";
/**
* 返回一个签名的对应类型的字符串
*
* @param context
* @param packageName
* @param type
*
* @return
*/
public static ArrayList<String> getSingInfo(Context context, String packageName, String type)
{
ArrayList<String> result = new ArrayList<String>();
try
{
Signature[] signs = getSignatures(context, packageName);
for (Signature sig : signs)
{
String tmp = "error!";
if (MD5.equals(type))
{
tmp = getSignatureString(sig, MD5);
}
else if (SHA1.equals(type))
{
tmp = getSignatureString(sig, SHA1);
}
else if (SHA256.equals(type))
{
tmp = getSignatureString(sig, SHA256);
}
result.add(tmp);
}
}
catch (Exception e)
{
e.printStackTrace();
}
return result;
}
/**
* 返回对应包的签名信息
*
* @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;
}
}
如果你的keystore里面就只有一个签名信息,那么可以这样获取,以获取MD5为例:
String md5Info= AppSigning.<span style="font-family: Arial, Helvetica, sans-serif;">getSingInfo(context, "com.xxx",AppSigning.MD5).get(0);</span>