Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ContentProvider查找其他URI_Android_Android Contentprovider - Fatal编程技术网

Android ContentProvider查找其他URI

Android ContentProvider查找其他URI,android,android-contentprovider,Android,Android Contentprovider,我正在编写一个应用程序,它将查询其他应用程序的内容提供者。我遇到了一个问题,因为给定其他应用程序的ProviderInfo,我无法获取其ContentProvider的URI。到目前为止,我有以下函数接收ProviderInfo对象,但我不知道如何找到要查询的可用URI。调用provider.authority是不够的,因为它没有指定要查询的后缀表名。其他应用程序也可以做到这一点,比如ContentProviderHelper(),但我无法在代码中找到它们是如何做到这一点的 有人在这件事上运气好

我正在编写一个应用程序,它将查询其他应用程序的内容提供者。我遇到了一个问题,因为给定其他应用程序的ProviderInfo,我无法获取其ContentProvider的URI。到目前为止,我有以下函数接收ProviderInfo对象,但我不知道如何找到要查询的可用URI。调用provider.authority是不够的,因为它没有指定要查询的后缀表名。其他应用程序也可以做到这一点,比如ContentProviderHelper(),但我无法在代码中找到它们是如何做到这一点的

有人在这件事上运气好吗

public String[] getContentProviderColumnNames(ProviderInfo provider){
    Uri u = Uri.parse("content://"+provider.authority);//How do i get the complete URI?

    ContentResolver resolver = getActivity().getContentResolver();
    //below fails of course because the URI is invalid
    Cursor c = resolver.query(u, null, null, null, null);

    //Todo: for each found uri (tablename), query it using getColumnName
    //Get column names
    int colCount = c.getColumnCount();
    String[] columnNames = new String[colCount];
    for (int i = 0; i<colCount; i++) {
        columnNames[i] = c.getColumnName(i);
    }
    return columnNames;
}
公共字符串[]getContentProviderColumnNames(ProviderInfo提供程序){
uriu=Uri.parse(“content://”+provider.authority);//如何获取完整的Uri?
ContentResolver解析器=getActivity().getContentResolver();
//下面的操作当然会失败,因为URI无效
游标c=resolver.query(u,null,null,null,null);
//Todo:对于找到的每个uri(tablename),使用getColumnName查询它
//获取列名
int colCount=c.getColumnCount();
String[]columnNames=新字符串[colCount];
对于(int i=0;i
我正在编写一个应用程序,它将查询其他应用程序的内容提供者

这不太可能奏效,因为您对其他应用程序的提供商一无所知。您可以通过这种方式访问的任何提供商都表明其他应用程序中存在安全漏洞,因为提供商应通过适当的权限进行保护

我遇到了一个问题,因为给定其他应用程序的ProviderInfo,我无法获取其ContentProvider的URI

正确。有效的
Uri
值取决于提供程序的实现,并且不可发现

其他应用程序也可以这样做,例如ContentProviderHelper()


不,不是。Driller先生的搜索机制是对
Uri
值进行猜测,使用的基本算法与您在问题中的代码片段相同。没有要求提供商使用该
Uri
值,我希望很少人会这样做。其余的都是。谢谢您消除了我的困惑使用ContentProviderHelper。我的下一个评论是关于Drozer漏洞测试框架。我假设它必须通过ADB解析dumpsys来收集ContentProvider URI。不过,你回答了我的问题,谢谢!@behren:我没有戳Drozer看看它做了什么。当然,一个足够强大的反编译器可以推断一些
ContentProvider
实现使用的
Uri
结构,但总的来说,这是一个无界的问题。