繁体   English   中英

检查双/双安装的应用程序

[英]Check for dual/twin installed apps

我需要检查我的应用程序的克隆是否安装在 Android 设备上。 对于我正在进行的项目来说,这是一个很大的安全问题。

更新:

我现在意识到没有安装克隆,但实际上能够作为单独的实例运行而不会干扰原始实例。

应用克隆程序示例: https : //play.google.com/store/apps/details? id = com.lbe.parallel.intl

我应该如何在运行时检查正在运行的应用程序只有一个实例?

Android 利用唯一的包字符串来识别应用程序。 就像所有 Android 应用程序一样,您的应用程序具有与之关联的唯一包字符串。

要检查设备上是否安装了应用程序,请使用包管理器并使用以下代码进行检查:

public static boolean doesUserHaveFacebookAppInstalled(Context context, 
                                                       String packageString){
    try{
        context.getPackageManager().getApplicationInfo(packageString, 0 );
        return true;
    } catch( PackageManager.NameNotFoundException e ){
        return false;
    }
}

因此,例如,如果您想检查是否安装了 Facebook,您可以传入他们的com.facebook.katana包字符串。 如果返回true,则安装,如果返回false,则未安装。

在您的情况下,一次只能在设备上使用一个包,但在创建构建时可以更改包字符串。 IE,您的应用程序包字符串可能是com.myapp.somename ,调试版本可能是com.myapp.somename-debug 两者都被允许安装,因为它们是唯一的包字符串。

如果您想检查设备上安装了哪些应用程序,您可以使用此代码,它将获取所有可以启动/打开的已安装应用程序:

public static List<ResolveInfo> getAllInstalledApps(Context context){
    try {
        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> pkgAppsList = context.getPackageManager()
                .queryIntentActivities( mainIntent, 0);
        for(ResolveInfo r : pkgAppsList){
            if(r != null) {
                //You can use this String here to identify it while looping.
                String packageString = r.toString();
            }
        }
        return pkgAppsList;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

使用第二个代码片段的结果来确定安装了哪些应用程序并检查您的应用程序的包字符串变体以确定是否安装了其他应用程序。

这个问题没有通用的解决方案; 一些双应用挂钩系统 API,一些使用不同的用户 ID 运行应用,一些将 apk 克隆到单个迷你 VM 以运行。

在我看来,最好的方法是让您的应用程序只能在您打开应用程序、连接到您的服务器并且您的服务器强制使之前登录的设备脱机时才能在一个地方登录。

在这种情况下,您的项目中可能需要长连接或基于发布订阅的消息传递框架(例如,MQTT)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM