如何仅在AndroidManifest.xml文件中获取android设备中已安装应用的权限?

时间:2019-06-17 13:59:12

标签: android android-manifest android-permissions

我正在开发一个可以执行基于权限的搜索的android应用程序。我有一个代码,可以接收和解析apk文件中的AndroidManifest.xml文件。

此代码解析xml文件并输出如下结果:

android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.ACCESS_NETWORK_STATE
android.permission.INTERNET

我有一个称为PInfo的模型。该模型具有一个名为权限的ArrayList。在Android上使用“ PackageInfo”获得许可时,将显示以下结果。

android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.ACCESS_NETWORK_STATE
android.permission.INTERNET
android.permission.WAKE_LOCK
com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE
com.google.android.c2dm.permission.RECEIVE
android.permission.READ_EXTERNAL_STORAGE

AndroidManifest.xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.omfaer.minion">
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_CONTACTS" />
        <uses-permission android:name="android.permission.WRITE_CONTACTS" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name="com.omfaer.minion.activities.MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

            <activity
                android:name="com.omfaer.minion.activities.HomeActivity"
                android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>

            <activity android:name=".activities.WallpapersActivity"/>

            <provider
                android:exported="false"
                android:grantUriPermissions="true"
                android:authorities="${applicationId}.provider"
                android:name="android.support.v4.content.FileProvider">

                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_path"
                    />

            </provider>
        </application>

    </manifest>

PackageInfo代码:

    List<PackageInfo> packs = context.getPackageManager().getInstalledPackages(context.getPackageManager().GET_PERMISSIONS);

    for (int i = 0; i < packs.size(); i++) {
        PackageInfo p = packs.get(i);

        PInfo deviceApps = new PInfo();
        deviceApps.appName = p.applicationInfo.loadLabel(context.getPackageManager()).toString();
        deviceApps.appPackage = p.packageName;
        deviceApps.appIconId = p.applicationInfo.icon;
        StringBuilder strBuilderPermissions = new StringBuilder();
        try {
            if (p.requestedPermissions != null) {
                for (String perms : p.requestedPermissions) {
                    deviceApps.permissions.add(perms);
                }
            }
        } catch (Exception e) {
            //Log.v("PUCA for  add permissions ", e.toString());
        }
    }

我也想在Android端获得此结果。

android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.ACCESS_NETWORK_STATE
android.permission.INTERNET

这应该为数千个应用程序提供准确的结果。我该怎么办?

1 个答案:

答案 0 :(得分:0)

根据official docs

  

您的APK文件只能包含一个AndroidManifest.xml文件,但是您的   Android Studio项目可能包含多个-由主要来源提供   设置,构建变体和导入的库。所以当你建立   应用程序,Gradle构建将所有清单文件合并到一个清单中   打包到您的APK中的文件。

您附加的清单文件是清单,但是当android编译您的项目时,它将合并其他清单到清单中。例如,如果您实现一个库,则其清单将在apk文件中合并到您的清单中。要查找apk的清单文件,请尝试对其进行反编译(here)并读取该文件。