You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native实现从个人应用检测Android工作配置文件应用是否安装

跨配置文件检测应用是否安装的解决方案

Android的工作配置文件本质是独立的用户空间,默认的包查询API只能访问当前用户(个人配置)下的应用,所以react-native-check-app-install这类依赖默认PackageManager接口的插件无法检测到工作配置里的应用。要实现跨配置检测,需要编写原生Android模块调用多用户相关API。

具体步骤

1. 编写Android原生模块

在React Native项目的Android端,创建自定义模块调用PackageManager.getPackageInfoForUser方法,指定工作配置文件对应的用户ID:

package com.yourprojectname;

import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserHandle;
import android.os.UserManager;
import androidx.annotation.NonNull;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Promise;
import java.util.List;

public class CheckWorkAppModule extends ReactContextBaseJavaModule {
    private final ReactApplicationContext reactContext;

    public CheckWorkAppModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
    }

    @NonNull
    @Override
    public String getName() {
        return "CheckWorkApp";
    }

    @ReactMethod
    public void isAppInstalledInWorkProfile(String packageName, Promise promise) {
        try {
            UserManager userManager = (UserManager) reactContext.getSystemService(Context.USER_SERVICE);
            // 获取所有关联用户,工作配置属于MANAGED_PROFILE类型
            List<UserHandle> userHandles = userManager.getUserProfiles();
            
            boolean isInstalled = false;
            for (UserHandle userHandle : userHandles) {
                try {
                    // 检查指定用户下的包是否存在
                    reactContext.getPackageManager().getPackageInfoForUser(packageName, PackageManager.GET_META_DATA, userHandle.getIdentifier());
                    isInstalled = true;
                    break;
                } catch (PackageManager.NameNotFoundException e) {
                    // 该用户下未安装,继续检查其他用户
                }
            }
            promise.resolve(isInstalled);
        } catch (Exception e) {
            promise.reject("ERROR", e.getMessage());
        }
    }
}

2. 注册原生模块

创建对应Package类注册这个模块:

package com.yourprojectname;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CheckWorkAppPackage implements ReactPackage {
    @NonNull
    @Override
    public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new CheckWorkAppModule(reactContext));
        return modules;
    }

    @NonNull
    @Override
    public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

然后在MainApplication.java的getPackages方法中添加这个Package:

@Override
protected List<ReactPackage> getPackages() {
    @SuppressWarnings("UnnecessaryLocalVariable")
    List<ReactPackage> packages = new PackageList(this).getPackages();
    // 添加自定义包
    packages.add(new CheckWorkAppPackage());
    return packages;
}

3. React Native端调用

在JS层封装调用方法:

import { NativeModules } from 'react-native';

const { CheckWorkApp } = NativeModules;

export const checkAppInWorkProfile = async (packageName) => {
  try {
    const isInstalled = await CheckWorkApp.isAppInstalledInWorkProfile(packageName);
    return isInstalled;
  } catch (error) {
    console.error('检测工作配置应用失败:', error);
    return false;
  }
};

// 使用示例
// checkAppInWorkProfile('com.yourcompany.appy').then(result => console.log('Y是否安装:', result));

注意事项

  • 确保应用已申请QUERY_ALL_PACKAGES权限,且在AndroidManifest.xml的queries标签中添加了Y应用的包名,这是跨配置查询的基础权限要求。
  • 如果设备没有工作配置文件,模块会返回false,调用时可处理该场景。
  • 部分厂商定制系统可能对多用户API有额外限制,需在目标设备上测试兼容性。

内容的提问来源于stack exchange,提问作者Sri Teja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:52:47