我已经看到了一些示例,其他应用程序可以通过包名称启动我的应用程序。出于安全原因,我想阻止其他应用程序的这种访问。
我想阻止这种(Open another application from your own (intent))类型的访问
例如,如果第三方应用程序知道我的应用程序的包名称,他们可以像这样从他们的应用程序启动我的应用程序,
Intent i;
PackageManager manager = getPackageManager();
try {
i = manager.getLaunchIntentForPackage("app package name");
if (i == null)
throw new PackageManager.NameNotFoundException();
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);
} catch (PackageManager.NameNotFoundException e) {
}
现在为了防止这种情况,我在启动活动中添加了export =“false”,并添加了对lauching活动的权限。由于这个原因,它阻止了第三方应用程序启动我的应用程序,但Android OS启动程序也无法启动应用程序。
答案 0 :(得分:1)
我想如果您没有在Android清单中提供启动意图,其他应用(包括您的主屏幕)将无法启动您的应用。
答案 1 :(得分:0)
您可以在清单中尝试这些属性:
http://developer.android.com/guide/topics/manifest/activity-element.html#exported
http://developer.android.com/guide/topics/manifest/service-element.html#exported
http://developer.android.com/guide/topics/manifest/receiver-element.html#exported
http://developer.android.com/guide/topics/manifest/provider-element.html#exported
正如这些链接中所提到的,您可以通过使用带有protectionLevel = signature的权限来尝试另一种方法 http://developer.android.com/guide/topics/manifest/permission-element.html#plevel
答案 2 :(得分:0)
我希望通过比较包名称可以帮助您保护您的活动免受其他应用启动。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ComponentName componentName = this.getCallingActivity();
if(componentName == null) {
finish();
} else if("<intended package name>".equals(componentName.getPackageName())) {
finish();
} else {
String data = getIntent().getDataString();
...
}
}
}
以上解决方案基于以下假设: