如何使用包名获取应用程序的类别

pyu*_*s13 6 android android-intent android-install-apk android-broadcast

我有两个或更多具有我指定类别的应用程序

 <category android:name="com.myapp.MY_CATEGORY"/>
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式获得所有具有此类别的包裹:

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

现在我想跟踪我的类别应用程序安装并从应用程序中删除所以我已经制作了一个广播接收器,它将给我安装或删除应用程序的包名称,但我如何使用包名称来确定应用程序的类别以确定是否是我的应用程序.我可以为指定的类别应用程序制作广播接收器,如果不能,我如何从packagename获取类别.

Fat*_* S. -1

您可以使用另一种方法。在您的应用程序清单中设置元信息,而不是为您的活动设置类别。请注意,已删除的软件包信息无法再检索(如果尚未使用标志 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>
Run Code Online (Sandbox Code Playgroud)

添加广播接收器来跟踪软件包安装。检查包的元信息以查看您的值是否已经存在。

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        
}
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,任何其他应用程序都可以在其清单中设置您的元数据,因此这不是识别您自己的应用程序的安全方法。最好的方法是检查 apk 签名是否都使用相同的证书签名。

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
    }
}
Run Code Online (Sandbox Code Playgroud)