21

我必须以编程方式从 android 应用程序的 manifest.xml 中检索权限,但我不知道该怎么做。

我在这里阅读了这篇文章,但我对答案并不完全满意。我猜想在 android API 中应该有一个允许从清单中检索信息的类。

谢谢你。

4

6 回答 6

27

您可以使用PackageManager获取应用程序请求的权限(可能不会被授予):

PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
String[] permissions = info.requestedPermissions;//This array contains the requested permissions.

我在实用程序方法中使用它来检查是否声明了预期的权限:

//for example, permission can be "android.permission.WRITE_EXTERNAL_STORAGE"
public boolean hasPermission(String permission) 
{
    try {
        PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
        if (info.requestedPermissions != null) {
            for (String p : info.requestedPermissions) {
                if (p.equals(permission)) {
                    return true;
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}
于 2013-08-14T17:06:11.967 回答
16

这是一个有用的实用方法,可以做到这一点。

public static String[] retrievePermissions(Context context) {
    try {
        return context
                .getPackageManager()
                .getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS)
                .requestedPermissions;
    } catch (PackageManager.NameNotFoundException e) {
        throw new RuntimeException ("This should have never happened.", e);
    }
}

你可以从这个要点中得到一个工人阶级

于 2017-02-02T01:40:40.487 回答
3

用这个:

public static String getListOfPermissions(final Context context)
{
    String _permissions = "";

    try
    {
        final AssetManager _am = context.createPackageContext(context.getPackageName(), 0).getAssets();
        final XmlResourceParser _xmlParser = _am.openXmlResourceParser(0, "AndroidManifest.xml");
        int _eventType = _xmlParser.getEventType();
        while (_eventType != XmlPullParser.END_DOCUMENT)
        {
            if ((_eventType == XmlPullParser.START_TAG) && "uses-permission".equals(_xmlParser.getName()))
            {
                for (byte i = 0; i < _xmlParser.getAttributeCount(); i ++)
                {
                    if (_xmlParser.getAttributeName(i).equals("name"))
                    {
                        _permissions += _xmlParser.getAttributeValue(i) + "\n";
                    }
                }
            }
            _eventType = _xmlParser.nextToken();
        }
        _xmlParser.close(); // Pervents memory leak.
    }
    catch (final XmlPullParserException exception)
    {
        exception.printStackTrace();
    }
    catch (final PackageManager.NameNotFoundException exception)
    {
        exception.printStackTrace();
    }
    catch (final IOException exception)
    {
        exception.printStackTrace();
    }

    return _permissions;
}
// Test: Log.wtf("test", getListOfPermissions(getApplicationContext()));
于 2016-09-09T01:42:45.893 回答
0

如果有人正在寻找一个简短的Kotlin版本

fun Manifest.getDeclaredPermissions(context: Context): Array<String> {
    return context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_PERMISSIONS).requestedPermissions
}
于 2021-10-27T10:15:44.037 回答
-4

我有一个简单的 C# 代码,“使用 System.Xml”

private void ShowPermissions()
   {
    XmlDocument doc = new XmlDocument();
    doc.Load("c:\\manifest.xml");

    XmlNodeList nodeList = doc.GetElementsByTagName("uses-permission");


    foreach(XmlNode node in nodeList)
    {
        XmlAttributeCollection Attr = node.Attributes;
        string Permission=Attr["android:permission"].Value;

        MessageBox.Show(Permission);
    }
}
于 2018-08-08T10:43:23.020 回答
-5

您可以使用此功能:

public boolean hasPermission(Context ctx,String permission){
        return ctx.getPackageManager().checkPermission(permission, ctx.getPackageName())
               == PackageManager.PERMISSION_GRANTED); 
}

用法:

hasPermission(this,Manifest.permission.GET_ACCOUNTS);
于 2015-02-09T14:05:17.123 回答