Licence check for a pro key

梦想的初衷 提交于 2019-12-03 06:25:53

问题


So I would like to make a free app with full functionality loaded in. The pro functionality will be disabled until the app detects a licensed pro key. And of course I would like to have the pro key check it's licence using LVL. While I know how to do things right until this point, I don't know how to make the pro key communicate with the app that it should enable the pro functionality.

Here's the main app code (com.test.mainapp):

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    context = getApplicationContext();

    final PackageManager pacman = getPackageManager();
    final int signatureMatch = pacman.checkSignatures(getPackageName(),
            "com.test.mainapp_key");

    if (signatureMatch == PackageManager.SIGNATURE_MATCH) {
        Toast.makeText(context, "Pro key detected!", Toast.LENGTH_SHORT)
                .show();
    } else {
        Toast.makeText(context, "Free version", Toast.LENGTH_SHORT).show();
    }
}

While this stops others making fake keys for my app, they still can share the key app online to others and it will work. Because we can't do the LVL check from another application, I would want the licence key app check it's own licence and if it's correct, only then the user gets the pro functionality. How can I have the licence key app and the main app communicate to each other like this?

The functionality I'm trying to get here is like Titanium Backup does, for example.


回答1:


You can send intents between the main app and the key app. If you are using LVL in the key app then an example callback would be:

private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
    public void allow() {
        Log.i("Key", "License Accepted");
        Intent i = new Intent();
        i.setAction("intent.to.call.on.success");
        i.putExtra("licenseresult", 0);
        c.sendBroadcast(i);
        mChecker.onDestroy();
    }

    public void dontAllow() {
        Log.e("Key", "License Denied");
        Intent i = new Intent();
        i.setAction("intent.to.call.on.failure");
        i.putExtra("licenseresult", 1);
        c.sendBroadcast(i);
        mChecker.onDestroy();
    }

    public void applicationError(ApplicationErrorCode errorCode) {
        Log.i("Key", "LR Error");
        Intent i = new Intent();
        i.setAction("intent.to.call.on.error");
        i.putExtra("licenseresult", 2);
        c.sendBroadcast(i);
        mChecker.onDestroy();
    }
}

You would set up broadcast receivers in both apps to initiate the license check and handle the result. e.g.

public class License extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals("intent.called.to.initiate.request")) {
                // Initiate the license request here (possibly using a service)
        return;
    }
}

} 

You should limit access to the intents using certificate based permissions to prevent other apps being able to send spoofed "License Success" intents.

http://developer.android.com/reference/android/content/BroadcastReceiver.html#Permissions

Short version.

Define permission in manifest

< permission android:name="my.package.LicenseCheck" android:protectionLevel="signature"/> 

Use Permission in receiver declaration:

<receiver android:name="name.of.your.receiver" android:permission="my.package.LicenseCheck"> 
<intent-filter>
    <action android:name="name.of.intent"/>
</intent-filter>
</receiver>



回答2:


@MainApp

<permission android:name="myapp.permission.RESPOND" protectionLevel="signature" />

<receiver android:name=".receiver.WhichHandlesValidationResponse" android:permisssion="myapp.permission.RESPOND">
    <intent-filter>
            <action android:name="myapp.action.VALIDATION_RESPONSE" />
    </intent-filter>
</receiver>

@KeyApp

<uses-permission android:name="myapp.permission.RESPOND" />

Create LvlValidationHandler.class that contains:

Intent i = new Intent("myapp.action.VALIDATION_RESPONSE");
sendBroadcast(i);


来源:https://stackoverflow.com/questions/8034683/licence-check-for-a-pro-key

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!