安卓应用在棒棒糖系统上崩溃 - Service Intent 必须是明确的:

11

我的日志...

05-05 12:02:50.620: E/AndroidRuntime(32319): java.lang.RuntimeException:无法启动活动ComponentInfo {com.xxxxxxxx.apps.xxx/com.xxxxxx.apps.xxx.activities.SplashActivity}:java.lang.IllegalArgumentException:Service Intent 必须是明确的:Intent { act=com.android.vending.licensing.ILicensingService }

我该在哪里修复我的代码?

package com.xxxxxx.apps.xxx.activities;`

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings.Secure;
import android.util.Log;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

import com.android.vending.licensing.AESObfuscator;
import com.android.vending.licensing.LicenseChecker;
import com.android.vending.licensing.LicenseCheckerCallback;
import com.android.vending.licensing.ServerManagedPolicy;
import com.xxxxxxxx.apps.xxxx.R;
import com.xxxxxx.libs.util.Platform;

public class SplashActivity extends Activity {

    /*[ $if full $ ]*/
    private final class xxxLicenseCheckerCallback implements LicenseCheckerCallback {
        @Override
        public void allow() {
            Log.i(TAG, "License OK");

            licenseResponseHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    Intent intent = createSequencerActivityIntent();
                    startActivity(intent);
                    finish();
                }
            }, 2000);           
        }



        @Override
        public void dontAllow() {
            Log.e(TAG, "License check FAILED");

            new AlertDialog.Builder(SplashActivity.this)
                .setTitle(R.string.app_name)
                .setMessage("License check failed.\nPlease try starting the app again" +
                        " when your internet connection is ON.\n" +
                        "This is required to protect the app from piracy.\n" +
                        "If the problem persists, please contact us at xxxxxx@xxxxxx.com.")
                .setCancelable(false)
                .setNegativeButton("Close the app", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        SplashActivity.this.finish();
                    }
                })
                .setPositiveButton("Retry", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();

                        licenseResponseHandler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                licenseChecker.checkAccess(licenseCheckerCallback);
                            }
                        }, 1000L);
                    }
                })
            .show();
        }

        @Override
        public void applicationError(ApplicationErrorCode errorCode) {
            Log.e(TAG, "License check unavailable: " + errorCode);

            new AlertDialog.Builder(SplashActivity.this)
                .setTitle(R.string.app_name)
                .setMessage("We were unable to check your license.\nPlease try restarting the app again.\nIf the problem persists, please contact us at xxxxxx@xxxxxxx.com.")
                .setCancelable(false)
                .setPositiveButton("Close the app", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        SplashActivity.this.finish();
                    }
                })
            .show();
        }
    }
    /*[ $endif$ ]*/

    private static final String TAG = SplashActivity.class.getSimpleName();

    /*[ $if full $ ]*/
    private static final String BASE64_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnZaL3WpvXaBlnEu" +
                                                    "ToXHlWmraQ8bz7tyQ4TyaFF17BocoLpJgfNXDM43ezpaVeDYCrX7qcExn79" +
                                                    "QcSFoKzlS9ILbWEQ3mt7+kim6f1DIMqKIWZ6F0VyovshW84ps0m4Aq0ZGnp" +
                                                    "MOMBy/v63ACcRiZkymEIJSwiDp3Twdoj2R9I+NkBvjM2NSF0u2ejzmBYx6h" +
                                                    "z0jlvIvOhTbGmqJ0zQKFyKDJ17WROgscXSQ38ehvIJ2ycJvsGTsFWr/yp8P" +
                                                    "bMGVTrpLI1SZlRIY3zw8JFxxI+bx19c7+SZUqHyePjxGpq5R13r+tQRvoC6" +
                                                    "99S6EFZ3McPGXw7aZK+d21z82ILKNANwIDAQAB";
    private static final byte[] SALT = new byte[] {
         -46, 65, 30, -128, -103, -42, 77, -117, -36, -110, -57, 74, 64, 51, 88, -95, -11, 32, -60, 89
    };

    private LicenseCheckerCallback licenseCheckerCallback;
    private LicenseChecker licenseChecker;
    /*[ $endif$ ]*/
    private Handler licenseResponseHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        licenseResponseHandler = new Handler();

        /*[ $if full $ ]*/
        // Check the license
        licenseCheckerCallback = new xxxLicenseCheckerCallback();

        String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
        licenseChecker =  new LicenseChecker(this, 
                new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), deviceId)), 
                BASE64_PUBLIC_KEY);

        licenseChecker.checkAccess(licenseCheckerCallback);
        // End license check
        /*[ $else$ 

        licenseResponseHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = createSequencerActivityIntent();
                startActivity(intent);
                finish();
            }
        }, 2000);           

            $endif$ ]*/

        ImageView imageView = new ImageView(this);
        if (Platform.isIcsOrLater()) {
            imageView.setScaleType(ScaleType.FIT_XY);
            imageView.setImageResource(R.drawable.splash_ics);
        } else {
            imageView.setScaleType(ScaleType.CENTER_CROP);
            imageView.setImageResource(R.drawable.splash);
        }

        setContentView(imageView);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        /*[ $if full $ ]*/
        if (licenseChecker != null) {
            licenseChecker.onDestroy();
        }
        /*[ $endif$ ]*/
    }

    protected Intent createSequencerActivityIntent() {
        return new Intent(SplashActivity.this, SequencerActivity.class);        
    }
}

3
你的问题中是否包含任何敏感信息,比如加密密钥? - Jonas Czech
你的错误指向哪一行? - AndroidEx
2个回答

56
这是Google Play许可库的已知问题。该问题已被分配并将在未来修复,在此期间,如果您想要与Lollipop一起使用该库,则有一个解决方法:
LicenseChecker.java中进行更改,从这里开始:
boolean bindResult = mContext.bindService(new Intent(new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))),
                                          this, // ServiceConnection.
                                          Context.BIND_AUTO_CREATE);

转换为:

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

6
2017年,这个漏洞仍然存在。谢谢! - Rick77
4
2018年,这个问题仍然存在。你如何检查许可证? - mcfly soft
快到2018年底了,谷歌仍然没有修复这个明显的漏洞。 - Cory Trese
现在是2019年,(惊喜!)仍然没有人关心。顺便说一下,我想指出修复需要API 4。 - Nikolai
2021年1月,仍未修复。哇,真是太棒了。 - Zynastor
显示剩余2条评论

0

如果我不得不猜测,导致你问题的那一行可能是:

    licenseChecker.checkAccess(licenseCheckerCallback);

或者是创建licenseChecker的上一行。这看起来像是在尝试与一个Service通信。从Lollipop开始,所有绑定服务都必须使用显式Intent进行绑定。您看到的错误是因为某些东西正在调用bindService()并提供了一个Intent对象,在其中没有设置ComponentName


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接