Android 11 (API 30) ContentProvider开发及碰到的问题 (Unknown URL content)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 11 (API 30) ContentProvider开发及碰到的问题 (Unknown URL content)相关的知识,希望对你有一定的参考价值。

参考技术A

测试包含两个应用程序: FirstContentProvider 与 FirstContentResolver ,下面分别对两者进行说明

新建应用程序项目后(创建时可以选择 Empty Activity ),修改 androidManifest.xml ,增加如下内容:

android:authorities="com.example.provider" 字段可以自定义

android:name=".FirstProvider" 中的 FirstProvider 就是需要创建的类,在 MainActivity 所在的包下新建该类:

修改 activity_main.xml ,只是修改 TextView 的文本内容(不影响程序功能,这一步可做可不做):

activity_main.xml :

MainActivity.java :

如果编写完上述两个源文件,就运行两个程序,那么 FristContentResolvert 在点击主界面的按钮后,程序会崩溃,查看日志得到如下错误:

经过一番搜索,这是在 Android 11 下才会出现的问题,简单来说,就是出于安全考虑,Android 11 要求应用事先说明需要访问的其他软件包

可以使用: adb shell dumpsys package queries 查看哪些软件包是可以访问的,使用 grep 可以过滤出我们想要看的软件包,例如:

在 AndroidManifest.xml 中添加 <queries> :

启动两个程序,打开 FirstContentProvider 的 LogCat :

依次点击 FirstContentResolver 的四个按钮,可以看到:

至此,测试完成

IP 到位置 API 的 PHP 正则表达式

【中文标题】IP 到位置 API 的 PHP 正则表达式【英文标题】:PHP Regex for IP to Location API 【发布时间】:2011-03-08 18:01:28 【问题描述】:

我将如何使用 Regex 获取关于 IP 到 Location API 的信息

这是 API

http://ipinfodb.com/ip_query.php?ip=74.125.45.100

我需要获取国家名称、地区/州和城市。

我试过了:

$ip = $_SERVER["REMOTE_ADDR"];
$contents = @file_get_contents('http://ipinfodb.com/ip_query.php?ip=' . $ip . '');
$pattern = "/<CountryName>(.*)<CountryName>/";
preg_match($pattern, $contents, $regex);
$regex = !empty($regex[1]) ? $regex[1] : "FAIL";
echo $regex;

当我执行 echo $regex 时,我总是失败,我该如何解决这个问题

【问题讨论】:

【参考方案1】:

您最好使用 XML 解析器来提取信息。

例如,this script 会将其解析为数组。

Regex 真的不应该用于解析 HTML 或 XML。

【讨论】:

【参考方案2】:

正如亚伦建议的那样。最好不要重新发明***,所以尝试用 simplexml_load_string() 解析它

// Init the CURL
$curl = curl_init();

// Setup the curl settings
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 0);

// grab the XML file
$raw_xml = curl_exec($curl);

curl_close($curl);

// Setup the xml object
$xml = simplexml_load_string( $raw_xml );

您现在可以将 $xml 变量的任何部分作为对象访问,这里是您发布的示例。

<Response> 
    <Ip>74.125.45.100</Ip> 
    <Status>OK</Status> 
    <CountryCode>US</CountryCode> 
    <CountryName>United States</CountryName> 
    <RegionCode>06</RegionCode> 
    <RegionName>California</RegionName> 
    <City>Mountain View</City> 
    <ZipPostalCode>94043</ZipPostalCode> 
    <Latitude>37.4192</Latitude> 
    <Longitude>-122.057</Longitude> 
    <Timezone>0</Timezone> 
    <Gmtoffset>0</Gmtoffset> 
    <Dstoffset>0</Dstoffset> 
</Response> 

现在,当您将此 XML 字符串加载到 simplexml_load_string() 中后,您可以像这样访问响应的 IP 地址。

$xml->IP;

simplexml_load_string() 会将格式良好的 XML 文件转换为您可以操作的对象。我唯一能说的就是去尝试一下并玩一下

编辑:

来源 http://www.php.net/manual/en/function.simplexml-load-string.php

【讨论】:

或者简单地说:$xml = simplexml_load_file($url); Semantics ;-) 这是我唯一真正的工作示例【参考方案3】:

如果你真的需要使用正则表达式,那么你应该更正你正在使用的那个。 "|&lt;CountryName&gt;([^&lt;]*)&lt;/CountryName&gt;|i" 会更好。

【讨论】:

正如其他人报告的那样,如果不是在某些特定情况下,我宁愿不使用正则表达式来解析 HTML、XHTML 或 XML。我必须快速验证返回的 XML 内容是否包含标签,并且我使用了正则表达式;对于其他情况,如果返回的 XML 不太大,最好使用 SimpleXML。

以上是关于Android 11 (API 30) ContentProvider开发及碰到的问题 (Unknown URL content)的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 11 (API 30) 中以编程方式更改状态栏文本颜色

如何在没有系统确认对话框的情况下删除 Android 11 (API 30) 上的文件?

在 Android 11 (API 30) 上检测“提高位置准确性”开/关状态

在 android 10/11 (api 29/30) 下是不是仍然可以破坏性地修改您不拥有的文件?

Android room + ContentProvider 示例,支持API 30(android 11)

Android ContentProvider中使用 room 并支持API 30(android 11)