[英]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.