华为 mate20 在默认桌面弹出 已检测到有一个红包可领取弹窗

华为 mate20 在默认桌面弹出 已检测到有一个红包可领取 弹窗是怎么回事?

在华为系统默认桌面正下方弹出一个大框,大概 1/3 个屏幕大小.
标题领取红包,内容已检测到有一个红包可领取,一个关闭按钮.
https://files.catbox.moe/8agh2e.jpg有安装拼多多,拼多多无通知和悬浮窗权限.
自启动权限只有微信、QQ 、支付宝.
当时在用的时候只有华为浏览器.
悬浮窗权限只有酷狗和自研的两个 APP 有.
大部分应用都没有通知权限.

当时截完图后点击了一下整体弹窗中间,没有任何反应,之后几秒自动消失了.
我个人习惯是什么智能设置都关闭了,除了 QQ 微信支付宝出现一个通知屏蔽一个通知,出现桌面红点屏蔽一个红点- –
设置里搜索了没有红包关键字,辅助功能也查看了没有相关设置,华为的手机管家也没这个插件.
根据下面网友反馈,很有可能是伪基站的 0 级短信(闪信)导致的.
49 条回复    2021-04-06 00:21:37 +08:00
qwwuyu
    1

qwwuyu   4 天前

截图: https://files.catbox.moe/8agh2e.jpg
titan2006
    2

titan2006   4 天前 via iPhone

大概率是华伪自己搞的
littlewing
    3

littlewing   4 天前 via iPhone

盲猜华为自己检测你的微信等 app 是否有红包,然后提醒你,和那些自动抢红包的插件类似
frantic
    4

frantic   4 天前   ❤️ 2

看看无障碍服务里面 是不是有抢红包助手之类的开起来了;
顺便说一句,我觉得华为的广告在国产 rom 里面算多的
chnyuwen
    5

chnyuwen   4 天前

@titan2006 您来啦。
imdong
    6

imdong   4 天前

运营商有一个啥推送,好像可以直接在手机上弹窗,加啥名想不起来了。
hafuhafu
    7

hafuhafu   4 天前

怎么看起来像窗口小组件,刚好在上面 4 个图标下方间隔也刚好。但是一搜索发现小米社区的回答说是拼多多的通知
%title插图%num
chnyuwen
    8

chnyuwen   4 天前

@frantic 在用华为,未看见什么广告。你说的华为的广告的出处?
zpfhbyx
    9

zpfhbyx   4 天前

@imdong 闪信?
imdong
    10

imdong   4 天前   ❤️ 2

可能是“0 级短信”,也叫“闪信”

/t/662606

 

hfc
    11

hfc   4 天前

多年 emui 的经历,表示没见过这种弹窗
qwwuyu
    12

qwwuyu   4 天前

@littlewing 我很快翻了下 QQ 和微信,没看到红包,但是也没想去点领取红包几个字,弹窗点了没效果,过几秒自己消失了.

@frantic 所有这方面我都是关着的,什么误触,健康使用手机,智慧助手,刚才也看了下,没有相关被打开的..

qwwuyu
    13

qwwuyu   4 天前

@hfc 我从荣耀 8 到今天也有了 4 年多了,*次见..
qwwuyu
    14

qwwuyu   4 天前

@imdong 看样子应该是了.
LuciferGo
    15

LuciferGo   4 天前

很大概率是 PDD 的,点击没反应可能是你手机禁止了相应的唤醒链路,导致没法被唤起
youbaoer
    16

youbaoer   4 天前

还是用 adb 把自带的浏览器,视频,音乐这些都删了吧
zhongjun96
    17

zhongjun96   4 天前

@chnyuwen #8 一堆推送,浏览器推送,视频推送,应用商店,钱包,会员中心,手机放一天,打开几十条推送,还关不掉,只能屏蔽通知。
LZSZ
    18

LZSZ   4 天前

好像这个系统有“红包助手”, 你看看是不是默认是打开的。
qwwuyu
    19

qwwuyu   4 天前

@LZSZ 设置和应用管理搜不到红包关键字,估计是伪基站的闪信导致的.
processzzp
    20

processzzp   3 天前 via iPhone

@qwwuyu 但是伪基站的短信应该要带一个链接让你点击才对呀,不然发一条纯文字过来有什么意义呢?
我觉得不像是闪信。
tydl
    21

tydl   3 天前

https://www.v2ex.com/t/496899#reply21
leibuting
    22

leibuting   3 天前

有点像前两年领支付宝红包的那个基站劫持
murmur
    23

murmur   3 天前

先盲卸载 pdd,反正这种软件也没什么留的价值
est
    24

est   3 天前

*对是拼多多的。没权限也能弹。反正骚得很。
Gary2133
    25

Gary2133   3 天前

大概率 PDD,微信打开后弹窗提示红包,直接不要脸了。
Cielsky
    26

Cielsky   3 天前

0 级短信吧,我从 emui 用到 miui 都没发现有什么软件不给悬浮窗权限就可以弹窗的
graceday
    27

graceday   3 天前

同 mate20 Pro 用户,从上市*天购买使用到现在,没碰到过这种问题。只是*近手机会偶尔卡顿一下。
zhangk
    28

zhangk   3 天前

在 MIUI 上见过 PDD 类似的弹窗(关闭 PDD 所有权限及通知后仍可复现),估计是和厂商合作或者使用了系统漏洞。
iVeego
    29

iVeego   3 天前

遇到过 PDD 类似的弹窗
dingwen07
    30

dingwen07   3 天前 via iPhone

这种弹窗需要悬浮窗权限的,先检查这个
但是我感觉这个更像是系统的弹窗,因为样式和 emui 的比较像,第三方 app 弹窗一般都是花里胡哨的不会那么干净也不会使用系统的弹窗样式,所以再看看是不是系统功能和闪信之类的
Zghebn
    31

Zghebn   3 天前

可能是拼多多,权限全关了还能弹出来,后来把自启动关了才消停。
%title插图%num
minami
    32

minami   3 天前   ❤️ 2

@chnyuwen #8 您来啦,华伪没有广告,那他们公司的“HUAWEI Ads”是来给用户做慈善的吗?
wbd31
    33

wbd31   3 天前

@minami 您来啦 您想表达的东西和帖子有关系吗
minami
    34

minami   3 天前   ❤️ 3

@wbd31 #32 歪楼是互联网传统,不爽不要玩。小明看到了不喜欢看的帖子,小明选择了屏蔽,小明很聪明,学学小明
ps:我向来尊重花粉花自己钱买华伪的自由,但我看不惯两件事,一件是捆绑爱国,另一件是无视事实和逻辑给华伪洗白
S179276SP
    35

S179276SP   3 天前

你看看给了哪些软件的浮窗权限,再根据应用启动记录的时间一个个排查,我用的就是 mate 20,从未遇到过这种情况。
S179276SP
    36

S179276SP   3 天前

@zhongjun96 你用的是华为么?我华为 app 除了智慧助手偶尔推送下天气,其他完全没有推送,安静的要命,浏览器直接用空白页即可,会员中心那个软件不是直接卸载完事?
shysth
    37

shysth   3 天前 via Android

推送 pdd,走的是华为自己的“推送服务”,没权限也可以
sexyyaoi
    38

sexyyaoi   3 天前

怎么这里都能看见各种喷,还有完没完,中文世界还不够糟糕吗?
yywudih
    39

yywudih   3 天前

同华为手机,也遇到过,频率大概一个月 1 次的样子?点开看了下,是跳转到 PDD 的。
nodin
    40

nodin   3 天前 via iPhone   ❤️ 4

这种莫名其妙的红包广告目前就拼多多或苏宁易购弹过。顺便歪个楼,说华为没广告的是真的恶心,智慧生活、主题、视频、服务、生活服务、会员中心、音乐、主题弹的广告被你们吃了?
thx2u
    41

thx2u   3 天前 via iPhone

@minami 32# 照您这说法,iOS 也有广告
设置—隐私—Apple 广告
谷歌就不用说了
imldy
    42

imldy   2 天前

看看 HW 快应用中心?
快应用中心恶心的很,所有快应用默认有推送权限,而且添加快应用不需要手动点同意。
imldy
    43

imldy   2 天前

发送`huawei`这俩汉字需要验证手机号。
xy2401
    44

xy2401   2 天前

华为的推送是挺多的。我明明天天在用他的 nfc 刷地铁。
还天天给我推送 您有一直地铁卡可以免费领取
BrettD
    45

BrettD   2 天前

@S179276SP 我手机上华为应用商城、天际通、华为钱包之类的自带 App 天天都在推送广告,有些 App 能关掉推送,有些 App 没有开关
fucku
    46

fucku   1 天前

@imldy #43 test hua wei
fucku
    47

fucku   1 天前

的确 华_为 发不出来啊
youbaoer
    48

youbaoer   14 小时 47 分钟前 via Android

@BrettD 你说这三个应用都可以关闭通知呀,我连角标都禁了。新版唯一烦的是高耗电应用提醒
BrettD
    49

BrettD   14 小时 9 分钟前 via iPhone

@youbaoer 我也记不得具体是什么 App 了,只记得当时是几个华为自带的 App 疯狂推送广告,然后 App 内和系统设置都没有关闭推送的开关,之后受不了了,换成 iOS 了(苦笑

Lineage OS 18.1 不支持小米 6?

前两天听说基于 Android 11 的 Lineage OS 18.1 出了,还在用 17.1 给 mi6 续命的我赶紧看了看,结果发现并没有适配 mi6,然而,18.1 居然适配了 mi5 和 mi5sp,这就说不过去了。

一代神机都不给适配?

26 条回复    2021-04-06 09:57:10 +08:00
wangkun025
    1

wangkun025   1 天前

仍旧支持一加 bacon,也很惊讶。
243205964
    2

243205964   1 天前 via Android

@wangkun025 这个厉害了,一加一坏了好久了,当时刷的是 cm
sky96111
    3

sky96111   1 天前 via Android   ❤️ 9

适配是维护者的事,和官方没关系。只要有人愿意维护,再老的手机也能支持到新系统
rebounce
    4

rebounce   1 天前

上周才给 mi6 刷了 17.1,pixel experience 也不支持 mi6 了。
mikeguan
    5

mikeguan   1 天前 via Android

dt 都有了,看着可以升,可能是第二批吧
marclop
    6

marclop   1 天前

应该会有的,可以关注一下 xda
ys0290
    7

ys0290   1 天前 via iPhone   ❤️ 1

想起了当初 miui 各种适配别家手机的日子
colinrat
    8

colinrat   1 天前 via Android

小米 9 se 也不支持
gesse
    9

gesse   1 天前

就一加而言,lineageos 相比氧 os 有什么优势?
gesse
    10

gesse   1 天前

不是抬杠,就是问下。
pista
    11

pista   1 天前 via Android   ❤️ 1

@gesse 彻底不用谷歌全家桶(谷歌全家桶用户发言
Lemeng
    12

Lemeng   1 天前

官方,+框架挺好的,第三方用不习惯
christin
    13

christin   1 天前 via iPhone

k30u 啥都没
ltm
    14

ltm   1 天前   ❤️ 1

开心?,Mi5 还有大神适配
LZSZ
    15

LZSZ   1 天前

crd,rros,havoc-os 都没有吗?这些比 los 好用多了。
oovveeaarr
    16

oovveeaarr   1 天前

可能是有 bug,临时下了
Cooky
    17

Cooky   1 天前 via Android

想用就刷 gsi 呗
msg7086
    18

msg7086   1 天前 via Android   ❤️ 1

没就没呗,都是义务工作的志愿者,晚几天适配就要催稿吗?
志愿者没人权。
uuv2e
    19

uuv2e   1 天前 via Android

xda 各种选择
flynaj
    20

flynaj   1 天前 via Android   ❤️ 1

看看这个老哥维护的小米 6,全部是 Android 11,也有你那个 Lineage OS 18.1 ,
https://sagit.cooluc.com
learningman
    21

learningman   20 小时 19 分钟前

大家都是写代码的,没一点我行我上的气势吗
HankAviator
    22

HankAviator   16 小时 55 分钟前 via Android

18.0 有,wifi 显示用不了,还是非官方版所以没上。维护者是 17.1 官方的
https://sourceforge.net/projects/ephedraceae/files/sagit/lineage-18.0/lineage-18.0-20201008-UNOFFICIAL-sagit.zip/download
JensenQian
    23

JensenQian   7 小时 49 分钟前 via Android

米 6 真的?
gvhao001
    24

gvhao001   2 小时 51 分钟前 via Android

@christin 哎,能说什么呢
mritd
    25

mritd   2 小时 27 分钟前 via iPhone

虽然好多年不用安卓了,但是你们为啥不考虑魔趣呢?
AoEiuV020
    26

AoEiuV020   1 小时 24 分钟前

@christin k30u 有个非官方的 lineageos,我试了下指纹和副卡用不了,

Android TextView行间距解析

TextView行间距设置
在布局XML中有两个参数可以对TextView的行间距进行设置。
分别为:android:lineSpacingExtra 和 android:lineSpacingMultiplier。
在代码中可以通过TextView的setLineSpacing()方法来设置。

android:lineSpacingExtra
android:lineSpacingExtra表示额外的行间距数值,单位通常为dp。如android:lineSpacingExtra=”1dp”。
android:lineSpacingExtra的值可以为负数,小数和0。如果值为正数表示增加行间距,如果值为负数表示减少行间距,如果值为0,则没有变化。

android:lineSpacingMultiplier
android:lineSpacingMultiplier表示行间距的倍数,没有单位。如android:lineSpacingMultiplier=”1.2”。
android:lineSpacingMultiplier的值可以为任意浮点数。如果值大于1.0表示增加行间距,如果值小于1.0表示减少行间距。

android:lineSpacingExtra和android:lineSpacingMultiplier一起使用
android:lineSpacingExtra和android:lineSpacingMultiplier可以在一起对同一个TextView进行设置,同时使用时会先增加android:lineSpacingMultiplier设置的倍数,再加上android:lineSpacingExtra设置的额外的间距。

setLineSpacing()
setLineSpacing()原型为public void setLineSpacing(float add, float mult);
参数add表示要增加的间距数值,对应android:lineSpacingExtra参数。
参数mult表示要增加的间距倍数,对应android:lineSpacingMultiplier参数。

不同行间距设置下的显示效果
设置不同的android:lineSpacingExtra显示效果如下。

正常行间距下显示效果
%title插图%num

%title插图%num

%title插图%num

%title插图%num

行间距设置影响分析
对正常行间距,android:lineSpacingExtra=”2dp”,和android:lineSpacingMultiplier=”2”设置下的实际行间距进行测量,得到如下数值
%title插图%num
可以看到在android:lineSpacingExtra=”2dp”设置下,实际行间距也增加了6px(测试手机上1dp=3px),但在android:lineSpacingMultiplier=”2”设置下,实际行间距并不是正常行间距的两倍。
进一步的,如果在测量时将文字高度也计算在内,得到如下数值:
正常行间距下,包含文字高度间距为52px
%title插图%num
通常意义下所说的行间距是指一行文字下方距离下一行文字上方的距离,行高是指一行文字上方距离下一行文字上方的距离。
通过对比可以看出,android:lineSpacingExtra和android:lineSpacingMultiplier的设置并不是直接影响行间距,而是通过行高来影响行间距。当设置android:lineSpacingExtra=”2dp”时,行高增加2dp,文字高度不变,于是行间距增加2dp。当设置android:lineSpacingMultiplier=”2”时,行高增加两倍,文字高度不变,行间距增加(”文字高度”+”文字正常行间距”)

获取TextView行高
TextView提供了getLineHeight()方法来获取TextView的行高。
对正常行间距,android:lineSpacingExtra=”2dp”和android:lineSpacingMultiplier=”2”设置下通过getLineHeight()方法获取的行高如下。
正常行间距:52px
android:lineSpacingExtra=”2dp”:58px
android:lineSpacingMultiplier=”2”:104px
和实际测量值相同。

TextView行高和间距的异常情况
TextView实际显示的每行高度并不总是和getLineHeight()方法获取到的行高相等(这也意味着每行的间距也并不总是等于getLineHeight()方法获取到的行高减去文字高度)。
TextView getLineHeight()方法的注释如下

/**
* @return the height of one standard line in pixels. **Note that markup
* within the text can cause individual lines to be taller or shorter
* than this height, and the layout may contain additional first-
* or last-line padding.**
*/

也就是说如果某行文字内有markup(不知道是什么),那么该行文字高度可能会大于,也可能会小于getLineHeight()方法返回的高度。此外对TextView的首行和*后一行有一个额外的padding间距,这导致实际行高要大于getLineHeight()方法得到的行高,实际间距也要大于通过getLineHeight()计算得到的间距。
对首行行高实际测量得到如下数值。
android:lineSpacingMultiplier=”1”时,“首行行高=普通行行高”
android:lineSpacingMultiplier=”2”时,“首行行高=普通行行高+6px”
android:lineSpacingMultiplier=”3”时,“首行行高=普通行行高+12px”
android:lineSpacingMultiplier=”4”时,“首行行高=普通行行高+18px”
也就是说“首行行高=普通行行高 + 6 ×(android:lineSpacingMultiplier – 1)”

TextView源码分析
要了解为何android:lineSpacingExtra和android:lineSpacingMultiplier设置影响的是行高而不是行间距,以及为何首行和*后一行的行高和普通行不相等,需要通过TextView源码来进行分析。
TextView 构造函数部分源码和setLineSpacing()源码如下

case com.android.internal.R.styleable.TextView_lineSpacingExtra:
mSpacingAdd = a.getDimensionPixelSize(attr, (int) mSpacingAdd);
break;
case com.android.internal.R.styleable.TextView_lineSpacingMultiplier:
mSpacingMult = a.getFloat(attr, mSpacingMult);
break;

public void setLineSpacing(float add, float mult) {
if (mSpacingAdd != add || mSpacingMult != mult) {
mSpacingAdd = add;
mSpacingMult = mult;

if (mLayout != null) {
nullLayouts();
requestLayout();
invalidate();
}
}
}

即android:lineSpacingExtra的设置保存在mSpacingAdd成员变量中,android:lineSpacingMultiplier的设置保存在mSpacingMult成员变量中。

TextView getLineHeight()源码如下

public int getLineHeight() {
return FastMath.round(mTextPaint.getFontMetricsInt(null) * mSpacingMult + mSpacingAdd);
}

可以看到TextView计算行高就是将正常高度乘以mSpacingMult再加上mSpacingAdd得到的。
跟踪mSpacingAdd和mSpacingMult成员变量,发现在makeSingleLayout()方法中调用new StaticLayout构造方法时使用了这两个变量。在StaticLayout类的构造方法中调用了generate()方法,在generate()方法中又调用了out()方法,在out()方法中可以看到如下代码

if (needMultiply && !lastLine) {
double ex = (below – above) * (spacingmult – 1) + spacingadd;
if (ex >= 0) {
extra = (int)(ex + EXTRA_ROUNDING);
} else {
extra = -(int)(-ex + EXTRA_ROUNDING);
}
} else {
extra = 0;
}

其中needMultiply值定义为,即设置了android:lineSpacingExtra和android:lineSpacingMultiplier中任意一个,needMultiply的值就为true。

boolean needMultiply = (spacingmult != 1 || spacingadd != 0);
1
那么只要设置了android:lineSpacingExtra和android:lineSpacingMultiplier中任意一个,就会计算一个extra的值,这个extra的值等于(below – above) * (spacingmult – 1) + spacingadd向上取整后的值。
在这之后有如下代码

lines[off + TOP] = v;

v += (below – above) + extra;

lines[off + mColumns + TOP] = v;

跟踪lines[]相关代码可以看到,lines[]是mLines的引用,而mLines中保存了每行文字的垂直位置信息,每个普通行文字有三个位置信息,分别对应mLines中的三个元素(mColumns = COLUMNS_NORMAL = 3, START = 0, TOP = 1, DESCENT = 2)。
因此lines[off + mColumns + TOP]表示的是下一行的TOP位置信息,将lines[off + mColumns + TOP] – lines[off + TOP]就可以得到下一行的TOP位置距离本行的TOP位置距离,也就是行高。显然lines[off + mColumns + TOP] – lines[off + TOP] = (below – above) + extra。如果忽略extra计算时的取整过程,则lines[off + mColumns + TOP] – lines[off + TOP] = (below – above) + extra = (below – above) + (below – above) * (spacingmult – 1) + spacingadd = (below – above) * spacingmult + spacingadd。这就解释了为何android:lineSpacingExtra和android:lineSpacingMultiplier设置影响的是行高而不是行间距。
在out()方法往前可以看到如下代码。

if (firstLine) {
if (trackPad) {
mTopPadding = top – above;
}

if (includePad) {
above = top;
}
}

跟踪includePad变量,可以看到是TextView的mIncludePad变量值,而TextView中mIncludePad固定设置为true,因此这里above = top;将执行,也就是说对首行文字,其above位置等于top位置,由此可以得出lines[off + mColumns + TOP] – lines[off + TOP] = (below – above) * spacingmult + spacingadd = (below – top) * spacingmult + spacingadd。也就是说首行文字的行高要比普通行高出(top – above) * spacingmult个像素。
注意到above = top的设定,首行文字在测量其行高时,其起始位置应当在文字top – above像素上方的空白位置。结合上文中首行行高的测量情况有如下数值。
android:lineSpacingMultiplier=”1”时,“首行行高=普通行行高+6px”
android:lineSpacingMultiplier=”2”时,“首行行高=普通行行高+12px”
android:lineSpacingMultiplier=”3”时,“首行行高=普通行行高+18px”
android:lineSpacingMultiplier=”4”时,“首行行高=普通行行高+24px”
也就是说“首行行高 – 普通行行高 = 6 ×(android:lineSpacingMultiplier)”这里的6显然就是top – above的数值。这和代码中得到的结论相同。

【Android】TextView设置段落间距

TextView只提供设置行距的方法,没有提供段落间距的方法,但是提供了一个 SpannableString 类来给TextView设置各种效果,
如图:

其中一个给文字替换为图片的效果给我带来了灵感,

我可以用一个图片(*后换成一个宽1px,指定高度的透明长方形,xml中画出来的)来模拟段落间距。

注意画出来的高度,不能使用 用尺子直接量的值,而要比这个高度要小。
为什么呢,我也不清楚,不过我还是要上个图,我估计应该是两行文字之间的line gap的原因。

后台给我们返回的json中段落区分符是“\n”,我们先把”\n”替换为”\n\r”

“\n”用来换行,“\r”就是那个将要被替换的字符了(为什么要用\r呢,阴差阳错啦,后来发现\r挺合适的,也不会重复);*后就是用SpannableString来处理文字了。

/**
* 设置TextView段落间距
*
* @param context 上下文
* @param tv 给谁设置段距,就传谁
* @param content 文字内容
* @param paragraphSpacing 请输入段落间距(单位dp)
* @param lineSpacingExtra xml中设置的的行距(单位dp)
*/
public static void setParagraphSpacing(Context context, TextView tv, String content, int paragraphSpacing, int lineSpacingExtra) {
if (!content.contains(“\n”)) {
tv.setText(content);
return;
}
content = content.replace(“\n”, “\n\r”);

int previousIndex = content.indexOf(“\n\r”);
//记录每个段落开始的index,*段没有,从第二段开始
List nextParagraphBeginIndexes = new ArrayList();
nextParagraphBeginIndexes.add(previousIndex);
while (previousIndex != -1) {
int nextIndex = content.indexOf(“\n\r”, previousIndex + 2);
previousIndex = nextIndex;
if (previousIndex != -1) {
nextParagraphBeginIndexes.add(previousIndex);
}
}
//获取行高(包含文字高度和行距)
float lineHeight = tv.getLineHeight();

//把\r替换成透明长方形(宽:1px,高:字高+段距)
SpannableString spanString = new SpannableString(content);
Drawable d = ContextCompat.getDrawable(context, R.drawable.paragraph_space);
float density = context.getResources().getDisplayMetrics().density;
//int强转部分为:行高 – 行距 + 段距
d.setBounds(0, 0, 1, (int) ((lineHeight – lineSpacingExtra * density) / 1.2 + (paragraphSpacing – lineSpacingExtra) * density));

for (int index : nextParagraphBeginIndexes) {
// \r在String中占一个index
spanString.setSpan(new ImageSpan(d), index + 1, index + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
tv.setText(spanString);
}

%title插图%num

那个透明的长方形很简单,随手一画就有了。

%title插图%num

下边这个就是替换后的效果,只不过这时候为了展示替换效果,那个长方形还是用了个orange色。

Android中如何修改系统时间

在 Android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到”Unable to open alarm driver: Permission denied “.这个函数需要root权限或者运行与系统进程中才可以用。

本来以为就没有办法在应用程序这一层改系统时间了,后来在网上搜了好久,知道这个目的还是可以达到的。

*个方法简单点,不过需要在Android系统源码的环境下用make来编译:

1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId=”android.uid.system”这个属性。

2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。

第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译:

1. 同上,加入android:sharedUserId=”android.uid.system”这个属性。

2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。

3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。

4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是”build/target/product/security”,下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在”build/tools/signapk”下,用法为”

signapk platform.x509.pem platform.pk8 input.apk output.apk”,文件名*好使用*对路径防止找不到,也可以修改源代码直接使用。

这样*后得到的apk和*个方法是一样的。

*后解释一下原理,首先加入android:sharedUserId=”android.uid.system”这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。

只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。*个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。

这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示”Package … has no signatures that match those in shared user android.uid.system”,这样也是保护了系统的安全。

**后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。

adb shell 进入shell终端界面

1、先设置系统的时区配置

cat /data/property/persist.sys.timezone //查看当前时区配置文件
setprop persist.sys.timezone GMT //修改属性
2、开始设置修改当前系统时间

date -s “yyyymmdd.[[[hh]mm]ss]” 或System/bin/date -s “yyyymmdd.[[[hh]mm]ss]”

3、查看是否生效

date

二、用代码实现修改Android系统时间的方法

public void testDate(){
try {
Process process = Runtime.getRuntime().exec(“su”);
String datetime=”20131023.112800″; //测试的设置的时间【时间格式 yyyyMMdd.HHmmss】
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes(“setprop persist.sys.timezone GMT\n”);
os.writeBytes(“/system/bin/date -s “+datetime+”\n”);
os.writeBytes(“clock -w\n”);
os.writeBytes(“exit\n”);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}

android默认系统日期、时间、时区更改

做android平台,经常会遇到产品需要更改系统默认时区日期时间的问题。android更改时区相对比较容易实现,网上也有很多资料,直接设置一个属性即可,例如设置上海东八区,persist.sys.timezone=Asia/Shanghai。但是如何实现更改默认系统时间呢?

在android中,Linux内核中、rtc时钟,默认的起始日期都是1970年1月1日,那么如何把默认日期指到2012-01-01呢?笔者在实践中发现,在RTC驱动中可以很容易实现。在RTC驱动加载的时候,一般都有个probe函数需要先执行,因此在probe函数里下手*直接有效。RTC从1970-01-01开始,那当然很容易把默认值设置到2012-01-01,所需要设置的seconds也就是从1970-01-01所差的秒数,以秒为单位。因此,一旦读出来的RTC值小于我们预想的值比如2012-01-01(1325402913)小,我们就把它设置到这个时间点。

[cpp] view plaincopy

1. seconds = rtc_read_time();

2. printk(“init PMU/RTC time to %ld \n”, seconds);

3.

4. if(seconds <= 1325402913) {

5. seconds = 1325402913;/*2012-01-01*/

6. ret = rtc_set_time(seconds);

7. RTC_DBG("Init Set time: %ld, ret =0x%x\n", seconds, ret);

8. }

笔者通过结果显示,在 android 平台上是可行的。要设置到哪天几点几分,只要算好具体 1970-01-01 00 : 00 差的秒数即可,简单明了。这样客户、用户使用起来更方便一些。

Android 通过应用设置系统日期和时间的方法

android 2.3

android 4.0

测试可行,不过需要ROOT权限.

import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;

import android.os.SystemClock;

public class SystemDateTime {

static final String TAG = "SystemDateTime";

public static void setDateTime(int year, int month, int day, int hour, int minute) throws IOException, InterruptedException {

requestPermission();

Calendar c = Calendar.getInstance();

c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month-1);
c.set(Calendar.DAY_OF_MONTH, day);
c.set(Calendar.HOUR_OF_DAY, hour);
c.set(Calendar.MINUTE, minute);

long when = c.getTimeInMillis();

if (when / 1000 1000)
throw new IOException(“failed to set Date.”);

}

public static void setDate(int year, int month, int day) throws IOException, InterruptedException {

requestPermission();

Calendar c = Calendar.getInstance();

c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);
long when = c.getTimeInMillis();

if (when / 1000 1000)
throw new IOException(“failed to set Date.”);
}

public static void setTime(int hour, int minute) throws IOException, InterruptedException {

requestPermission();

Calendar c = Calendar.getInstance();

c.set(Calendar.HOUR_OF_DAY, hour);
c.set(Calendar.MINUTE, minute);
long when = c.getTimeInMillis();

if (when / 1000 1000)
throw new IOException(“failed to set Time.”);
}

static void requestPermission() throws InterruptedException, IOException {
createSuProcess(“chmod 666 /dev/alarm”).waitFor();
}

static Process createSuProcess() throws IOException {
File rootUser = new File(“/system/xbin/ru”);
if(rootUser.exists()) {
return Runtime.getRuntime().exec(rootUser.getAbsolutePath());
} else {
return Runtime.getRuntime().exec(“su”);
}
}

static Process createSuProcess(String cmd) throws IOException {

DataOutputStream os = null;
Process process = createSuProcess();

try {
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(cmd + “\n”);
os.writeBytes(“exit $?\n”);
} finally {
if(os != null) {
try {
os.close();
} catch (IOException e) {
}
}
}

return process;
}
}

windowBackground的使用方法

windowBackground
使用Activity的windowBackground主题属性来为启动的Activity提供一个简单的drawable,
这样在启动的时候,会先展示一个界面,
这个界面就是Manifest中设置的Style,等Activity加载完毕后,
再去加载Activity的界面,而在Activity的界面中,我们将主题重新设置为正常的主题,
从而产生一种快的感觉。

 

来说一下这个东西的使用,首先要在你要在*个Activity,就是你进入app的*个actavity的AndroidManifest里设置:
 

这个AppThemeDrawable是在style里自己定义的一个style风格,里面给它设置了一张图片。
 %title插图%num



@color/colorPrimary
@color/colorPrimaryDark
@color/colorAccent

true
@mipmap/img_bb

@color/colorPrimary
@color/colorPrimaryDark
@color/colorAccent

 

然后在这个Activity里,加载布局的那个方法里,在R.layout.home1layout上面,加一句:

setTheme(R.style.AppTheme);

意思是重新设置为正常的style。AppTheme是系统默认的style。
 

Android中的colorPrimary、colorPrimaryDark、colorAccent

在Android开发中,我们可以自定义界面主题,通过控制属性的值,来改变界面的颜色,colorPrimary、colorPrimaryDark、colorAccent也是控制窗口颜色的属性,如下面这张图:
%title插图%num

1.colorPrimary 应用的主要色调,actionBar默认使用该颜色,Toolbar导航栏的底色

2.colorPrimaryDark 应用的主要暗色调,statusBarColor默认使用该颜色

3.statusBarColor 状态栏颜色,默认使用colorPrimaryDark

4.windowBackground 窗口背景颜色

5.navigationBarColor 底部栏颜色

6.colorForeground 应用的前景色,ListView的分割线,switch滑动区默认使用该颜色

7.colorBackground 应用的背景色,popMenu的背景默认使用该颜色

8.colorAccent CheckBox,RadioButton,SwitchCompat等一般控件的选中效果默认采用该颜色

9.colorControlNormal CheckBox,RadioButton,SwitchCompat等默认状态的颜色。

10.colorControlHighlight 控件按压时的色调

11.colorControlActivated 控件选中时的颜色,默认使用colorAccent

12.colorButtonNormal 默认按钮的背景颜色

13.editTextColor:默认EditView输入框字体的颜色。

14.textColor Button,textView的文字颜色

15.textColorPrimaryDisableOnly RadioButton checkbox等控件的文字

16.textColorPrimary 应用的主要文字颜色,actionBar的标题文字默认使用该颜色

17.colorSwitchThumbNormal: switch thumbs 默认状态的颜色. (switch off)
下面给出代码示例

1、在style.xml文件中,自定义主题MyAppTheme
%title插图%num

2、在AndroidManifest,xml使用该主题,给出文件的部分截图
%title插图%num

合并排序数组

合并排序数组

目录
1、问题描述
2、问题实例
3、代码实现
3、代码思考与拓展
1、问题描述
合并两个升序的整数数组A和B,形成一个新的数组,新数组也要有序。

2、问题实例
输入A=[1],B=[1], 输出[1,1],返回合并后的数组,输入A=[1,2,3,4], B=[2,3,4,5], 输出[1,2,2,3,4,4,5,6], 返回合并所有元素后的数组。

3、代码实现
书中代码:

class Solution():
# 参数A:有序整数数组A
# 参数B:有序整数数组B
# 返回:一个新的有序整数数组
def Sort1(self, A, B):
i, j = 0, 0
c = []
while i < len(A) and j < len(B):
if A[i] < B[j]:
c.append(A[i])
i += 1
else:
c.append(B[j])
j += 1
while i < len(A):
c.append(A[i])
i += 1
while j < len(B):
c.append(B[j])
j += 1
return c

if __name__ == ‘__main__’ :
A = [1, 4]
B = [1, 2, 4]
D = [1, 2, 3, 4]
E = [2, 4, 6, 8]
solution = Solution()
print(‘输入:’, A, B)
print(‘输出:’, solution.Sort1(A, B))
print(‘输入:’, D, E)
print(‘输出:’, solution.Sort1(D, E))

输出结果为:%title插图%num

书中代码解读:
题中A和B数组均为升序数组,书中采用多个while实现,*个while的意思是,如果A列表中的*个数比B列表中的*个数小,那么,将这个数添加到c列表中,接下来,用A列表的第二个数与B中的*个数做比较,如果B列表的*个数比A列表中的第二数小,那么将该数添加到c列表中,依次类推。第二个while和第三个while是用来处理A列表和B列表中相同数的。

3、代码思考与拓展
1、代码思考
书中代码的前提条件是A和B列表是升序列表,若A和B列表不是升序列表,则上述类不适用,可对列表A和B进行sort()处理,将A和B变为升序列表。举例如下:

A = [1, 6, 3, 4, 1, 9, 2]
B = A.copy()
B.sort()
print(A)
print(B)

输出为:%title插图%num

注意在排序之前,对A列表进行copy,防止后续处理对A列表带来的影响。
2、代码拓展
基于此,我提出一个新要求,给定一个并没按照升序排列的数字列表,记下此时的索引,要求该列表按照一定要求升序或者降序之后,还能和其之前未升序或降序前的索引对应。

比如:给定列表A=[2, 5, 4, 9, 1], 则数字2对应索引为0,数字5对应索引为1,对A进行升序排列得到列表B=[1, 2, 4, 5, 9], 此时我们仍能知道数字1对应的先前索引。
解决方法:利用pandas。

import pandas as pd

# 对于单个列表
A = [2, 5, 4, 9, 1]
C = {‘A’: A}
df = pd.DataFrame(C)
result = df.sort_values(by=’A’, axis=0, ascending=True)
print(result)

# 对于列表嵌套列表
a = [[8, 2, 5, 4], [10, 6, 9, 8]]
data = pd.DataFrame(a)
# print(data)
# print(data.T)
data1 = data.T
data1 = data1.sort_values(by=0, axis=0, ascending=True)
print(data1)

输出结果为:

%title插图%num

python创建Django项目

python创建Django项目

首先需要下载Django   下载方式见文章:    https://blog.csdn.net/knight31318/article/details/115422610

然后系统就会带有django-admin工具

用命令行方式进入希望存放Django项目的路径,比如D盘,执行以下命令:

django-admin startapp 项目名称 ,   比如    django-admin startapp djangoproject  即可。

%title插图%num

可以看到D盘下有了djangoproject文件夹。

 

注意:我们执行以上命令时,是在(django-venv)这个虚拟环境中执行的,所以在我们用开发工具打开项目之后,还需要同步修改开发工具的解释器,指向django-venv虚拟环境。

否则如果开发工具使用了默认python环境,会有问题,就像根本没有安装过django框架一样。

虚拟环境的创建方法见:   https://blog.csdn.net/knight31318/article/details/115449400

本地windows连接阿里云服务器

在购买阿里云服务器之后,可以进入管理服务器进行设置,要想通过windows登录到Ubuntu16.04阿里云服务器上需要进行一下步骤:

1. 从管理控制台进入本实例安全组。

%title插图%num

2. 点击配置规则。

%title插图%num

3. 点击添加安全组规则。

 

%title插图%num

4. 在弹出的框中分别按以下画红色线的部分的方式设置。

%title插图%num

至此可以通过申请的云服务器的公有ip进行访问了。

5. 下载XShell。在安装完之后的窗口中依次点击文件-新建回话-输入云服务器主机地址。

%title插图%num

6. 点击确定,在接下来弹出的对话框中输入用户名和密码,该用户名和密码是之前申请云服务器时填写的。

7. 连接成功后会弹出黑色的框框啦,貌似云服务上的Ubuntu是没有图形界面的。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速