Android应用程序在Lollipop上崩溃了

时间:2015-02-03 17:31:36

标签: java android eclipse android-5.0-lollipop

嗨我在我的应用程序上使用谷歌许可证检查器它适用于API 19及以下但在棒棒糖上崩溃。我看到了必须添加到我的许可证检查代码中的代码,但我不知道在哪里放置此代码或我应该编辑什么。这是我的代码

日志:

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代码:

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();
}
}

这是我得到的其他代码,这可以解决我的问题。但不知道把它放在哪里。

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);

1 个答案:

答案 0 :(得分:62)

等待官方解决方案,目前的解决方案包括修补Google的LicenseChecker类

com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)
像这样:

new String(
-    Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))),
+    Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")))
+    .setPackage("com.android.vending"), // this fix the 'IllegalArgumentException: Service Intent must be explicit'
     this, // ServiceConnection.

使用声明 setPackage(“com.android.vending”)添加包名称使得Intent显式,即“安全”(根据Android Lollipop的要求)

注意:

请注意,在修改LicenseChecker课程后,您必须将min sdk版本从3更改为4(感谢russellhoff

<强>来源:

https://code.google.com/p/android/issues/detail?id=78505#c19