Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用包名获取应用程序的类别_Android_Android Intent_Android Install Apk_Android Broadcast - Fatal编程技术网

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

Android 如何使用包名获取应用程序的类别,android,android-intent,android-install-apk,android-broadcast,Android,Android Intent,Android Install Apk,Android Broadcast,我有两个或多个应用程序具有我指定的类别,如 <category android:name="com.myapp.MY_CATEGORY"/> 我可以通过以下方式获得所有具有此类别的软件包: final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory("com.myapp.MY_CATEGORY"); final List<ResolveInfo>

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

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

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

 final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
 mainIntent.addCategory("com.myapp.MY_CATEGORY");
 final List<ResolveInfo> pkgAppsList =getPackageManager().queryIntentActivities( mainIntent, 0);
final Intent maintent=新意图(Intent.ACTION\u MAIN,空);
maintent.addCategory(“com.myapp.MY_CATEGORY”);
最终列表pkgAppsList=getPackageManager().QueryInputActivities(mainIntent,0);

现在,我想跟踪我的类别应用程序安装和从应用程序中删除,因此我制作了一个广播接收器,它将为我提供已安装或已删除应用程序的软件包名称,但我如何使用软件包名称对应用程序的类别进行筛选,以确定这是否是我的应用程序。我可以为指定的类别应用制作广播接收器吗?如果不是,我如何从packagename获取类别。

您可以使用其他方法。在应用程序清单中设置元信息,而不是为活动设置类别。 请注意,无法再检索已删除的包信息(如果应用程序未使用“不删除数据”标志删除)

正如您所见,任何其他应用程序都可以在其清单中设置您的元数据,因此识别您自己的应用程序不是一种安全的方法。最好的方法是检查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
    }
}

我也面临同样的问题。 上述查询的解决方案如下所述

首先,下载Jsoup库或

或 将此添加到build.gradle(模块:app)
实现“org.jsoup:jsoup:1.11.3”

private class FetchCategoryTask extends AsyncTask<Void, Void, Void> {

    private final String TAG = FetchCategoryTask.class.getSimpleName();
    private PackageManager pm;
    //private ActivityUtil mActivityUtil;

    @Override
    protected Void doInBackground(Void... errors) {
        String category;
        pm = getPackageManager();
        List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
        Iterator<ApplicationInfo> iterator = packages.iterator();
        //  while (iterator.hasNext()) {
        // ApplicationInfo packageInfo = iterator.next();
        String query_url = "https://play.google.com/store/apps/details?id=com.imo.android.imoim";  //GOOGLE_URL + packageInfo.packageName;
        Log.i(TAG, query_url);
        category = getCategory(query_url);
        Log.e("CATEGORY", category);

        // store category or do something else
        //}
        return null;
    }


    private String getCategory(String query_url) {

        try {
             Document doc = Jsoup.connect(query_url).get();
            Elements link = doc.select("a[class=\"hrTbp R8zArc\"]");
               return link.text();
        } catch (Exception e) {
            Log.e("DOc", e.toString());
        }
    }

}
私有类FetchCategoryTask扩展异步任务{
private final String TAG=FetchCategoryTask.class.getSimpleName();
私人包装经理;
//私人活动util mActivityUtil;
@凌驾
受保护的Void doInBackground(Void…错误){
字符串类别;
pm=getPackageManager();
List packages=pm.getinstalledApplication(PackageManager.GET_元数据);
迭代器迭代器=packages.Iterator();
//while(iterator.hasNext()){
//ApplicationInfo-packageInfo=iterator.next();
字符串查询\u url=”https://play.google.com/store/apps/details?id=com.imo.android.imoim“;//GOOGLE_URL+packageInfo.packageName;
Log.i(标签、查询url);
category=getCategory(查询url);
Log.e(“类别”,类别);
//存储类别或执行其他操作
//}
返回null;
}
私有字符串getCategory(字符串查询\u url){
试一试{
Document doc=Jsoup.connect(query_url.get();
Elements link=doc.select(“a[class=\”hrTbp R8zArc\“]”);
返回link.text();
}捕获(例外e){
Log.e(“DOc”,e.toString());
}
}
}

作为回报,您将获得应用程序公司名称和应用程序类别

您有解决方案吗?我们如何以编程方式获取任何应用程序的类别?@Sam在TechValens中,您无法使用程序包名称获取类别您唯一能做的就是使用类别提取程序包名称。因此,我在广播中所做的是,我使用arraylist中定义的类别获取安装的包,并获取所有包,如果与最新安装的包匹配,则表示现在安装的应用程序是我自己的应用程序。谢谢。我会试试这个,并会让你知道它是否适合我。在值和签名变量中都没有信息
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
    }
}
private class FetchCategoryTask extends AsyncTask<Void, Void, Void> {

    private final String TAG = FetchCategoryTask.class.getSimpleName();
    private PackageManager pm;
    //private ActivityUtil mActivityUtil;

    @Override
    protected Void doInBackground(Void... errors) {
        String category;
        pm = getPackageManager();
        List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
        Iterator<ApplicationInfo> iterator = packages.iterator();
        //  while (iterator.hasNext()) {
        // ApplicationInfo packageInfo = iterator.next();
        String query_url = "https://play.google.com/store/apps/details?id=com.imo.android.imoim";  //GOOGLE_URL + packageInfo.packageName;
        Log.i(TAG, query_url);
        category = getCategory(query_url);
        Log.e("CATEGORY", category);

        // store category or do something else
        //}
        return null;
    }


    private String getCategory(String query_url) {

        try {
             Document doc = Jsoup.connect(query_url).get();
            Elements link = doc.select("a[class=\"hrTbp R8zArc\"]");
               return link.text();
        } catch (Exception e) {
            Log.e("DOc", e.toString());
        }
    }

}