`
ictch
  • 浏览: 134810 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

packageInfo相关类应用

阅读更多

首先我们来看一下PackageItemInfo,它是包含了一些信息的基类,它的直接子类有:ApplicationInfo、ComponentInfo、

InstrumentationInfo、PermissionGroupInfo、PermissionInfo。它的间接子类有:ActivityInfo、ProviderInfo、ServiceInfo。这个类
包含的信息对于所有包中项目是平等的。这些Package items是被Package manager所持有的。这个类提供了属性的非常普通的基本设置:
label、icon和meta-data。这个类的意图不是被自己调用。它在这只是简单地分享被package manager返回的所有items之间的普通定义。比
如,它自己并不实现Parcelable接口,但却帮助实现了Parcelable的子类提供了方便的方法。
ApplicationInfo是从一个特定的应用得到的信息。这些信息是从相对应的Androdimanifest.xml的<application>标签中收集到的。
ResolveInfo这个类是通过解析一个与IntentFilter相对应的intent得到的信息。它部分地对应于从AndroidManifest.xml的<intent>标签收
集到的信息。
PackageManager这个类是用来返回各种的关联了当前已装入设备了的应用的包的信息。你可以通过getPacageManager来得到这个类。
ApplicationInfo与ResolveInfo比较:前者能够得到Icon、Label、meta-data、description。后者只能得到Icon、Label。
1 通过PackageManager获取手机已安装apk文件信息:
PackageManager packageManager = this.getPackageManager();  
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);
通过以上方法,可以得到手机中安装的所有应用程序,既包括了手动安装的apk包的信息,也包括了系统预装的应用软件的信息,要区分这
两类软件可使用以下方法:
a.从packageInfoList获取的packageInfo,再通过packageInfo.applicationInfo获取applicationInfo。
b.判断(applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)的值,该值大于0时,表示获取的应用为系统预装的应用,反之则为手动
安装的应用。
c.判断可卸载的应用程序(appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0 || (appInfo.flags & 
ApplicationInfo.FLAG_SYSTEM) == 0)
2 获取图片、应用名、包名:
packageManager.getApplicationIcon(pinfo.applicationInfo); //Icon
packageManager.getApplicationLabel(pinfo.applicationInfo).toString()//应用程序名
pinfo.applicationInfo.packageName//包名
3 获取支持分享的应用程序的集合:
/** 
 * 查询手机内所有支持分享的应用 
 * @param context 
 * @return 
 */  
public static List<ResolveInfo> getShareApps(Context context){  
    List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();    
    Intent intent=new Intent(Intent.ACTION_SEND,null);    
    intent.addCategory(Intent.CATEGORY_DEFAULT);    
    intent.setType("text/plain");    
    PackageManager pManager = context.getPackageManager();  
    mApps = pManager.queryIntentActivities(intent,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);   
    return mApps;    
}
由于该方法,返回的并不是 PackageInfo 对象。而是 ResolveInfo。因此获取图片、应用名、包名的方法不一样,如下:
view plaincopy to clipboardprint?
PackageManager pManager = MessageSendActivity.this.getPackageManager();  
  
/*********************查询手机内所有支持分享的应用*********************/  
List<ResolveInfo> resolveList  = Utils.getShareApps(MessageSendActivity.this);  
  
for(int i=0;i<resolveList.size();i++) {  
    ResolveInfo resolve = resolveList.get(i);  
    ShareItemInfo shareItem = new ShareItemInfo();  //自定义的类  
    //set Icon  
 shareItem.setIcon(resolve.loadIcon(pManager));  
    //set Application Name  
    shareItem.setLabel(resolve.loadLabel(pManager).toString());  
    //set Package Name   
    shareItem.setPackageName(resolve.activityInfo.packageName);        
}  
4 应用程序使用权限获取方法:
packageManager.getPackageInfo(packageName,PackageManager.GET_PERMISSIONS).requestedPermissions
5 调用系统程序设置界面
1) 2.3以上系统
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
Uri uri = Uri.fromParts(SCHEME, packageName, null);  
intent.setData(uri);  
startActivity(intent);  
2) 2.2、2.1版本
private void startApplicationDetailsActivity() {  
    Intent i = new Intent(Intent.ACTION_VIEW);                  
    i.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");  
    i.putExtra(APP_PKG_NAME, packageName);   
    startActivity(i); 
}  
但是常量APP_PKG_NAME的定义并不相同。
2.2中定义为"pkg",2.1中定义为"com.android.settings.ApplicationPkgName"
3) 通用的代码如下:
private static final String SCHEME = "package";  
/** 
 * 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.1及之前版本) 
 */  
private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";  
/** 
 * 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.2) 
 */  
private static final String APP_PKG_NAME_22 = "pkg";  
/** 
 * InstalledAppDetails所在包名 
 */  
private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";  
/** 
 * InstalledAppDetails类名 
 */  
private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";  
/** 
 * 调用系统InstalledAppDetails界面显示已安装应用程序的详细信息。 对于Android 2.3(Api Level 
 * 9)以上,使用SDK提供的接口; 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)。 
 *  
 * @param context 
 *  
 * @param packageName 
 *            应用程序的包名 
 */  
public static void showInstalledAppDetails(Context context, String packageName) {  
    Intent intent = new Intent();  
    final int apiLevel = Build.VERSION.SDK_INT;  
    if (apiLevel >= 9) { // 2.3(ApiLevel 9)以上,使用SDK提供的接口  
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
        Uri uri = Uri.fromParts(SCHEME, packageName, null);  
        intent.setData(uri);  
    } else { // 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)  
        // 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。  
        final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22  
                : APP_PKG_NAME_21);  
        intent.setAction(Intent.ACTION_VIEW);  
        intent.setClassName(APP_DETAILS_PACKAGE_NAME,  
                APP_DETAILS_CLASS_NAME);  
        intent.putExtra(appPkgName, packageName);  
    }  
    context.startActivity(intent);  
}  
6 获取未安装的apk图标
http://blog.csdn.net/sodino/archive/2011/03/01/6215224.aspx
7 监听Android应用程序是否卸载成功
http://hi.baidu.com/luodaijun/blog/item/0887a8c37e9dfc58b219a808.html
8 安装apk
   Intent intent = new Intent(Intent.ACTION_VIEW); 
   intent.setDataAndType(Uri.fromFile(new File("/sdcard/1.apk")), "application/vnd.android.package-archive"); 
   startActivity(intent); 
9  运行应用
   首先android有一个PackageManager,这玩意功能很强大,功能就和它的意思一样
   
   假设:如果我们知道一个第三方Application的包的名称和Activity的名称,是否可以启动它的,答案当让市YES
   
   启动代码:
   PackageManager pm;  
   //初始化pm, 比如在activity里可以PackageManager pm = getPackageManager(); 
   PackageInfo pi = pm.getPackageInfo("包的名称", PackageManager.GET_ACTIVITIES);
   //PackageInfo  包含丰富的包的信息,这个'包的名称'是什么,在AndroidManifest.xml中有明确定义 
   //  比如 package="xxx.yyy.Portal.UI"
   ActivityInfo ai=pi.activities[0];  // ActivityInfo 同样道理 他是 Activity的信息
   //这里指向第一个包中的Activity, 大多数都是第一个Activity为启动Activity
   if(ai==null) throw new Exception(pkg+"不包含任何Activity");
   String sName=ai.name;  //这里就得到Activity的类名了
   启动它:
   Intent intent = new Intent();
   intent.setComponent(new ComponentName(pkg,sName));
   parent.startActivity(intent);
10  获得第三方应用的包名
     
   只要有包名,就可以启动Activity了,但是不知道名字怎么办?
   如果应用没有安装自然启动不了,只要安装了就有办法。
   方法1 :
        MyBroadcastReceiver myReceiver = new MyBroadcastReceiver();
        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_INSTALL);
        filter.addAction(Intent.ACTION_PACKAGE_ADDED);
        filter.addDataScheme("package"); 
        registerReceiver(myReceiver, filter);
        
      监视安装,在MyBroadcastReceiver的onReceive函数里
      public void onReceive(Context arg0, Intent intent) {
                        String sPackageName=intent.getDataString();  //这个就是包名
                }
      也可以使用 AndroidManifest.xml配置来监视
   方法2 : 
      枚举所有安装的应用,根据你自己的条件筛选
      使用PackageManager的
      public abstract List<PackageInfo> getInstalledPackages (int flags) 可以获得安装应用的列表

分享到:
评论

相关推荐

    Android高级应用源码-获取手机应用信息.zip

    7. **获取应用签名信息**:对于安全相关的需求,你可以获取应用的签名信息,例如`packageInfo.signatures`。 8. **启动应用**:如果你知道应用的包名,可以使用`startActivity(new Intent(Intent.ACTION_MAIN)....

    Android应用源码之获取手机应用信息.zip

    在Android平台上,获取...总的来说,这个压缩包中的源码应该是演示了如何通过Android SDK提供的API获取和解析手机上的应用信息,这对于Android开发者来说是一个实用的学习资源,可以帮助他们理解和实践相关功能的实现。

    java获取apk包名、版本、权限、图标、启动图等信息

    要获取包名,可以使用`PackageInfo`类。以下是一个简单的示例代码片段: ```java String apkPath = "/path/to/your/apk/file.apk"; Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri....

    获取所有应用程序的数据

    在Android系统中,获取所有应用程序的数据是一个常见的需求,这通常涉及到获取用户安装的应用列表以及它们的相关信息,如图标、名称、包名等。在提供的代码段中,我们看到一个名为`getLaunchAppList`的方法,它实现...

    PackageManager获取安装的应用列表

    本篇文章将深入探讨如何使用`PackageManager`来获取系统应用程序列表,并提供相关代码示例。 首先,我们需要了解`PackageManager`类。它是Android SDK中的一个接口,位于`android.content.pm`包下。通过`Context....

    安卓开发-获取手机应用信息.zip

    通过掌握以上知识点,开发者能够全面地获取和管理Android设备上的应用信息,为构建更复杂的系统监控、应用管理或数据分析类应用奠定基础。记得在实际操作时遵守Android的权限模型和最佳实践,以确保用户隐私和系统的...

    Android应用管理器

    按安装时间排序可以通过比较每个应用的安装日期(PackageInfo类中的firstInstallTime或lastUpdateTime属性),按应用大小排序则需要读取应用的缓存和数据文件夹大小,而按应用名排序则是简单的字符串比较。...

    packagemannger例子,获取系统应用程序

    首先,我们需要导入必要的库,如`java.util.ArrayList`、`HashMap`、`android.os.Bundle`、`android.app.Activity`、`android.content.pm.*`等,以便使用`PackageManager`及相关类。 在`onCreate()`方法中,我们先...

    获取app信息列表

    此外,我们还可以通过`PackageInfo`类获取更详细的应用信息,如签名信息、权限列表等。例如: ```java PackageInfo packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS); ...

    android快捷卸载第三方应用

    这可以通过遍历`PackageInfo`数组,筛选出第三方应用,并将其相关信息(如应用名、图标等)展示在列表视图中。用户选择某个应用后,触发卸载操作。 安全性和权限方面,卸载应用需要`REQUEST_UNINSTALL_PACKAGES`...

    列表获取手机所有应用包名

    以下是一个简单的示例代码,展示如何获取并列出所有安装的应用及其相关信息: ```java import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; ...

    Android应用卸载器源码

    在“Android应用卸载器”中,我们可能会看到一个主活动(Activity)负责显示应用列表,以及相关的辅助类和方法来处理卸载操作。 其次,Android应用的卸载过程涉及到系统级别的操作。在用户选择卸载应用时,Android...

    Android应用源码之获取系统程序信息.zip

    在Android平台上,开发人员经常需要获取系统程序的相关信息,例如应用程序的名称、包名、版本信息等。这个压缩包文件“Android应用源码之获取系统程序信息.zip”很可能包含了一个示例项目,演示了如何通过源码编程...

    android获取应用程序大小,缓存数据信息

    - **APK大小**:可以通过读取AndroidManifest.xml文件中的`&lt;manifest package="..."&gt;`标签来获取包名,然后结合系统的`PackageInfo`类获取到安装的APK的大小。使用`PackageManager`的`getPackageInfo(packageName, ...

    Android中获取应用程序(包)的信息-PackageManager的使用方法

    通过以上介绍,我们可以看到`PackageManager`及其相关类的强大功能。这些类不仅提供了基本的应用程序信息,还允许开发者深入探索应用程序的各个方面。这对于开发高质量的Android应用程序至关重要。

    Android 获取手机中已安装apk文件信息

    `PackageInfo`类还提供了其他方法来获取更多信息,如`loadIcon()`获取应用图标,`permissions`字段获取应用请求的权限列表,`activities`、`services`、`receivers`、`providers`字段则分别包含了应用的Activity、...

    android 获取手机里安装的app信息列表

    当我们调用`PackageManager`的相关方法时,通常会返回`PackageInfo`对象。 要获取手机上安装的app信息列表,你需要在你的代码中进行以下步骤: **步骤1:获取PackageManager对象** 在你的Activity或Service中,...

    获取本地已安装apk

    这样的需求常见于应用商店类应用或者系统管理工具等场景。本文将详细介绍如何通过Android提供的`PackageManager`类来实现这一功能,并对代码进行深入解析。 #### 二、基础知识 1. **`PackageManager`类**:这是...

    android应用管理源码

    总的来说,"android应用管理源码"涵盖了Android系统的多个核心组件,包括ActivityManagerService、PackageManagerService、PermissionController以及与进程和后台管理相关的类。理解这些源码有助于开发者更高效地...

    android应用权限列表

    通过学习这个示例代码,开发者可以更好地理解如何在自己的应用中处理权限相关问题。 ### 6. 权限最佳实践 1. 只申请必要的权限:避免请求与应用功能无关的权限,以免引起用户反感。 2. 明确解释权限用途:在请求权...

Global site tag (gtag.js) - Google Analytics