1

Google API を使用すると、getActiveAdmins() メソッドからデバイス内のすべてのアクティブな管理者のリストを取得できます。ただし、私の要件は、アクティブかどうかに関係なく、デバイスで可能なすべての管理者のリストが必要なことです。そうする方法はありますか?

ありがとう

4

2 に答える 2

2

DeviceAdminSettings の次の Android ソースで必要なコードを見つけることができます: https://android.googlesource.com/platform/packages/apps/Settings/+/kitkat-release/src/com/android/settings/DeviceAdminSettings.java

DevicePolicyManager mDPM; // = (DevicePolicyManager) getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
final HashSet<ComponentName> mActiveAdmins = new HashSet<ComponentName>();
final ArrayList<DeviceAdminInfo> mAvailableAdmins = new ArrayList<DeviceAdminInfo>();

...

    mActiveAdmins.clear();
    List<ComponentName> cur = mDPM.getActiveAdmins();
    if (cur != null) {
        for (int i=0; i<cur.size(); i++) {
            mActiveAdmins.add(cur.get(i));
        }
    }
    mAvailableAdmins.clear();
    List<ResolveInfo> avail = getActivity().getPackageManager().queryBroadcastReceivers(
            new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
            PackageManager.GET_META_DATA | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
    if (avail == null) {
        avail = Collections.emptyList();
    }
    // Some admins listed in mActiveAdmins may not have been found by the above query.
    // We thus add them separately.
    Set<ComponentName> activeAdminsNotInAvail = new HashSet<ComponentName>(mActiveAdmins);
    for (ResolveInfo ri : avail) {
        ComponentName riComponentName =
                new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name);
        activeAdminsNotInAvail.remove(riComponentName);
    }
    if (!activeAdminsNotInAvail.isEmpty()) {
        avail = new ArrayList<ResolveInfo>(avail);
        PackageManager packageManager = getActivity().getPackageManager();
        for (ComponentName unlistedActiveAdmin : activeAdminsNotInAvail) {
            List<ResolveInfo> resolved = packageManager.queryBroadcastReceivers(
                    new Intent().setComponent(unlistedActiveAdmin),
                    PackageManager.GET_META_DATA
                            | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
            if (resolved != null) {
                avail.addAll(resolved);
            }
        }
    }
    for (int i = 0, count = avail.size(); i < count; i++) {
        ResolveInfo ri = avail.get(i);
        try {
            DeviceAdminInfo dpi = new DeviceAdminInfo(getActivity(), ri);
            if (dpi.isVisible() || mActiveAdmins.contains(dpi.getComponent())) {
                mAvailableAdmins.add(dpi);
            }
        } catch (XmlPullParserException e) {
            Log.w(TAG, "Skipping " + ri.activityInfo, e);
        } catch (IOException e) {
            Log.w(TAG, "Skipping " + ri.activityInfo, e);
        }
    }

    getListView().setAdapter(new PolicyListAdapter());

これは、Android が [デバイス管理者] タブにそれらを一覧表示する方法です。

于 2015-03-19T08:41:53.580 に答える
2

以下のコードでアプリケーションのリストを見つけることができます

final Intent deviceAdminIntent = new Intent("android.app.action.DEVICE_ADMIN_ENABLED", null);
final List<ResolveInfo> pkgAppsList = getPackageManager().queryBroadcastReceivers(deviceAdminIntent, 0);
for (ResolveInfo aResolveInfo : pkgAppsList) {
    String pkg = aResolveInfo.activityInfo.applicationInfo.packageName;
        String name = aResolveInfo.activityInfo.applicationInfo.loadLabel(getPackageManager()).toString();

    System.out.println("Package :: " + pkg);
    System.out.println("Name :: " + name);
}

アプリケーションの ResolveInfo で必要なすべてのデータを取得できます。ここでResolveInfo javadoc を確認できます。


getActiveAdminsと同じようにComponentNameを返すメソッドを書きました

private List<ComponentName> getAllAdmins(Context mContext) {
        List<ComponentName> result = new ArrayList<ComponentName>();

        // Read all receivers who can listen android.app.action.DEVICE_ADMIN_ENABLED 
        // You can add all other action which can be used for DeviceAdminReceiver 
        final Intent deviceAdminIntent = new Intent("android.app.action.DEVICE_ADMIN_ENABLED", null);
        final List<ResolveInfo> pkgAppsList = mContext.getPackageManager().queryBroadcastReceivers(deviceAdminIntent, 0);
        for (ResolveInfo aResolveInfo : pkgAppsList) {
            // Prepare component and add to list

            result.add(new ComponentName(aResolveInfo.activityInfo.applicationInfo.packageName,
                    aResolveInfo.activityInfo.name)); 

            //String pkg = aResolveInfo.activityInfo.applicationInfo.packageName;
            //String name = aResolveInfo.activityInfo.applicationInfo.loadLabel(getPackageManager()).toString();
            //System.out.println("Package :: " + pkg);
            //System.out.println("Name :: " + name);
        }
        return result; 
    }
于 2013-10-08T06:37:14.740 に答える