Android 壁纸中的许可证验证库

Android 壁纸中的许可证验证库,android,live-wallpaper,android-lvl,Android,Live Wallpaper,Android Lvl,我目前正试图在我的壁纸中实现谷歌的LVL,但似乎遇到了一个问题,我不熟悉一个例外。我发现这个问题对我帮助很大。其中一个建议是将代码放在引擎中,我选择将其放在上面的类中。代码似乎编译得很好,但在运行时我得到了一个异常,显然是因为我的公钥 FATAL EXCEPTION: main java.lang.RuntimeException: Unable to create service <my package>.MyWallpaper: java.lang.IllegalArgument

我目前正试图在我的壁纸中实现谷歌的LVL,但似乎遇到了一个问题,我不熟悉一个例外。我发现这个问题对我帮助很大。其中一个建议是将代码放在引擎中,我选择将其放在上面的类中。代码似乎编译得很好,但在运行时我得到了一个异常,显然是因为我的公钥

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to create service <my package>.MyWallpaper: java.lang.IllegalArgumentException: java.security.spec.InvalidKeySpecException: java.io.IOException: corrupted stream - out of bounds length found
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2076)
at android.app.ActivityThread.access$2500(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: java.security.spec.InvalidKeySpecException: java.io.IOException: corrupted stream - out of bounds length found
at com.android.vending.licensing.LicenseChecker.generatePublicKey(LicenseChecker.java:121)
at com.android.vending.licensing.LicenseChecker.<init>(LicenseChecker.java:92)
at com.metastable.epicvis.vis1.ScopeVisualizer.onCreate(ScopeVisualizer.java:41)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2066)
... 10 more
Caused by: java.security.spec.InvalidKeySpecException: java.io.IOException: corrupted stream - out of bounds length found
at org.bouncycastle.jce.provider.JDKKeyFactory.engineGeneratePublic(JDKKeyFactory.java:92)
at org.bouncycastle.jce.provider.JDKKeyFactory$RSA.engineGeneratePublic(JDKKeyFactory.java:396)
at java.security.KeyFactory.generatePublic(KeyFactory.java:177)
at com.android.vending.licensing.LicenseChecker.generatePublicKey(LicenseChecker.java:112)
... 13 more
致命异常:main
java.lang.RuntimeException:无法创建服务。MyWallpaper:java.lang.IllegalArgumentException:java.security.spec.InvalidKeySpecException:java.io.IOException:损坏的流-找到越界长度
位于android.app.ActivityThread.handleCreateService(ActivityThread.java:2076)
在android.app.ActivityThread.access上的$2500(ActivityThread.java:123)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:993)上
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:130)
位于android.app.ActivityThread.main(ActivityThread.java:3835)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:507)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:847)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
在dalvik.system.NativeStart.main(本机方法)
原因:java.lang.IllegalArgumentException:java.security.spec.InvalidKeySpecException:java.io.IOException:损坏的流-找到超出边界的长度
位于com.android.vending.licensing.LicenseChecker.generatePublicKey(LicenseChecker.java:121)
位于com.android.vending.licensing.LicenseChecker.(LicenseChecker.java:92)
位于com.metastable.epicvis.vis1.ScopeVisualizer.onCreate(ScopeVisualizer.java:41)
位于android.app.ActivityThread.handleCreateService(ActivityThread.java:2066)
... 10多
原因:java.security.spec.InvalidKeySpecException:java.io.IOException:损坏的流-找到超出边界的长度
位于org.bouncycastle.jce.provider.JDKKeyFactory.EngineeGeneratePublic(JDKKeyFactory.java:92)
在org.bouncycastle.jce.provider.JDKKeyFactory$RSA.engineGeneratePublic(JDKKeyFactory.java:396)上
位于java.security.KeyFactory.generatePublic(KeyFactory.java:177)
位于com.android.vending.licensing.LicenseChecker.generatePublicKey(LicenseChecker.java:112)
... 还有13个
以下是我使用的代码:

public class MyWallpaper extends WallpaperService implements LicenseCheckerCallback {

private LicenseChecker mChecker;
private static final String BASE64_PUBLIC_KEY = "My public key from google"; 
private byte[] salt = new byte[] {<20 random int>};
private String deviceId;
private AESObfuscator aes;


@Override
public void onCreate() {
    super.onCreate();
    deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
    aes = new AESObfuscator(salt, getPackageName(), deviceId);
    mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, aes), BASE64_PUBLIC_KEY);
    mChecker.checkAccess(this);
}

@Override
public void onDestroy() {
    super.onDestroy();
    mChecker.onDestroy();
}

@Override
public Engine onCreateEngine() {
    return new VisualizerEngine();
}

class MyEngine extends Engine implements SharedPreferences.OnSharedPreferenceChangeListener {
         <Unrelevant code removed>
}

@Override
public void allow() {
    Toast.makeText(this, "Allowed", Toast.LENGTH_SHORT);

}

@Override
public void dontAllow() {
    Toast.makeText(this, "Not Allowed", Toast.LENGTH_SHORT);

}

@Override
public void applicationError(ApplicationErrorCode errorCode) {
    // TODO Auto-generated method stub

}

}
公共类MyWallpaper扩展了Wallpaper服务,实现了LicenseCheckerCallback{
私人持牌人;
私有静态最终字符串BASE64\u PUBLIC\u KEY=“我的谷歌公钥”;
专用字节[]salt=新字节[]{};
私有字符串设备ID;
私家侦探;
@凌驾
public void onCreate(){
super.onCreate();
deviceId=Secure.getString(getContentResolver(),Secure.ANDROID_ID);
aes=新的aes模糊控制器(salt,getPackageName(),deviceId);
mChecker=新的LicenseChecker(这个,新的ServerManagedPolicy(这个,aes),BASE64_公钥);
mChecker.checkAccess(本);
}
@凌驾
公共空间{
super.ondestory();
mChecker.onDestroy();
}
@凌驾
公共引擎onCreateEngine(){
返回新的可视化引擎();
}
类MyEngine扩展引擎实现SharedReferences.OnSharedPreferenceChangeListener{
}
@凌驾
公共许可证{
Toast.makeText(此“允许”,Toast.LENGTH\u SHORT);
}
@凌驾
公共垃圾桶(){
Toast.makeText(此“不允许”,Toast.LENGTH\u SHORT);
}
@凌驾
公共无效applicationError(ApplicationErrorCode errorCode){
//TODO自动生成的方法存根
}
}
是否有某种方式可以格式化公钥,还是完全不同

例外情况来自:mChecker=newlicensecker(this,newservermanagedpolicy(this,aes),BASE64\u公钥)


如果有任何建议,我将不胜感激。

我已经解决了这个问题,显然我很讨厌复制和粘贴。我没有单击、拖动和选择我的密钥(我做了很多次,但仍然失败),而是简单地三次单击并正确复制。呵呵。

我已经解决了这个问题,显然我很讨厌复制和粘贴。我没有单击、拖动和选择我的密钥(我做了很多次,但仍然失败),而是简单地三次单击并正确复制。呵呵