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】:
如果你真的需要使用正则表达式,那么你应该更正你正在使用的那个。 "|<CountryName>([^<]*)</CountryName>|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) 下是不是仍然可以破坏性地修改您不拥有的文件?