Android 获取App相关信息

来源:互联网 发布:优化再造办税服务 编辑:程序博客网 时间:2024/05/16 04:55

整理一些常用的关于查询应用信息的工具方法,以便日后使用

1.Android 获取进程名

private static String getProcessName() {    BufferedReader cmdlineReader = null;    try {        cmdlineReader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/" + android.os.Process.myPid() + "/cmdline"), "iso-8859-1"));        int c;        StringBuilder processName = new StringBuilder();        while ((c = cmdlineReader.read()) > 0) {            processName.append((char) c);        }        return processName.toString();    } catch (Exception ignore) {    } finally {        try {            if (cmdlineReader != null) {                cmdlineReader.close();            }        } catch (IOException ignore) {        }    }    return "";}

2. 安装指定路径下的Apk

/*** 安装指定路径下的Apk*/public void installApk(String apkFilePath) {    Intent intent = new Intent();    intent.setAction("android.intent.action.VIEW");    intent.addCategory("android.intent.category.DEFAULT");    intent.setDataAndType(Uri.fromFile(new File(apkFilePath)), "application/vnd.android.package-archive");    startActivityForResult(intent, 0);}

3. 卸载指定包名的App

/*** 卸载指定包名的App*/public void uninstallApp(String packageName) {    Intent intent = new Intent();    intent.setAction("android.intent.action.DELETE");    intent.addCategory("android.intent.category.DEFAULT");    intent.setData(Uri.parse("package:" + packageName));    startActivityForResult(intent, 0);}

4. 获取App的名称,版本号

/*** 获取App名称,版本号*/public static void getAppNameAndVersionName(Context context) {    try {        PackageManager packageManager = context.getPackageManager();        PackageInfo packageInfo = packageManager.getPackageInfo(                context.getPackageName(), 0);        int labelRes = packageInfo.applicationInfo.labelRes;        //获取app名称        String label = context.getResources().getString(labelRes);        //获取app versionName        String versionName = info.versionName;    } catch (NameNotFoundException e) {        e.printStackTrace();    }    return null;}

5. 启动APK的默认Activity

public static void startApkActivity(final Context ctx, String packageName) {    PackageManager pm = ctx.getPackageManager();    PackageInfo pi;    try {        pi = pm.getPackageInfo(packageName, 0);        Intent intent = new Intent(Intent.ACTION_MAIN, null);        intent.addCategory(Intent.CATEGORY_LAUNCHER);        intent.setPackage(pi.packageName);        List<ResolveInfo> apps = pm.queryIntentActivities(intent, 0);        ResolveInfo ri = apps.iterator().next();        if (ri != null) {            String className = ri.activityInfo.name;            intent.setComponent(new ComponentName(packageName, className));            ctx.startActivity(intent);        }    } catch (NameNotFoundException e) {    Log.e("startActivity", e);    }}

6. 打开指定包名的App

/*** 打开指定包名的App*/public void openSpecifiedApp(String packageName){    PackageManager manager = getPackageManager();    Intent launchIntentForPackage = manager.getLaunchIntentForPackage(packageName);    if (launchIntentForPackage != null) {        startActivity(launchIntentForPackage);    }}

7. 获取最近一次活跃的应用的包名

/** * 获取最近一次活跃的应用的包名   */ public Set<String> getTopPackageSet() {    Set<String> topSet = null;    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {         // getRunningTasks在5.0以上为deprecated,采用其他方式判断        List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfoList = mActivityManager.getRunningAppProcesses();        if (runningAppProcessInfoList != null && runningAppProcessInfoList.size() > 0) {            String pkgList[] = runningAppProcessInfoList.get(0).pkgList;            if (pkgList != null && pkgList.length > 0) {                topSet = new HashSet<String>(pkgList.length);                for (String pkg : pkgList) {                    topSet.add(pkg);                }            }        }    } else {        topSet = new HashSet<String>(1);         topSet.add(mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName());    }    return topSet;}

8. 用于检测app是否处于前台可见(只能用于Android7.0以下版本)

方法一:

/**  * 用于检测app是否处于前台可见(只能用于Android7.0以下版本) * @param packageName  * @return */ public boolean checkAppIsForeground(String packageName) {    PackageManager pm = App.getApp().getPackageManager();    PackageInfo pInfo;    try {        pInfo = pm.getPackageInfo(packageName, 0);    } catch (PackageManager.NameNotFoundException ignore) {        return false;    }     String uid = String.valueOf(pInfo.applicationInfo.uid);//as 10045     uid = uid.replaceFirst("10+", "");    //"u0_a31  3305  396  1225804 84148 bg  SyS_epoll_ 00000000 S com.android.vending"    try {        java.lang.Process ps = Runtime.getRuntime().exec("ps -P");        InputStream is = ps.getInputStream();        BufferedReader reader = new BufferedReader(new InputStreamReader(is));        for (String line; (line = reader.readLine()) != null; ) {            String[] info = line.split("\\s+");            String userId = info[0];            String processName = info[info.length - 1];//as com.android.vending            if (userId.endsWith(uid) && packageName.equals(processName)) {                String state = info[5];//e.g fg|bg|ta                return !"bg".equals(state);            }        }        reader.close();    } catch (IOException e) {        e.printStackTrace();    }    return false;}

方法二:判断当前App处于前台还是后台

/*** 判断当前App处于前台还是后台* 需添加<uses-permission android:name="android.permission.GET_TASKS"/>* 并且必须是系统应用该方法才有效*/public static boolean isApplicationBackground(final Context context) {    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);    @SuppressWarnings("deprecation")    List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);    if (!tasks.isEmpty()) {        ComponentName topActivity = tasks.get(0).topActivity;        if (!topActivity.getPackageName().equals(context.getPackageName())) {            return true;        }    }    return false;}

9. 打开指定包名的App应用信息界面

/*** 打开指定包名的App应用信息界面*/public void showAppInfo(String packageName) {    Intent intent = new Intent();    intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");    intent.setData(Uri.parse("package:" + packageName));    startActivity(intent);}

10. 分享Apk信息

/*** 分享Apk信息*/public void shareApkInfo(String info) {    Intent intent = new Intent();    intent.setAction("android.intent.action.SEND");    intent.addCategory("android.intent.category.DEFAULT");    intent.setType("text/plain");    intent.putExtra(Intent.EXTRA_TEXT, info);    startActivity(intent);}

11. 获取手机上已安装并且可启动的应用列表

注意:使用getInstalledApplications会返回很多无法启动甚至没有图标的系统应用。ResolveInfo.activityInfo.applicationInfo也能取到你想要的数据

Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_LAUNCHER);List<ResolveInfo> activities = getPackageManager().queryIntentActivities(intent, 0);

12.有时我们想在自己的应用中去启动第三方应用,该怎么实现呢?

每个应用都有一个主activity,也就是在点击桌面点击图标的时候第一个启动的activity,这activity有个特点,它在AndroidManifest.xml中配置IntentFilter的时候既配了android.intent.action.MAIN,又配置了android.intent.category.LAUNCHER,所以可以根据这个特点通过java代码去调用这个activity。下面直接上个简单的例子。

来个例子:

1. 第三方应用的主activity在AndroidManifest.xml配置如下所示:

<activity    android:name="com.cjl.myapp.MainActivity"    android:hardwareAccelerated="false"    android:launchMode="singleTop"    android:screenOrientation="portrait"    android:theme="@style/AppTheme">        <intent-filter>            <action android:name="android.intent.action.MAIN" />            <category android:name="android.intent.category.LAUNCHER" />        </intent-filter></activity>

2. 在我们自己的应用中直接调用以下方法即可启动第三方应用

public static void startMainActivity(final Context context, String packageName) {    PackageManager pm = context.getPackageManager();    PackageInfo packageInfo = null;    try {        packageInfo = pm.getPackageInfo(packageName, 0);        Intent intent = new Intent(Intent.ACTION_MAIN, null);        intent.addCategory(Intent.CATEGORY_LAUNCHER);        intent.setPackage(packageInfo.packageName);        List<ResolveInfo> apps = pm.queryIntentActivities(intent, 0);        ResolveInfo resolveInfo = apps.iterator().next();        if (resolveInfo != null) {            String className = resolveInfo.activityInfo.name;            intent.setComponent(new ComponentName(packageName, className));            context.startActivity(intent);        }    } catch (NameNotFoundException e) {    }}

3. 调用方法:

startMainActivity(this, "com.cjl.myapp");

13. 判断应用从哪里安装的

//判断是否来自Google Playpublic boolean isPlayInstalled() {    PackageManager pm = mContext.getPackageManager();    String installPackage = pm.getInstallerPackageName(mContext.getPackageName());    return TextUtils.equals("com.android.vending", installPackage);}

0 0