Android应用程序崩溃的棒棒糖 [英] Android App crashes on Lollipop
问题描述
您好,我使用谷歌的许可检查我的应用程序也适用于API 19岁及以下,但崩溃的棒棒糖。我看到了code,它已被添加到我的许可检查code,但我不知道在哪里可以把这个code或我应该怎么修改。这里是我的code
日志:
java.lang.IllegalArgumentException:如果服务意向一定要明确:意向{行为= com.android.vending.licensing.ILicensingService}
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
在android.app.ActivityThread.access $ 800(ActivityThread.java:144)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1278)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:135)
在android.app.ActivityThread.main(ActivityThread.java:5221)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:899)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
java.lang.IllegalArgumentException异常:由造成服务意向一定要明确:意向{行为= com.android.vending.licensing.ILicensingService}
在android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1674)
在android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1773)
在android.app.ContextImpl.bindService(ContextImpl.java:1751)
在android.content.ContextWrapper.bindService(ContextWrapper.java:538)
在com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)
在appinventor.ai_drsalmanshah165.Clinical_Examination.Splash.doCheck(Splash.java:103)
在appinventor.ai_drsalmanshah165.Clinical_Examination.Splash.onCreate(Splash.java:51)
在android.app.Activity.performCreate(Activity.java:5933)
在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
... 10更多
Java的code:
公共类飞溅延伸活动{
MyLicenseCheckerCallback mLicenseCheckerCallback;
LicenseChecker mChecker;
byte []的盐=新的字节[] {
我的盐没有。 };
//处理程序mHandler;
串BASE64_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoxvDF3HGQtrRch14wCPN6nAxasak8X4shJM6bCumNS+6xRXTnRZOSyAvHNa1145KlE/i1sy/";
语境mContext;
的IBinder的ServiceBinder;
字符串的DeviceID;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
的setContentView(R.layout.splash);
mLicenseCheckerCallback =新MyLicenseCheckerCallback();
DEVICEID = Secure.getString(getContentResolver(),Secure.ANDROID_ID);
//构造一个政策LicenseChecker。
mChecker =新LicenseChecker(
这一点,(政策)新ServerManagedPolicy(Splash.this,新AESObfuscator(SALT,getPackageName(),DEVICEID)),
BASE64_PUBLIC_KEY);
doCheck();
}
私有类MyLicenseCheckerCallback实现LicenseCheckerCallback {
@覆盖
公共无效允许(INT原因){
// TODO自动生成方法存根
如果(isFinishing()){
//不要更新UI,如果活动是整理。
返回;
}
// Toast.makeText(Splash.this许可证验证,Toast.LENGTH_SHORT).show();
意向意图=新的意图(Splash.this,Home.class);
startActivity(意向);
完();
//应该允许用户访问。
//所以做什么
}
@覆盖
公共无效dontAllow(INT原因){
// TODO自动生成方法存根
如果(isFinishing()){
//不要更新UI,如果活动是整理。
返回;
}
// Toast.makeText(Splash.this,许可验证失败,Toast.LENGTH_SHORT).show();
CreateDialog函数();
}
@覆盖
公共无效的ApplicationError(INT错误code){
// TODO自动生成方法存根
}
}
@覆盖
保护无效的onDestroy(){
super.onDestroy();
mChecker.onDestroy();
}
私人无效doCheck(){
// mCheckLicenseButton.setEnabled(假);
setProgressBarIndeterminateVisibility(真正的);
/// mStatusText.setText(R.string.checking_license);
mChecker.checkAccess(mLicenseCheckerCallback);
}
公共无效CreateDialog函数(){
AlertDialog.Builder建设者=新AlertDialog.Builder(本);
builder.setTitle(盗版警告);
builder.setMessage(。这个应用程序是不许可的,请从Android Market购买它如果您错误接收了该消息,请与支持。);
builder.setPositiveButton(立即购买,新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话,诠释它){
意图marketIntent =新的意图(Intent.ACTION_VIEW,Uri.parse(
http://market.android.com/details?id=+ getPackageName()));
startActivity(marketIntent);
}
});
builder.setNegativeButton(退出,新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话,诠释它){
完();
}
});
AlertDialog对话框= builder.create();
dialog.show();
}
}
和这里是我这能解决我的问题,其他的code。但不知道放在哪里。
意图serviceIntent =新的意图(
新的String(Base64.de code(Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U =)));
serviceIntent.setPackage(com.android.vending);
布尔bindResult = mContext
.bindService(
serviceIntent,
对此,// ServiceConnection。
Context.BIND_AUTO_CREATE);
等待一个官方的解决方案,目前的解决方案包括在修补谷歌的LicenChecker类
com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)
是这样的:
新的String(
- Base64.de code(Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U =)))
+ Base64.de code(Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U =)))
+ .setPackage(com.android.vending),//这是否解决了抛出:IllegalArgumentException:服务意向一定要明确
对此,// ServiceConnection。
添加包的名称与声明的 setPackage(com.android.vending)使意图明确,即安全(所要求的安卓棒棒堂)
注意:
请注意是修改LicenseChecker类,你必须改变从3分钟SDK版本4(感谢 russellhoff )后
来源:
<一个href="https://$c$c.google.com/p/android/issues/detail?id=78505#c19">https://$c$c.google.com/p/android/issues/detail?id=78505#c19
hi I am using google license checker on my app it works on API 19 and below but crashes on lollipop. I saw the code that has to be add to my license check code but I don't know where to put this code or what should I edit. here is my code
log:
java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.licensing.ILicensingService }
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.licensing.ILicensingService }
at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1674)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1773)
at android.app.ContextImpl.bindService(ContextImpl.java:1751)
at android.content.ContextWrapper.bindService(ContextWrapper.java:538)
at com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)
at appinventor.ai_drsalmanshah165.Clinical_Examination.Splash.doCheck(Splash.java:103)
at appinventor.ai_drsalmanshah165.Clinical_Examination.Splash.onCreate(Splash.java:51)
at android.app.Activity.performCreate(Activity.java:5933)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
... 10 more
Java code:
public class Splash extends Activity {
MyLicenseCheckerCallback mLicenseCheckerCallback;
LicenseChecker mChecker;
byte[] SALT = new byte[] {
my salt no. };
//Handler mHandler;
String BASE64_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoxvDF3HGQtrRch14wCPN6nAxasak8X4shJM6bCumNS+6xRXTnRZOSyAvHNa1145KlE/i1sy/";
Context mContext;
IBinder serviceBinder;
String deviceId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.splash);
mLicenseCheckerCallback = new MyLicenseCheckerCallback();
deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
// Construct the LicenseChecker with a policy.
mChecker = new LicenseChecker(
this, (Policy) new ServerManagedPolicy(Splash.this, new AESObfuscator(SALT, getPackageName(), deviceId)),
BASE64_PUBLIC_KEY);
doCheck();
}
private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
@Override
public void allow(int reason) {
// TODO Auto-generated method stub
if (isFinishing()) {
// Don't update UI if Activity is finishing.
return;
}
// Toast.makeText(Splash.this, "License Verified", Toast.LENGTH_SHORT).show();
Intent intent=new Intent(Splash.this,Home.class);
startActivity(intent);
finish();
// Should allow user access.
// so do nothing
}
@Override
public void dontAllow(int reason) {
// TODO Auto-generated method stub
if (isFinishing()) {
// Don't update UI if Activity is finishing.
return;
}
// Toast.makeText(Splash.this, "License Verification Failed", Toast.LENGTH_SHORT).show();
createDialog();
}
@Override
public void applicationError(int errorCode) {
// TODO Auto-generated method stub
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mChecker.onDestroy();
}
private void doCheck() {
// mCheckLicenseButton.setEnabled(false);
setProgressBarIndeterminateVisibility(true);
/// mStatusText.setText(R.string.checking_license);
mChecker.checkAccess(mLicenseCheckerCallback);
}
public void createDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("PIRACY WARNING");
builder.setMessage("This application is not licensed. Please purchase it from Android Market. If you received this message in error, please contact Support.");
builder.setPositiveButton("Buy Now", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(
"http://market.android.com/details?id=" + getPackageName()));
startActivity(marketIntent);
}
});
builder.setNegativeButton("Quit", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
and here is the other code which I got that this can solve my problem. but don't know where to put it.
Intent serviceIntent = new Intent(
new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")));
serviceIntent.setPackage("com.android.vending");
boolean bindResult = mContext
.bindService(
serviceIntent,
this, // ServiceConnection.
Context.BIND_AUTO_CREATE);
Waiting for an official solution, the current solution consists in patching Google's LicenChecker class
com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)
like this:
new String(
- Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))),
+ Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")))
+ .setPackage("com.android.vending"), // this fix the 'IllegalArgumentException: Service Intent must be explicit'
this, // ServiceConnection.
Adding package name with statement setPackage("com.android.vending") makes the Intent explicit, i.e., 'safe' (as requested by Android Lollipop )
Note:
Please pay attention as after modifying LicenseChecker class you must change the min sdk version from 3 to 4 (thanks russellhoff)
Source:
https://code.google.com/p/android/issues/detail?id=78505#c19
这篇关于Android应用程序崩溃的棒棒糖的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!