You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现com.example.free检测安装com.example.paid后解锁付费功能?无需Content Provider

嘿,这个需求其实是Android生态里挺常见的「轻量解锁器」模式,CamScanner确实用了类似的思路,而且不用Content Provider也完全能实现,我给你拆解几个靠谱的方案:

方案1:包存在性检测(CamScanner大概率采用的核心方案)

这是最直接的实现方式——免费应用com.example.free定期或在关键入口检查设备上是否安装了com.example.paid包,只要检测到存在,就自动解锁付费功能。

具体实现步骤:

  1. 付费应用做极简处理:只保留AndroidManifest.xml文件,不需要任何Activity、Service或代码逻辑,甚至连资源文件都可以删掉,这样体积轻松控制在4-5KB以内。
  2. 在免费应用里添加检测逻辑:
private boolean isPaidAppInstalled() {
    PackageManager pm = getPackageManager();
    try {
        // 尝试获取付费应用的包信息,不存在则抛出异常
        pm.getPackageInfo("com.example.paid", PackageManager.GET_ACTIVITIES);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}
  1. 在合适的时机调用这个方法(比如应用启动时、进入付费功能页面时),返回true就解锁对应功能。
方案2:签名验证(防破解增强版)

只检测包名存在的话,容易被恶意用户通过伪造同名包解锁,所以可以加上签名校验——免费应用预存付费应用的签名哈希,检测到包存在后,再验证签名是否匹配。

代码示例:

private boolean isPaidAppValid() {
    PackageManager pm = getPackageManager();
    try {
        PackageInfo paidPackageInfo = pm.getPackageInfo("com.example.paid", PackageManager.GET_SIGNATURES);
        Signature[] paidSignatures = paidPackageInfo.signatures;
        // 这里替换成你付费应用的签名哈希(可以提前生成好)
        String validSignatureHash = "你的付费应用签名SHA-256哈希值";
        
        for (Signature signature : paidSignatures) {
            String hash = getSignatureHash(signature);
            if (validSignatureHash.equals(hash)) {
                return true;
            }
        }
        return false;
    } catch (Exception e) {
        return false;
    }
}

// 生成签名的SHA-256哈希值
private String getSignatureHash(Signature signature) throws NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    byte[] signatureBytes = signature.toByteArray();
    md.update(signatureBytes);
    byte[] hashBytes = md.digest();
    // 转成十六进制字符串
    StringBuilder sb = new StringBuilder();
    for (byte b : hashBytes) {
        sb.append(String.format("%02x", b));
    }
    return sb.toString();
}
方案3:广播触发(主动解锁可选方案)

如果想让付费应用安装后立即触发解锁,而不是等免费应用下次启动,可以用自定义广播:

  1. 付费应用的AndroidManifest.xml里添加安装完成后的广播发送逻辑,或者用一个空Activity在启动时发送广播(即使是空Activity,整个应用体积还是能控制在几KB)。
  2. 免费应用动态注册广播接收器,接收付费应用发送的解锁广播,收到后立即解锁功能。

注意:Android 8.0+对静态广播有严格限制,所以推荐免费应用用动态注册,或者给广播加上签名权限,只有同签名的应用才能发送,防止伪造。

额外注意事项:

  • 处理卸载场景:免费应用可以监听ACTION_PACKAGE_REMOVED广播,当检测到com.example.paid被卸载时,自动锁定付费功能。
  • 签名一致性:如果两个应用用同一个签名打包,可以开启sharedUserId进一步增强安全性,但这个不是必须的,前面的方案都不需要依赖它。

内容的提问来源于stack exchange,提问作者Asif Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:48:05