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
- Android 获取App相关信息
- 获取APP的相关信息
- android 获取app信息
- iOS获得设备相关信息,获取app相关信息
- 获取ios应用的app相关信息
- iOS 获取APP相关信息 私有API
- Android获取App版本信息
- android获取app版本信息
- 获取android机型相关信息
- android 获取手机相关信息
- 获取Android相关版本信息
- 获取android项目相关信息
- Android获取手机相关信息
- 获取android签名相关信息
- Android 获取framebuffer相关信息
- Android 获取屏幕相关信息
- Android 获取网络相关信息
- android获取屏幕相关信息
- java volatile
- Java重写和重载
- Android上传图片的问题老是报错,求大神们赐教。
- 汕头市选2012初中组 数数(count) (jzoj)
- java设计模式之外观模式
- Android 获取App相关信息
- Apache Mina 源码再读5 IoSession.close() 源码剖析
- 删除链表中的元素
- 模拟退火算法应用(Java)
- 字典树(讲解+模板)
- 【完美解决系列】duplicate definition of library class [android.net.http.SslError]
- ios排序
- 图片加载之Glide使用
- 鼠标的点击事件