【问题标题】:How do I get permissions only in AndroidManifest.xml file for installed apps in android device?如何仅在 AndroidManifest.xml 文件中获取 android 设备中已安装应用程序的权限?
【发布时间】:2019-06-17 13:59:12
【问题描述】:

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

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

【问题讨论】:

  • 顺便说一句,在您为 catch 语句编写的 Java 代码中,Log.v 不是这样工作的——您需要指定一个标签(通常是类的名称)作为第一个参数和第二个消息。
  • 谢谢...我知道。这段代码只是一个引用。代码很脏。

标签: android android-manifest android-permissions


【解决方案1】:

根据official docs

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

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

【讨论】:

  • 感谢您的回答。我想将其开发为 android 应用程序。有什么方法可以解析应用程序的主清单文件吗?
  • 我认为您的清单文件权限与最终合并清单文件中项目中的任何其他清单文件之间没有任何差异。
  • 谢谢,我会用新的测试数据试试。
  • 是的,一切正常。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2011-10-13
相关资源
最近更新 更多