以编程方式从 android 中的 manifest.xml 检索权限

Posted

技术标签:

【中文标题】以编程方式从 android 中的 manifest.xml 检索权限【英文标题】:Programmatically retrieve permissions from manifest.xml in android 【发布时间】:2013-08-16 16:54:53 【问题描述】:

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

我阅读了the post here,但我对答案并不完全满意。 我想应该在 android API 中有一个类可以允许从清单中检索信息。

谢谢。

【问题讨论】:

这不是常见问题解答风格的 *** 帖子的合适格式。问一个问题,然后回答你自己的问题。 嗬...我将根据您的评论编辑问题。 我还不能发布我的答案,但是对于那些会读到这个的人,我建议看看PackageManager class 在下面查看我的答案,在 xamarin 工作室实现 ***.com/a/40304410/4507021 【参考方案1】:

您可以使用 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;

【讨论】:

这并不完全是我所要求的,但它让我找到了一种使用建议的大部分代码来做我想做的事情的方法,而无需解析清单。在 OP 中,我也说过我想避免其他地方提出的解决方案,这些解决方案主要包括解析清单。 当我在代码的第 8 行使用 .equals 时,它总是返回 false,所以我不得不将它从 p.equals 更改为 p.contains,然后它就完美运行了。 OP 能否发布他最终实际使用的代码,因为这个答案并不是真正要求的?【参考方案2】:

这是一个有用的实用方法。

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);
    

你可以get a working class from this gist。

【讨论】:

【参考方案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()));

【讨论】:

嗨。感谢您的回答,尽管这是一个已有 2 年历史的问题,已经有了答案。关于您的答案,我仍然会使用已接受的答案作为解决方案的基础,因为它使用旨在检索有关应用程序信息的类。我相信这比解析清单更可靠,清单的结构可能会根据 android 的目标版本而改变。它也更短。顺便说一句,您是否对 OP 投了反对票? @AlexisLeCompte No. 无需为您必须在代码中定义的每个不同应用程序检查不同的权限,这一点非常方便,尤其是对于 Android 6 及更高版本。节省了我的一天并获得了赞成票! :-) 这个想法很棒,但它不起作用! 没有找到&lt;uses-permission&gt;,甚至清单也包含许多。你真的测试过你的代码吗?我很想让它工作,因为其他解决方案不提供从清单文件中检索所有信息。请测试您的代码并进行必要的调整以使其正常工作。谢谢! 如果我们使用其他有自己的清单文件的模块怎么办?我认为最好采用设计方式并使用 api。【参考方案4】:

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

fun Manifest.getDeclaredPermissions(context: Context): Array<String> 
    return context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_PERMISSIONS).requestedPermissions

【讨论】:

【参考方案5】:

我有一个简单的 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);
    

【讨论】:

【参考方案6】:

你可以使用这个功能:

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

用法:

hasPermission(this,Manifest.permission.GET_ACCOUNTS);

【讨论】:

这是一个非常糟糕的答案。因为问题不是要检查系统权限(如果被授予)。问题是关于AndroidManifest.xml 中声明的权限列表 这是检查运行时权限是否可用。问题是检查权限是否添加到清单中。

以上是关于以编程方式从 android 中的 manifest.xml 检索权限的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从 Android 的默认应用列表中删除应用?

[Android - Kitkat ]以编程方式从 Android 的内置图库应用程序中获取/选择图像

如何在android中以编程方式从收件箱中删除所有短信?

以编程方式从 Android 的内置图库应用程序中获取/选择图像

如何以编程方式更改整个应用程序中的字体大小,Android?

Android:以编程方式突出显示listview中的当前选定选项