Sie können einen anderen Ansatz verwenden. Legen Sie in Ihrem Anwendungsmanifest eine Metainformation fest, anstatt die Kategorie für Ihre Aktivitäten festzulegen. Beachten Sie, dass Paketinformationen gelöscht kann nicht mehr abgerufen werden
<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>
einen Rundfunkempfänger hinzufügen zu verfolgen Paketinstallationen (wenn Anwendungen nicht mit Flag DONT_DELETE_DATA gelöscht wurde). Überprüfen Sie die Meta-Informationen des Pakets, um zu sehen, ob Ihre Werte bereits vorhanden sind.
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
}
}
Wie Sie sehen, dass alle anderen Anwendungen, die Meta-Daten in ihrem Manifest festlegen können, so dass es keine sichere Möglichkeit, Ihre eigenen Anwendungen zu erkennen. Der beste Weg besteht darin, apk-Signaturen zu überprüfen, wenn alle mit demselben Zertifikat signiert sind.
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
}
}
Haben Sie die Lösung dafür? –
Wie können wir programmatisch die Kategorie einer App bekommen? –
@ Sam-In-TechValens Sie können die Kategorie nicht mit dem Paketnamen abrufen. Sie können nur den Paketnamen mithilfe der Kategorie extrahieren. Also, was ich in Broadcast getan habe nahm ich das Paket installiert und nahm auch alle Pakete mit der definierten Kategorie in Arraylist und passt mit dem neuesten Paket installiert, wenn es übereinstimmt bedeutet, dass die Anwendung installiert ist jetzt meine eigene Anwendung. – pyus13