对于android–fitsSystemWindows和kitkat上的额外填充感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于Android4.4(KitKat)上的AndroidGal
对于android – fitsSystemWindows和kitkat上的额外填充感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于Android 4.4 (KitKat) 上的 Android Gallery 为 Intent.ACTION_GET_CONTENT 返回不同的 URI、Android 4.4 KitKat 支持 u 盘功能、Android 4.4(kitkat)最新特性、Android Jsoup Parser在kitkat上非常慢的宝贵知识。
本文目录一览:- android – fitsSystemWindows和kitkat上的额外填充
- Android 4.4 (KitKat) 上的 Android Gallery 为 Intent.ACTION_GET_CONTENT 返回不同的 URI
- Android 4.4 KitKat 支持 u 盘功能
- Android 4.4(kitkat)最新特性
- Android Jsoup Parser在kitkat上非常慢
android – fitsSystemWindows和kitkat上的额外填充
<LinearLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:context=".LauncherActivity" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/lvcalendar" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clipToPadding="false" android:fitsSystemWindows="true" android:dividerHeight="10dp" android:paddingTop="10dp" android:paddingBottom="10dp" android:divider="#00ffffff" android:scrollbarThumbVertical="@drawable/scrollbarstyle" android:layout_gravity="top" android:listSelector="@android:color/transparent" /> </LinearLayout>
活动主题包括:
<item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item>
在Kitkat设备下,行为是我想要的:项目底部和顶部都有10dp填充.在kitkat设备上,paddingTop和paddingBottom似乎没有效果,因为ListView的项目在顶部和底部没有10dp填充.
我认为问题出在android:fitsSystemWindows中,因为这个属性似乎设置了必要的填充到视图,因为半透明的装饰,并使android:padding *属性被忽略.
我的问题:无论如何,我可以将android:fitsSystemWindows设置为true并仍然在视图上添加额外的填充?
解决方法
<LinearLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:context=".LauncherActivity" android:fitsSystemWindows="true" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" >
Android 4.4 (KitKat) 上的 Android Gallery 为 Intent.ACTION_GET_CONTENT 返回不同的 URI
在 KitKat 之前(或在新画廊之前)Intent.ACTION_GET_CONTENT
返回一个这样的 URI
内容://媒体/外部/图像/媒体/3951。
使用ContentResolver
和查询 MediaStore.Images.Media.DATA
返回的文件 URL。
然而,在 KitKat 中,Gallery 会返回一个 URI(通过“Last”),如下所示:
内容://com.android.providers.media.documents/document/image:3951
我该如何处理?
Android 4.4 KitKat 支持 u 盘功能
Android U 盘功能实现和分析
u 盘功能实现结果:
准备工作
Android 的配置
配置 init.<board>.rc
mkdir /storage/udisk0 0000 system system
mkdir /mnt/media_rw/udisk0 0700 media_rw media_rw
service fuse_udisk0 /system/bin/sdcard -u 1023 -g 1023 -w 1023 -d /mnt/media_rw/udisk0 /storage/udisk0
class late_start
disabled
配置 fstab.<board>
/block/sda /mnt/media_rw/udisk0 vfat defaults voldmanaged=udisk0:auto
配置 overlay
<storage android:mountPoint="/storage/udisk0"
android:storageDescription="@string/storage_usb"
android:primary="false"
android:removable="true" />
挂载过程:
/dev/block/vold/8:1 /mnt/media_rw/udisk0 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/fuse /storage/udisk0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
root@android:/ # logcat -s Vold MountService
--------- beginning of /dev/log/main
--------- beginning of /dev/log/system
I/Vold ( 820): Vold 2.1 (the revenge) firing up
D/Vold ( 820): Volume sdcard1 state changing -1 (Initializing) -> 0 (No-Media)
D/Vold ( 820): Volume sdcard1 state changing -1 (Initializing) -> 0 (No-Media)
D/Vold ( 820): Volume udisk0 state changing -1 (Initializing) -> 0 (No-Media)
D/Vold ( 820): Volume udisk0 state changing 0 (No-Media) -> 2 (Pending)
D/Vold ( 820): Volume udisk0 state changing 2 (Pending) -> 1 (Idle-Unmounted)
D/Vold ( 820): Volume sdcard1 state changing 0 (No-Media) -> 2 (Pending)
D/Vold ( 820): Volume sdcard1 state changing 2 (Pending) -> 1 (Idle-Unmounted)
D/MountService( 1587): got storage path: /storage/sdcard0 description: Internal storage primary: true removable: false emulated: true mtpReserve: 50 allowMassStorage: false maxFileSize: 0
D/MountService( 1587): addVolumeLocked() StorageVolume:
D/MountService( 1587): mStorageId=65537 mPath=/storage/emulated/0 mDescriptionId=17040662
D/MountService( 1587): mPrimary=true mRemovable=false mEmulated=true mMtpReserveSpace=50
D/MountService( 1587): mAllowMassStorage=false mMaxFileSize=0 mOwner=UserHandle{0} mUuid=null
D/MountService( 1587): mUserLabel=null mState=null
D/MountService( 1587): got storage path: /storage/sdcard1 description: SD card primary: false removable: true emulated: false mtpReserve: 0 allowMassStorage: false maxFileSize: 4294967296
D/MountService( 1587): addVolumeLocked() StorageVolume:
D/MountService( 1587): mStorageId=0 mPath=/storage/sdcard1 mDescriptionId=17040663 mPrimary=false
D/MountService( 1587): mRemovable=true mEmulated=false mMtpReserveSpace=0 mAllowMassStorage=false
D/MountService( 1587): mMaxFileSize=4294967296 mOwner=null mUuid=null mUserLabel=null mState=null
D/MountService( 1587): got storage path: /storage/udisk0 description: USB storage primary: false removable: true emulated: false mtpReserve: 0 allowMassStorage: false maxFileSize: 0
D/MountService( 1587): addVolumeLocked() StorageVolume:
D/MountService( 1587): mStorageId=0 mPath=/storage/udisk0 mDescriptionId=17040664 mPrimary=false
D/MountService( 1587): mRemovable=true mEmulated=false mMtpReserveSpace=0 mAllowMassStorage=false
D/MountService( 1587): mMaxFileSize=0 mOwner=null mUuid=null mUserLabel=null mState=null
W/MountService( 1587): Duplicate state transition (unmounted -> unmounted) for /storage/sdcard1
D/MountService( 1587): volume state changed for /storage/sdcard1 (unmounted -> removed)
W/MountService( 1587): Duplicate state transition (unmounted -> unmounted) for /storage/udisk0
I/Vold ( 820): /dev/block/vold/8:1 being considered for volume udisk0
D/Vold ( 820): Volume udisk0 state changing 1 (Idle-Unmounted) -> 3 (Checking)
D/MountService( 1587): volume state changed for /storage/udisk0 (unmounted -> checking)
D/MountService( 1587): sendStorageIntent Intent { act=android.intent.action.MEDIA_CHECKING dat=file:///storage/udisk0 (has extras) } to UserHandle{-1}
I/Vold ( 820): Filesystem check completed OK
D/Vold ( 820): blkid identified as /dev/block/vold/8:1: UUID="402E-0EE3" TYPE="vfat"
D/Vold ( 820): Volume udisk0 state changing 3 (Checking) -> 4 (Mounted)
D/MountService( 1587): volume state changed for /storage/udisk0 (checking -> mounted)
D/MountService( 1587): sendStorageIntent Intent { act=android.intent.action.MEDIA_MOUNTED dat=file:///storage/udisk0 (has extras) } to UserHandle{-1}
W/MountService( 1587): Duplicate state transition (mounted -> mounted) for /storage/emulated/0
Vold 解析 fstab 文件
property_get("ro.hardware", propbuf, "");
snprintf(fstab_filename, sizeof(fstab_filename), FSTAB_PREFIX"%s", propbuf);
fstab = fs_mgr_read_fstab(fstab_filename);
if (!fstab) {
SLOGE("failed to open %s\n", fstab_filename);
return -1;
}
其中 #define FSTAB_PREFIX "/fstab." 所以,配置的 fatab 文件必须放在根目录, Vold 是 android 的后台进程,将会一直监听 fatab 里面标记为 voldmanaged 的项目
# Android fstab file.
#<src> <mnt_point> <type> <mnt_flags and opt
ions> <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
/dev/block/platform/dw_mmc.0/by-name/system /system ext4 ro
wait
/dev/block/platform/dw_mmc.0/by-name/cache /cache ext4 noatime,nosuid,nodev,nombl
k_io_submit,errors=panic wait,check
/dev/block/platform/dw_mmc.0/by-name/userdata /data ext4 noatime,nosuid,nodev,nombl
k_io_submit,errors=panic wait,check,encryptable=/dev/block/platform/dw_mmc.0/by-name/metadata
/dev/block/platform/dw_mmc.0/by-name/efs /factory ext4 noatime,nosuid,nodev,ro
wait
/dev/block/platform/dw_mmc.0/by-name/boot /boot emmc defaults
defaults
/dev/block/platform/dw_mmc.0/by-name/recovery /recovery emmc defaults
defaults
/dev/block/platform/dw_mmc.0/by-name/misc /misc emmc defaults
defaults
/dev/block/mmcblk0boot0 /bootloader emmc defaults
defaults
on fs
mkdir /factory 0775 radio radio
mount_all /fstab.manta
同理, init 的 mount 也会忽略标记为 voldmanaged 的项目
MountService 与 Vold 联合挂载 u 盘
private void readStorageListLocked() {
mVolumes.clear();
mVolumeStates.clear();
Resources resources = mContext.getResources();
int id = com.android.internal.R.xml.storage_list;
XmlResourceParser parser = resources.getXml(id);
AttributeSet attrs = Xml.asAttributeSet(parser);
try {
XmlUtils.beginDocument(parser, TAG_STORAGE_LIST);
while (true) {
XmlUtils.nextElement(parser);
Vold 获取到 list 里面的设备变化时将会发送 state change event, MountService 在 onEvent 处理各种不同 state ,其中获取到设备插入,将会执行挂载操作:
if (code == VoldResponseCode.VolumeDiskInserted) {
new Thread("MountService#VolumeDiskInserted") {
@Override
public void run() {
try {
int rc;
if ((rc = doMountVolume(path)) != StorageResultCode.OperationSucceeded) {
Slog.w(TAG, String.format("Insertion mount failed (%d)", rc));
}
} catch (Exception ex) {
Slog.w(TAG, "Failed to mount media on insertion", ex);
}
}
}.start();
doMountVolume 只是发送 mount 命令给 Vold
private int doMountVolume(String path) {
int rc = StorageResultCode.OperationSucceeded;
final StorageVolume volume;
synchronized (mVolumesLock) {
volume = mVolumesByPath.get(path);
}
if (DEBUG_EVENTS) Slog.i(TAG, "doMountVolume: Mouting " + path);
try {
mConnector.execute("volume", "mount", path);
最终 Vold 里面执行相应的 mount 操作,我们的 u 盘是 vfat 格式,我只测试了这个格式, Linux 下的格式没有测试,因为 Vold 只支持 fat 和 ext4
int VolumeManager::mountVolume(const char *label) {
Volume *v = lookupVolume(label);
if (!v) {
errno = ENOENT;
return -1;
}
return v->mountVol();
}
if (Fat::doMount(devicePath, getMountpoint(), false, false, false,
AID_MEDIA_RW, AID_MEDIA_RW, 0007, true)) {
SLOGE("%s failed to mount via VFAT (%s)\n", devicePath, strerror(errno));
continue;
Android 4.4(kitkat)最新特性
[参考官网]http://www.android.com/versions/kit-kat-4-4/
Android 4.4(kitkat)最新特性
迷人&关注人性
- 当在主屏幕或者是google商店,你喊一句''Ok, google''; 就会自动加载
语音搜索
,用于语音发短信,获得方向,还可以播放音乐
<p> 例如: 你在google商店里面想去搜索一款app:如`大众点评`, 只要打开google商店,看到搜索输入框,喊一句‘Ok, google’,就会自动加载`语音搜索`,然后你再喊出`大众点评`,然后就会去搜索相应的应用了;同理其他。没有安装4.4手机的可以去体验chrome31版本,或者直接手机下在一个最新版本体验一下 <p/>
-
锁屏状态下,可以播放,暂停,下一首音乐;显示音乐或者是作者的背景图片(应该有好多第三方锁屏软件也能做到这点吧,这个只是原生就带有罢了)
-
关注自己相关的(Immerse yourself), 个人理解就是全屏模式嘛,还有其他吗?好像之前也有这样的功能吧;
-
性能提高;Faster multitasking(让多任务更快速)
聪明&简单
-
打电话功能更加人性(最近联系人,附近联系人)功能越做越全,让第三方做应用的怎么办;
-
更加聪明的电话,打电话不仅仅是在电话本里面搜索,还可以去google map里面去搜索,(这是要暴露自己位置的节奏吗?看看打开手机,李开复是不是在附近;可以打骚扰电话去了,方便了找附近医院,学校,公司等联系电话)
-
所有的发送信息都在一个软件(Hangouts app)上,比如短信,邮件;增强了联系人关系不仅仅只是短信联系人,还有邮件联系人;(往往很多时候有一个人电话不一定会有一个人的邮件,或者返过来说)
-
google输入法,加入了各种表情;之前是没有的,不过第三方是有的(妹的又在排挤第三方)
随时掌控
- 连接打印机
- 随时随地办公(quickoffice办公软件)
其他
- Bluetooth MAP support, 支持蓝牙访问,可以用手机控制带有蓝牙功能的设备,如汽车;
- 可以把手机上的高清内容投影到自己家里的高清电视上(小米盒子,电视棒都有这样的功能吧)
- webview使用了chrome内核渲染,之前是webkit, 后来chrome28内核转到(blink)
- 手机丢失能够清除数据
- 下载应用的重新设计
- 桌面应用容易切换
- email应用刷新方式改变
- 预览壁纸设置
- 动态高清拍照摄影
- 红外爆破,应用能够控制附近的设备
- 快速定位
- 省电模式,本地模式和监控;
- 省电播放音频
- 锁屏状态下,屏幕可以拖动进度条
- app沙盒,保证系统安全
- 记步器,主要用于一些健康产品,依赖硬件
- 轻支付,一种新的NFC支付方式
- 触摸体验升级,触屏更加灵敏了
总结:copy第三放的idea, 加强联系人之间的关系,加强联系人和附近商铺,服务之间的关系
Android Jsoup Parser在kitkat上非常慢
Jsoup似乎在kitkat上解析的速度比在kitkat之前的解析要慢得多.我不确定它是否是ART运行时,但是在对一种解析方法进行速度测试后发现它慢了大约5倍,我也不知道为什么.
我的代码的这一部分在异步任务的doInBackground中运行.
JsoupParser parser = new JsoupParser();
parser.setPath(String.valueOf(application.getCacheDir()));
Collection<Section> allSections = eguide.getSectionMap().values();
for (Section section : allSections) {
parser.createNewAssetList();
parser.setContent(section.color, section.name, section.text, section.slug);
if (!TextUtils.isEmpty(section.text)) {
section.text = parser.setWebViewStringContent();
section.assets = parser.getAssets();
for (Asset asset : section.assets)
asset.heading = section.heading;
}
}
我是在很久以前写的,它可能不是很有效,但是它设置了解析器,加载了Section对象的列表,对于每个对象,它将html提取表和图像解析为不同对象的列表,这些对象返回到原始section对象..
这是我的解析器类.
public class JsoupParser{
private List<Asset> assets;
private int assetCount;
private String slug,name,color,path;
private Document doc;
public JsoupParser() {
assetCount = 0;
assets = new ArrayList<Asset>();
}
public void setPath(String path) {
this.path = path;
}
public void setContent(String color, String name, String text, String slug){
this.color = color;
this.name = name;
this.slug = slug;
doc = Jsoup.parse(text);
}
public void createNewAssetList(){
assetCount = 0;
assets = new ArrayList<Asset>();
}
public String setWebViewStringContent() {
addScriptsAndDivTags();
//parse images
Elements images = doc.select("img[src]");
parseImages(images);
//parse tables
Elements tableTags = doc.select("table");
parseTables(tableTags);
return doc.toString();
}
private void addScriptsAndDivTags() {
Element bodyReference = doc.select("body").first(); //grab head and body ref's
Element headReference = doc.select("head").first();
Element new_body = doc.createElement("body");
//wrap content in extra div and add accodrion tag
bodyReference.tagName("div");
bodyReference.attr("id", "accordion");
new_body.appendChild(bodyReference);
headReference.after(new_body);
}
private void parseTables(Elements tableTags) {
if (tableTags != null) {
int count = 1;
for (Element table : tableTags) {
Asset item = new Asset();
item.setContent(table.toString());
item.setColor(color);
item.id = (int) Math.ceil(Math.random() * 10000);
item.isAsset=1;
item.keywords = table.attr("keywords");
String linkHref = table.attr("table_name");
item.slug = "t_" + slug + " " + count ;
if(!TextUtils.isEmpty(linkHref)){
item.name = linkHref;
}
else{
item.name ="Table-" + (assetCount + 1) + " in " + name;
}
// replace tables
String inline = table.attr("inline");
String button = ("<p>Dummy Button</p>");
if(!TextUtils.isEmpty(inline)&& inline.contentEquals("false") || TextUtils.isEmpty(inline) )
{
table.replaceWith(new Datanode(button, ""));
}
else{
Element div = doc.createElement("div");
div.attr("class","inlineTableWrapper");
div.attr("onclick", "window.location ='table://"+item.slug+"';");
table.replaceWith(div);
div.appendChild(table);
}
assets.add(item);
assetCount++;
count++;
}
}
}
private void parseImages(Elements images) {
for (Element image : images) {
Asset item = new Asset();
String slug = image.attr("src");
//remove first forward slash from slug to account for img:// protocol in image linking
if(slug.charat(0)=='/')
slug = slug.substring(1,slug.length());
image.attr("src", path +"/images/" + slug.substring(slug.lastIndexOf("/")+1, slug.length()));
image.attr("style", "px; border:1px solid #000000;");
String image_name = image.attr("image_name");
if(!TextUtils.isEmpty(image_name)){
item.name = image_name;
}
else{
item.name ="Image " + (assetCount + 1) + " in " + name;
}
// replace tables
String inline = image.attr("inline");
String button = ("<p>Dummy Button</p>");
item.setContent(image.toString()+"<br/><br/><br/><br/>");
if(!TextUtils.isEmpty(inline)&& inline.contentEquals("false"))
{
image.replaceWith(new Datanode(button, ""));
}
else{
image.attr("onclick", "window.location ='img://"+slug+"';");
}
item.keywords = image.attr("keywords");
item.setColor(color);
item.id = (int) Math.ceil(Math.random() * 10000);
item.slug = slug;
item.isAsset =2;
assets.add(item);
assetCount++;
}
}
public String getName() {
return name;
}
public List<Asset> getAssets() {
return assets;
}
}
同样,它的效率可能不是很高,但是到目前为止,我一直无法找出为什么它会对kitkat产生如此大的影响.任何信息将不胜感激.
谢谢!
解决方法:
更新2015年4月7日jsoup的作者将我的建议纳入了主干,此时检查ASCII或UTF编码并跳过慢速(在Android 4.4和5上)canEncode()调用,因此只需更新jsoup源代码树并重新构建,或者拉动他的最新罐子.
对此问题的早期评论和解释:我发现了问题所在,至少在我的应用程序中-jsoup的Entities.java模块具有escape()函数-例如通过Element.outerHtml()调用所有文本节点.其中,它会测试每个文本节点的每个字符是否可以使用当前编码器进行编码:
if (encoder.canEncode(c))
accum.append(c);
else...
在Android KitKat和Lollipop上,canEncode()调用速度极慢.由于我的HTML输出仅是UTF-8,而Unicode实际上可以编码任何字符,因此此检查不是必需的.我通过在escape()函数开始时进行测试来更改它:
boolean encIsUnicode = encoder.charset().name().toupperCase().startsWith("UTF-");
然后在需要测试时:
if (encIsUnicode || encoder.canEncode(c))
accum.append(c);
else ...
现在,我的应用程序在KitKat和Lollipop上也像超级魅力一样工作-以前耗时10秒,现在不到1秒.通过此更改和一些较小的优化,我向主jsoup存储库发出了pull请求.不知道jsoup作者是否会合并它.如果需要,请在以下位置查看我的叉子:
https://github.com/gregko/jsoup
如果您使用预先知道的其他编码,则可以添加自己的测试(例如,查看字符是否为ASCII或其他字符),以避免调用canEncode(c)造成的费用.
格雷格
关于android – fitsSystemWindows和kitkat上的额外填充的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android 4.4 (KitKat) 上的 Android Gallery 为 Intent.ACTION_GET_CONTENT 返回不同的 URI、Android 4.4 KitKat 支持 u 盘功能、Android 4.4(kitkat)最新特性、Android Jsoup Parser在kitkat上非常慢等相关知识的信息别忘了在本站进行查找喔。
本文标签: