Android webview 如何阻拦下载链接跳转

Android webview 如何阻拦下载链接跳转:

如下图,点击页面的下载按钮后跳转到了下个页面,下载触发点在 shouldOverrideUrlLoading 之后,

因此在无法 shouldOverrideUrlLoading 中阻拦。此种情况如何阻拦页面跳转?

%title插图%num

 

webview 使用 setDownloadListener 触发下载

1 条回复    2021-02-25 17:21:34 +08:00
还有个 shouldInterceptLoadRequest

让python类直接被调用

让python类直接被调用

之前在pytorch和keras中经常发现一个类model被直接调用,发现很有意思。于是就去看了看pytorch中nn.Module的源码,发现是定义了__call__(self)函数再去调用forward()函数。举个例子如下:

import math
class Pow(object):
def __init__(self,n=2):
self.n=n
super(Pow,self).__init__()
def forward(self,x):
return math.pow(x,self.n)
def __call__(self,x):
return self.forward(x)
l=Pow(2)
y=l(10)
print(y) #输出结果是100
l=Pow(3)
y=l(10)
print(y) #输出结果是1000

iphone手机上的抓包流程和原理概述

在ios应用开发过程中,为了进行端到端的分析,很多时候我们需要对手机的抓包进行分析。

对手机的抓包我们要在手机上安装抓包工具:tcpdump

前提:手机越狱;安装tcpdump    这样一部iphone就具备了抓包能力。

方法1:手机直接抓包(在手机上安装terminal用于输入命令)
不受网络条件制约,但由于是在终端上操作抓包,对ios设备来讲,MobileTerminal切至后台就不再工作,因此该抓包方法可行性较低,尽管如此,MobileTerminal对终端测试人员来说依然是一款很实用的工具;命令控推荐此方法。

方法2:通过pc/mac连接到手机(iPhoneTunnel软件,有mac和pc版本),通过在pc/mac下输入抓包命令,在手机上抓包。

pc下:用USB线缆连接终端与PC,确保手机终端正确,启动iPhoneTunnel,绿灯表示Tunnel Status正常,此时点击Launch Terminal按钮即可SSH进入终端,输入root密码,然后执行命令抓包

mac下:用USB线缆连接终端与mac,确保手机终端正确,启动iPhoneTunnel并开启后,点击tools->ssh(root) 菜单调出一个命令行界面,此时有可能报一个连接错误,输入ssh-keygen -R [127.0.0.1]:2222清除下里面的一个配置,即可正常连接。连接以后执行命令抓包,同pc。(tip:mac下终端输入密码时没有占位符,需要保证正确,注意)
WiFi下抓包tcpdump -i en0 -X -s0 -w data.pcap

2G/3G下抓包 tcpdump -i pdp_ip0 -X -s0 -w data.pcap 或 tcpdump -X -s0 -w data.pcap  (两个都可以试下,我一般用前者)
抓包结束命令:ctl+c
敲此命令抓包的默认路径在var->root文件夹内。
总结:两个方法本质一样,都是利用tcpdump在手机上抓包,方法二通过ssh连接到手机去执行抓包命令(此时iphone充当一个server角色,pc/mac作为client连接到该server进行远程控制),因为抓到的包一般需要在pc/mac下用wireshark进行分析,所以pc/mac基本是必须的,推荐方法2。

请教一下 libyuv 转换问题

请教一下 libyuv 转换问题

我在 Android 使用 imagereader 读出来的 argb8888 的数据,然后使用 libyuv 中的 argbtoi420 去转换成 yuv420p,存下来的数据怎么都不对,但是我把 argb8888 的数据存为 bitmap 再转换为 jpeg,打开就是正确的
第 1 条附言  ·  26 天前

搞定了,确实大小端的问题:
  •  2021-03-08 15:46:24 +08:00
1 no1xsyzy   28 天前 随便地搜索了一下,看到这个: //注意这儿有个坑,ARGBToI420 内存顺序是 BGRA //BGRAToI420 内存顺序是 ARGB 不知道是否有关
2 fengwei23   28 天前 @no1xsyzy #1 谢谢哈,我也看到这个了,我都试过了,好像还是不行,我在研究一下
3 darer   28 天前 只是说数据不对也判断不出是什么问题吧 还是再补充一些信息吧
4 AX5N   28 天前 你把 argb 映射到 srgb 了吗
5 fengwei23   28 天前 @darer #3 确实是这样的,但是我不是很好描述 “` Image image = reader.acquireLatestImage(); if (image != null) { Image.Plane[] planes = image.getPlanes(); Image.Plane plane = planes[0]; ByteBuffer buffer = plane.getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes, 0, bytes.length); if (mDataThread != null) { mDataThread.addData(bytes); } image.close(); } “` 上面是我从 image 中取出来的数据,然后把这个数据送给的 libyuv 去转换的,iamgereader 用的是 PixelFormat.RGBA_8888,libyuv 用的是 ABGRToI420
6 fengwei23   28 天前 @AX5N #4 没有也,需要这样做吗
7 AX5N   28 天前 @fengwei23 没在手机上开发过这些东西,但我觉得就是色域的问题。 理论上你应该声明 2 次,一次是转成 yuv 的时候,一次是转回 rgb 的时候。如果你不清楚你这个解码器的工作原理,那你*好直接转成 srgb 一劳永逸,缺点是会压缩色彩空间。如果你编码解码都是自己负责,那你可以自己捣鼓下相关参数。
8 qieqie   28 天前 这个代码意思是取 Y 平面然后清空,然后转换? 地铁老人看手机.jpg
9 qieqie   28 天前 看上去你这样只是拿到了一个灰度图
10 LouisLiu   28 天前 Android 读取的 argb8888 是大端对齐,而 c/c++对应的是 abgr,例如 libyuv::ABGRToI420
11 newmlp   27 天前 argb 顺序不对,用过 libyuv 的基本都踩过这个坑
12 elonmask   27 天前 改 renderscript 吧
13 rabbitknight   17 天前 imagereader 可以直接获取 YUV420_888 数据。然后拿 libyuv::Android420ToI420 转换。 rgb<->yuv 转换资源消耗太大了。     14 fengwei23   17 天前 @rabbitknight #13 我是用 Mediaprojection 来配合使用的,YUV420_888 这种格式使用的时候显示不支持。

Java to kotlin 原来那么简单的。

Java to kotlin 原来那么简单的。

*近做 RN 还要写写原生安卓和 IOS 。于是想把业务中的库拉出来整合一下。

发现社区出了 react-native-builder-bob 来做组件手脚架。

模版只有支持 kotlin + oc / kotlin + swift / C++

我自己业务都是用 java + oc 来写原生库的。唯有选择 kotlin + oc 。

看到 md 上说 java 代码直接复制到对应的 KT 文件去,AS 编辑器就会自动帮你转的了。

试了一下,果然可以。所有啰嗦的 java 语法都变成了简洁的 kotlin 。

%title插图%num

  •  2021-02-28 12:24:54 +08:00
1 KeyboardManAnAn   26 天前 这个确实是 Android Studio 的良心功能, 我*次用的时候确实是被惊艳到了. 相比较而言, Objective-C 转 Swift 就蛋疼太多了, 虽然也有收费应用能够实现自动转换代码的功能, 但是远不及 IDE 自带的转换功能体验来得好我觉得
2 zagfai   26 天前   1 Java 转 Kotlin 转完之后是 KotJava,改得了的代码,改不了的编程思维。
3 winterbells   26 天前 Ctrl + Alt + Shift + K
4 teok   26 天前 @zagfai 的确是这样。语法很好学,符合这语言设计哲学的编程思维需要很多时间去实践掌握
5 HangoX   26 天前 反过来没有,当你要粘贴到 java 的项目的时候有点*望。
6 DiDiz   26 天前 花一点时间去学 Kotlin 呗,又不难,一周就够了
7 Anarchy   26 天前 自动转还是可能出问题的,特别 Lambda,匿名内部类这块。
8 zhang2e   26 天前 自动转出的代码,其实还是用 Java 的思维写 Kotlin,Kotlin 的特性都没有用到,一堆警告,很不优雅。
9 hantsy   26 天前 @Anarchy 转 Lambda 的确问题太多。特别是在用一些 Stream 类似的 API 时。
10 wobuhuicode   26 天前 @DiDiz 这也有的杆……全篇有说我不会 kotlin 吗……说的是旧代码抽出来做库。
11 night98   26 天前 文件右键就能直接转了,IDEA 是这样的,不过通常会在一些代码例如 lambda 或是一些 spring 相关的代码上出现问题,不过我这边是后端,安卓这块可能有一定差异
12 sagaxu   26 天前 via Android 以前自动翻译的代码质量差,远不如人肉翻译,自动转化有时候还编译不过,现在改善了吗?
13 wobuhuicode   26 天前 via iPhone @night98 我这里需求有点不一样。rn 类库手脚架模版文件已经创建好了,只需要把以前的业务代码复制到指定位置就好了。所以没有直接转。
14 zerofancy   25 天前 @HangoX 反过来可以通过先查看字节码再反编译的方式,不过肯定还是要自己进行一些调整啥的 https://blog.mindorks.com/how-to-convert-a-kotlin-source-file-to-a-java-source-file
15 HangoX   25 天前 @zerofancy 我知道可以看字节码反编译,kt 插件集成了,但是那个代码基本是不能用的。

python 类的子类

python 类的子类

看下面的代码,请仔细阅读,并看看是否能够发现点什么问题呢?

#!/usr/bin/env python
#coding:utf-8

class Person:
def __init__(self, name, lang, email):
self.name = name
self.lang = lang
self.email = email

def author(self):
return self.name

class Programmer:
def __init__(self, name, lang, email, system, website):
self.name = name
self.lang = lang
self.email = email
self.system = system
self.website = website

def pythoner(self):
pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
return pythoner_list

if __name__==”__main__”:
writer = Person(“hiekay”,”Chinese”,”hiekay@gmail.com”)
python = Programmer(“hiekay”,”Python”,”hiekay@gmail.com”,”Ubutun”,”hiekay.github.io”)
print “My name is:%s”%writer.author()
print “I write program by:%s”%python.pythoner()[1]

上面这段代码,运行起来没有什么问题,但是,仔细看,发现有两个类,一个名字叫做Person,另外一个叫做Programmer,这还不是问题所在,问题所在是这两个类的构造函数中,存在这相同的地方:self.name=name,self.lang=lang,self.email=email,这对于追求代码质量的程序员,一般是不允许的。*好不要有重复代码或者冗余代码。可是,在两个类中都要有这些参数,应该怎么办呢?

子类、父类和继承
看下面的代码,里面有两个类A,B。这段程序能够正确运行,每个类的功能是仅仅打印指定的内容。

#!/usr/bin/env python
#coding:utf-8

class A:
def __init__(self):
print “aaa”

class B:
def __init__(self):
print “bbb”

if __name__==”__main__”:
a = A()
b = B()

#运行结果
aaa
上面的两个类彼此之间没有所谓的父子关系。现在稍加改变,将类B改写,注意观察与上面的差异。

#!/usr/bin/env python
#coding:utf-8

class A:
def __init__(self):
print “aaa”

class B(A): #这里和上面程序不同。B继承了A
def __init__(self):
print “bbb”

if __name__==”__main__”:
a = A()
b = B()

#运行结果
这段程序中,类B跟前面的那段有一点不同,class B(A):,这样写就表明了B相对A的关系:B是A的子类,B从A继承A的所有东西(子承父业)。

但是,运行结果一样。是的,那是以为在B中尽管继承了A,但是没有调用任何A的东西,就好比儿子从老爸那里继承了财富,但是儿子一个子也没动,外界看到的和没有继承一样。

#!/usr/bin/env python
#coding:utf-8

class A:
def __init__(self):
print “aaa”

class B(A):
def __init__(self):
#print “bbb”
A.__init__(self) #运行继承的父类

if __name__==”__main__”:
a = A()
b = B()

#运行结果

这回运行结果有了变化,本来b=B()是运行类B,但是B继承了A,并且在初始化的构造函数中,引入A的构造函数,所以,就运行A的结果相应结果了。

下面把*开头的那端程序用子类继承的方式重写,可以是这样的:

#!/usr/bin/env python
#coding:utf-8

class Person:
def __init__(self, name, lang, email):
self.name = name
self.lang = lang
self.email = email

def author(self):
return self.name
“””
class Programmer:
def __init__(self, name, lang, email, system, website):
self.name = name
self.lang = lang
self.email = email
self.system = system
self.website = website

def pythoner(self):
pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
return pythoner_list
“””

class Programmer(Person): #继承父类Person
def __init__(self, name, lang, email, system, website):
Person.__init__(self,name,lang,email) #将Person.__init__()的功能继承到这里
#self.name = name #这三句是Person中已经搞定的,就不用重复
#self.lang = lang #通过继承已经实现了这三句的功能
#self.email = email
self.system = system #子类中不同于Person父类部分
self.website = website

def pythoner(self):
pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
return pythoner_list

if __name__==”__main__”:
writer = Person(“hiekay”,”Chinese”,”hiekay@gmail.com”)
python = Programmer(“hiekay”,”Python”,”hiekay@gmail.com”,”Ubutun”,”hiekay.github.io”)
print “My name is:%s”%writer.author()
print “I write program by:%s”%python.pythoner()[1]
1
代码运行结果与前面一样。

需要提供注意的是,在子类中,如果要继承父类,必须用显明的方式将所继承的父类方法写出来,例如上面的Person.init(self,name,lang,email),必须这样写,才能算是在子类中进行了继承。如果不写上,是没有继承的。用编程江湖的黑话(比较文雅地称为“行话”)说就是“显式调用父类方法”。

对于为什么要用继承:

从技术上说,OOP里,继承*主要的用途是实现多态。对于多态而言,重要的是接口继承性,属性和行为是否存在继承性,这是不一定的。事实上,大量工程实践表明,重度的行为继承会导致系统过度复杂和臃肿, 反而会降低灵活性。因此现在比较提倡的是基于接口的轻度继承理念。这种模型里因为父类(接口类)完全没有代码,因此根本谈不上什么代码复用了。

在Python里,因为存在Duck Type,接口定义的重要性大大的降低,继承的作用也进一步的被削弱了。

另外,从逻辑上说,继承的目的也不是为了复用代码,而是为了理顺关系。

国外服务器和域名哪家强

小型网址,暂时不想搞域名备案了,后续在搞,先把服务搞起来

前期个人折腾着玩用,哪家性价比比较高呀

以及国外机器有没有能够国内速度的方式,香港 /日本机房?

求推荐性价比搞得虚拟机和域名服务商

之前搞过 digitalocean 和 linode 搭建播客

herozzm 1
herozzm 177 天前 via Android
服务器 vps 是 linode *强,域名选 nameslio 支持 whois 保护
foMM 2
foMM 177 天前
楼主的标题问的是强,强的话各种云都可以,亚马逊,Azure,谷歌云等。

帖子内容问的是性价比高,那么就 DigitalOcena,Linode 之类的不错。

如果追求*致省钱,可以弄个静态网页放 github page 上(完全免费)。或者花钱买个域名把博客放 netlify 上面(服务器免费)。
Rxianbei 3
Rxianbei 177 天前 via Android
域名的话我是去爸爸买的,服务器是枫叶主机。前者北美,后者香港。
h503mc 4
h503mc 177 天前 via iPhone
域名的话 namesilo
mm2x 5
mm2x 177 天前
域名 腾讯云 服务器 腾讯轻量香港
EvilCult 6
EvilCult 177 天前
google 域名??
据说没有溢价??不太确定,但我的那个破域名确实比在狗爹上便宜了那么一丢丢.
zeocax 7
zeocax 177 天前 via Android
@EvilCult Google Domain 大部分域名都会贵吧……
zeocax 8
zeocax 177 天前 via Android
https://tld-list.com/
域名价格的话可以用这个
Love4Taylor 9
Love4Taylor 177 天前 via Android
cloudflare registrar
EvilCult 10
EvilCult 177 天前
@zeocax
哈??是这样嘛???捂脸~~~
当初忘了在哪看的了……我又看了下,还真是贵嘿…..(是 google 涨价了还是狗爹降价了??)
忘了我当初为啥转走的了….慌乱!!

jiagm 177 天前 via Android
porkbun 主要后缀都是*便宜(或接近*便宜),支持绑定银联的中国区 PayPal 付款。
noqwerty 12
noqwerty 177 天前 via Android
买域名有很多选择,namecheap, nameslio 都不错,续费可以考虑转到 cloudflare,价格不变
ronman 13
ronman 177 天前 via Android
namesilo,便宜
不想折腾的话,静态博客直接 vercel 托管,还有香港,台湾服务器,国内访问挺快。
ipadpro4k 14
ipadpro4k 177 天前 via iPhone
namesilo 后台超难用,dns 生效超级慢
BenX 15
BenX 177 天前
namecheap
fengchang 16
fengchang 177 天前
域名我 N 年前做了一次比较,全都迁移到 namecheap 了。

VPS 对性能没要求的话,aws lightsail 有 $3.5 的 512MB RAM 实例,Linode 和 DO 都是 $5 起。
leishi1313 17
leishi1313 177 天前 via Android
便宜建站*近肯定是腾讯云轻量啊,24/月,CN2 线路国内三网都还行
davidyin 18
davidyin 177 天前
域名是 namesilo,然后转到 cloudflare 。
mason961125 19
mason961125 177 天前 via iPhone
@herozzm #1 Linode *强如认真的?
shiji 20
shiji 177 天前
@mason961125 曾经是。现在也没差到哪去。一线那几个 SSD VPS 排名基本都来回浮动。
steley 21
steley 177 天前
域名可以看一下这个网站
https://tldes.com/cheapest-domains
maxcho 22
maxcho 177 天前
域名 Namesilo, Google Domains 或者 Cloudflare Registrar 都不错,服务器考虑性价比的话可以看看 UpCloud
stranger75 23
stranger75 177 天前
阿里云香港轻量,1c1g 峰值带宽 30M 每月流量有 1TB,一个月才 24,不香嘛
XiLingHost 24
XiLingHost 176 天前
如果有用 cloudflare 的话,域名建议直接在 cloudflare 上注册,挺便宜的
服务器的话 aws 、gcp 、azure 这些大型云服务提供商的都挺好用的,sla 也都能支持企业级使用,如果是个人的话,阿里云和 vultr 、linode 、digitalocean 这些都是可以的
Westitan 25
Westitan 171 天前
试试搬瓦工 VPS 吧,主要是稳定,线路优秀
https://bwgbbs.com/stock.htm
idtaanlcoe 26
idtaanlcoe 164 天前 via Android
域名 namesilo 主机的话就多了去了
palmerkay316 27
palmerkay316 150 天前
托管或者租用香港或者日本的服务器,这个要看你需要什么配置的了
lyg 28
lyg 5 天前 via iPhone
https://git.io/fjFAw

golang中多种方式设置时区

go语言的time.Now()返回的是当地时区时间

time.Now().Format(“2006-01-02 15:04:05”)
1
time设置自定义时区

var cstSh, _ = time.LoadLocation(“Asia/Shanghai”) //上海
fmt.Println(“SH : “, time.Now().In(cstSh).Format(“2006-01-02 15:04:05”))
1
2
LoadLocation 有个问题,它依赖于 IANA Time Zone Database (简称 tzdata 吧) 这个数据库,一般linux系统都带了,但是windows系统就没带。所以如果windows系统没有安装go环境,调用LoadLocation就会报错。

当前解决方法也有:

1、我们可以自己把tzdata文件放到自己的程序目录中,然后让 time 包能够从我们自己的程序目录中加载时区文件就可以了。

文件目录可以通过环境变量设置,在main方法中:

os.Setenv(“ZONEINFO”, ‘/home/tz/data.zip’)
1
然后再调用 LoadLocation 方法就可以了。

下载tzdata

2、使用时区方式 推荐方式

var cstZone = time.FixedZone(“CST”, 8*3600) // 东八区
fmt.Println(“SH : “, time.Now().In(cstZone).Format(“2006-01-02 15:04:05”))
1
2
全局设置
如果说要设置全局的time时区配置应该如何做?

main.go(主函数处)增加一个初始化方法

func initInMain() {
var cstZone = time.FixedZone(“CST”, 8*3600) // 东八
time.Local = cstZone
}
1
2
3
4
将定义的时区实例赋值给time.Local

推荐阅读

Redis工具收费后新的开源已出现

GitHub上Star*高的工程师技能图谱

中国程序员*容易发错的单词

推荐!!! Markdown图标索引网站

 

颠覆认知的ios代码,真机实测!

记录一段神奇的代码。关键代码:
[self performSelector:@selector(recreateCommonWebView) withObject:nil afterDelay:0.1];
注释掉以后,日志执行顺序正常;否则,异步变同步。

(WKWebView *)dequeueCommonWebView
{
[self.commonSet addObject:self.preparedCommonWebView];

// 避免影响本次的加载。 5秒已经足够长了。

[self performSelector:@selector(recreateCommonWebView) withObject:nil afterDelay:0.1];

//@weakify_self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//@strongify_self;
NSLog(@“async setup!”);
//self.preparedCommonWebView = nil;
});

NSLog(@“sync logging!”);

return nil;

// NSLog(@“current count in common = %@”, @(self.commonSet.count));
//
// if (self.preparedCommonWebView == nil)
// {
// NSLog(@“error, prepared nil!”);
// }
//
// return self.preparedCommonWebView;
}

ios7 新特性:module研究

在苹果官网下载了名叫PrivacyPrompts的demo,结果在ios7系统真机上编译报错。

发现原因是因为使用了@import UIKit;这种语法引起的,该语法被称为module,具体可参考如下链接:

http://stackoverflow.com/questions/18947516/import-vs-import-ios-7
后来自建了demo测试只改动一行代码,把appdelegate中的

#import 改为@import UIKit;仍然报错,现在没有找到对应的解决办法,在网上也无资料可查。

结论:ios7中的module特性可能尚未成熟或者存在配置上的问题,目前真机无法使用。 也请知道该问题解决办法的朋友给我反馈,谢谢!