Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android App crashes on Lollipop - Service Intent must be explicit: [duplicate]

Tags:

java

android

My log....

05-05 12:02:50.620: E/AndroidRuntime(32319): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxxxxxx.apps.xxx/com.xxxxxx.apps.xxx.activities.SplashActivity}: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.licensing.ILicensingService }

Where do I fix my code?

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 [email protected].")
                .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 [email protected].")
                .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);        
    }
}
like image 655
Preme Avatar asked May 05 '15 17:05

Preme


1 Answers

This is a known bug of the Google Play Licensing Library. The issue is assigned and it will be fixed in the future, in the mean time if you want to use the library also with Lollipop there is a workaround:

In LicenseChecker.java change from this:

boolean bindResult = mContext.bindService(new Intent(new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))),
                                          this, // ServiceConnection.
                                          Context.BIND_AUTO_CREATE);

to this:

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);
like image 195
Mattia Maestrini Avatar answered Oct 19 '22 16:10

Mattia Maestrini