6

Mam dwie lub więcej aplikacji uwzględniając mój podanej kategorii jakJak zdobyć kategorię aplikacji za pomocą nazwy pakietu

<category android:name="com.myapp.MY_CATEGORY"/> 

i jestem w stanie uzyskać wszystkie pakiety posiadające tę kategorię przez:

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
mainIntent.addCategory("com.myapp.MY_CATEGORY"); 
final List<ResolveInfo> pkgAppsList =getPackageManager().queryIntentActivities(mainIntent, 0); 

Teraz chcę śledzić instalację mojej aplikacji kategorii i usunąć ją z aplikacji, więc utworzyłem odbiornik, który da mi nazwę pakietu zainstalowanej lub usuniętej aplikacji, ale jak mogę ustawić kategorię aplikacji za pomocą nazwy pakietu, aby określić, czy to jest moja aplikacja, czy nie. mogę ustawić odbiornik dla określonych aplikacji kategorii lub, jeśli nie, jak mogę uzyskać kategorię z nazwy pakietu.

+0

czy masz na to rozwiązanie? –

+0

W jaki sposób możemy programowo uzyskać kategorię dowolnej aplikacji? –

+0

@ Sam-In-TechValens, której nie można uzyskać kategorii przy użyciu nazwy pakietu, jedyne, co można zrobić, to wyodrębnić nazwę pakietu za pomocą kategorii. Więc to co zrobiłem w audycji, wziąłem zainstalowany pakiet, a także wziąłem wszystkie pakiety przy użyciu zdefiniowanej kategorii w tablicy i dopasowania z najnowszym pakietem zainstalowanym, jeśli pasuje to oznacza, że ​​zainstalowana aplikacja jest teraz moją własną aplikacją. – pyus13

Odpowiedz

-1

Możesz użyć innego podejścia. Ustaw dane meta w manifeście aplikacji, zamiast ustawiać kategorię dla swoich działań. Należy pamiętać, że usunięte informacje pakiet nie może zostać odzyskane już (jeśli wnioski nie zostały usunięte z flagą DONT_DELETE_DATA)

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="your.package.name" 
    android:versionCode="1" 
    android:versionName="1" > 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name"> 
     <meta-data 
      android:name="meta-name" 
      android:value="meta-value" /> 
    </application> 
</manifest> 

Dodaj odbiornik rozgłaszania do śledzenia instalacji pakietów. Sprawdź pakiet meta, aby zobaczyć, jakie wartości już tam są.

private BroadcastReceiver packageListener = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 

     Log.i(intent.getAction(), intent.getData().getEncodedSchemeSpecificPart()); 

     //Currently being installed or deleted package 
     String packageName = intent.getData().getEncodedSchemeSpecificPart(); 

     Object value = null;    
     try { 
      ApplicationInfo appInfo = getPackageManager().getApplicationInfo(packageName,PackageManager.GET_META_DATA); 

      //Get meta value if exits 
      value = appInfo.metaData.get("meta-name"); 
     } catch (NameNotFoundException e) { 
      Log.e(TAG, "exception occured", e);    
     } 
     //check meta info if it is yours   
} 
} 

Jak widać, każda inna aplikacja może ustawić dane meta w ich manifeście, więc nie jest to bezpieczny sposób rozpoznawania własnych aplikacji. Najlepiej jest sprawdzić podpisy APK, jeśli wszystkie są podpisane tym samym certyfikatem.

private BroadcastReceiver packageListener = new BroadcastReceiver() { 

    public void onReceive(Context context, Intent intent) { 

     Log.i(intent.getAction(), intent.getData().getEncodedSchemeSpecificPart()); 

     String packageName = intent.getData().getEncodedSchemeSpecificPart(); 

     Signature[] signatures = null; 
     try { 
      PackageInfo packageInfo = getPackageManager().getPackageInfo(packageName,PackageManager.GET_SIGNATURES); 

      signatures = packageInfo.signatures; 

     } catch (NameNotFoundException e) { 
      Log.e(TAG, "exception occured", e); 
     } 

     //check installed package signature if it matches 
    } 
} 
+0

Dzięki. Spróbuję tego i dam ci znać, jeśli to działa dobrze dla mnie. – pyus13

+0

Nie ma informacji w wartości, a także w zmiennej podpisu –

Powiązane problemy