简体   繁体   English

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

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

I'm developing an android application that can do permission-based searches. 我正在开发一个可以进行基于权限的搜索的Android应用程序。 I have a code that takes and parses AndroidManifest.xml files in apk files. 我有一个代码,用于解析apk文件中的AndroidManifest.xml文件。

This code parses the xml file and outputs an result like this: 此代码解析xml文件并输出如下结果:

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

I have a model called PInfo. 我有一个名为PInfo的模型。 This model has an ArrayList named permissions. 此模型具有名为权限的ArrayList。 When you get permissions with "PackageInfo" on Android, it gives the following results. 当您在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 file: 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 code: 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());
        }
    }

I want to get this result also on the Android side. 我想在Android端得到这个结果。

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

This should provide accurate results for thousands of applications. 这应该为数千个应用程序提供准确的结果。 How can I do? 我能怎么做?

According to 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. 您的APK文件只能包含一个AndroidManifest.xml文件,但您的Android Studio项目可能包含多个 - 由主要源集,构建变体和导入的库提供。 So when building your app, the Gradle build merges all manifest files into a single manifest file that's packaged into your APK. 因此,在构建应用程序时,Gradle构建会将所有清单文件合并到一个打包到APK中的清单文件中。

The manifest file you attached is your manifest but when android compiling your project it will merge other manifests into your manifest. 您附加的清单文件是您的清单,但是当android编译您的项目时,它会将其他清单合并到您的清单中。 for example if you implement a library its manifest will merge into yours in apk file. 例如,如果您实现一个库,它的清单将合并到您的apk文件中。 for finding manifest file of your apk try to decompile it ( here ) and read that file. 找到你的apk的清单文件尝试反编译它( 这里 )并读取该文件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM