Android中获取当前运行包名的适配

android 有时需要获取当前运行的包名,做相应的操作

在android 5.0之前可以使用

String topApp

            ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

            List rti = mActivityManager.getRunningTasks(1);

            topApp= rti.get(0).topActivity.getPackageName();

但是这个方法在android5.0 以后就废弃,防止应用获取更多的用户隐私

所以就需要添加废弃了如上方法 ,如果拥有系统权限则可以继续使用但是需要添加如下权限

否则需要申请相关权限


    private boolean hasPermission() {

        AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);

        int mode = 0;

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {

            mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,

                    android.os.Process.myUid(), getPackageName());

        }

        return mode == AppOpsManager.MODE_ALLOWED;

    }

通过如上方法判断应用是否有这个权限,没有就通过

                                                    startActivityForResult(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS),0x3000);

打开后在onActiivtyForResult里面进行相关监听

如果获取到权限后则可以通过如下方法进行获取当前运行的包名:

            UsageStatsManager usm=(UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);

            if (usm!=null){

                long now=System.currentTimeMillis();

                List uStats = usm.queryUsageStats(UsageStatsManager.INTERVAL_BEST, now - 60 * 1000, now);

                if ((uStats!=null)&&(!uStats.isEmpty())){

                    int j = 0;

                    for (int i = 0; i < uStats.size(); i++) {

                        if (uStats.get(i).getLastTimeUsed() > uStats.get(j).getLastTimeUsed()) {

                            j = i;

                        }

                    }

                    topApp= uStats.get(j).getPackageName();

                }

            }

topApp 就是获取的当前运行的包名

二,在android 中时常需要悬浮窗的权限

在android6.0 之前可以直接使用windowManager addView的方式显示 ,但是到了android6.0 之后,android添加了动态权限申请机制 于是就有两种实现方法

方法一:在使用的地方申请相关权限

通过Settings.canDrawOverlays(context)方法判断悬浮窗权限是否打开

如果没有打开,则通过

startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:"+getPackageName())),0x1000);

进入设置页面,打开开关,然后在onActivityResult方法中监听,如果打开就做相应处理,否则提示用户

方法二:在windowManager 初始化时,设置 type为:WindowManager.LayoutParams.TYPE_TOAST

这样就可以避免申请权限,最优解决方案

你可能感兴趣的:(Android中获取当前运行包名的适配)