案例1:当App A和App B使用不同的key签名时,你至少可以通过你的广播监听器查看调用者包名。
@Override
Public void onReceive(Context context, Intent intent) {
Uri packageNameUri = intent.getData();
String packageName = packageNameUri.getSchemeSpecificPart();
If(packageName.equals(“<App_A or App_B packageName>”){
//Access granted, execute what you need!
}
else{
//deny access
}
}
不要忘记在 Android 清单文件中声明您的广播接收器:
<receiver android:name="<your_receiver_class " >
<intent-filter>
<action android:name="<give it any name>"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
情况 2:当两个应用程序使用相同的密钥签名时。
如果您还想共享 Linux 用户 ID,请确保这两个应用程序使用相同的密钥签名并在清单文件中添加以下属性:
android:sharedUserId="<provide dot separated name e.g. “android.shared.uid”">
强制执行基于签名的权限的一种方法是在清单中创建自定义权限,如下所示:
<permission android:name="org.securecom.permission" android:protectionLevel="signature"></permission>
…
<activity
android.permission="org.securecom.permission"
...
</activity>
通过这种方式,您可以静态配置和强制对组件执行基于签名的权限。
也可以通过广播监听器动态检查:
@Override
public void onReceive(Context context, Intent intent) {
Uri packageUri = intent.getData();
String packageName = packageUri.getEncodedSchemeSpecificPart();
int flags = PackageManager.GET_PERMISSIONS | PackageManager.GET_SIGNATURES;
try {
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName,flags);
// verify packageInfo
} catch (NameNotFoundException e) {
// handle
}
}
我已经测试了基于签名的权限,它运行良好。
希望这可以帮助。