安卓获取顶层应用的包名

本文介绍了如何在安卓系统中获取当前顶层应用的包名,包括需要申请的权限 `<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />`,以及后续的获取步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安卓获取当前应用的包名

1.权限
 <uses-permission  
        android:name="android.permission.PACKAGE_USAGE_STATS"  
        tools:ignore="ProtectedPermissions" />  

注:需要加入 xmlns:tools="http://schemas.android.com/tools",否则报错


2.获取包名

//获取顶端应用的包名
public String getTopAppPack() {
		String topPackageName = "";
		//android5.0以上获取方式
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
		        if(isPermissionNoSwitch()){
		        	//没有授权时跳转授权
	        	 	Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
			        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			        startActivity(intent);
			        return topPackageName;
		        }
	            UsageStatsManager mUsageStatsManager = (UsageStatsManager) getSystemService("usagestats");
	            long time = System.currentTimeMillis();
	            int start = 3600 * 1000 * 12;//12个小时,时间段过短当程序运行一段时间后会导致获取失败
	            List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - start, time);
	            if (stats != null) {
	                SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
	                for (UsageStats usageStats : stats) {
	                    mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
	                }
	                if (mySortedMap != null && !mySortedMap.isEmpty()) {
	                    topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
	                    Log.e("TopPackage Name", topPackageName);
	                }
	            }
	            
	        }
		//android5.0以下获取方式
		else{
			 ActivityManager activityManager = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));
            List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
            if(tasks != null && tasks.size() > 0){
	            ActivityManager.RunningTaskInfo taskInfo = tasks.get(0);
	            topPackageName = taskInfo.topActivity.getPackageName();
            }else{
            	//获取失败
            }
        }
		return topPackageName;
    }
	
	//检测获取top应用的包名的权限是否开启
	private boolean isPermissionNoSwitch() {  
        long ts = System.currentTimeMillis();  
        UsageStatsManager usageStatsManager = (UsageStatsManager) getApplicationContext()  .getSystemService("usagestats");  
        List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, 0, ts);  
        if (queryUsageStats != null && !queryUsageStats.isEmpty()) {  
            for(UsageStats stats : queryUsageStats){
            	Log.e(TAG, " stats pack: " + stats.getPackageName());
            	if(stats.getPackageName().equals(getPackageName())){
            		return false;
            	}
            }
        	return true;  
        }  
        return true;  
		
        //失败
//		PackageManager pm = getPackageManager();  
//        boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.PACKAGE_USAGE_STATS", getPackageName()));  
//        if (permission) {  
//            return false;
//        }else {  
//            return true;
//        }  
        
        //失败
        //return checkCallingOrSelfPermission("android.permission.PACKAGE_USAGE_STATS") != PackageManager.PERMISSION_GRANTED;
    }
	
	//判断当前设备中有没有“有权查看使用权限的应用”这个选项
	private boolean hasUsageSettingActivity() {  
        PackageManager packageManager = getApplicationContext().getPackageManager();  
        Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);  
        List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
    }  
	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值