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

How do I get permissions only in AndroidManifest.xml file for installed apps in android device?

我正在开发一个可以进行基于许可的搜索的 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

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

根据official docs

Your APK file can contain just one AndroidManifest.xml file, but your Android Studio project may contain several—provided by the main source set, build variants, and imported libraries. So when building your app, the Gradle build merges all manifest files into a single manifest file that's packaged into your APK.

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