Android应用程序崩溃的棒棒糖 [英] Android App crashes on Lollipop

查看:243
本文介绍了Android应用程序崩溃的棒棒糖的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我使用谷歌的许可检查我的应用程序也适用于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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆