全部 文章 问答 分享 共找到39个相关内容
[问答] as如何找到系统通讯录的数据库?
网上说在/data/data/com.android.providers.contacts/databases/conct2.db 可是如图所示,是空的,请问该如何找到这个系统通讯录的数据库呢
2019-12-07 16:49 · android
[问答] 关于fragment与activity之间的通讯问题

看参考书说,fragment与Activity 之间通讯,只需要获取到对方的实例对象即可

问题来了,Activity中获取Fragment对象获取不到,我尝试了下面这两个方法

<
2021-06-19 17:12 · android / fragment / 通讯
[文章] 蓝牙版的手表与App通讯身份验证
蓝牙版的手表与App通讯身份验证我也不知道这篇文章算什么类型的,不是Android的,也不完全是Web的,更像是一种解决方案。涉及到App,涉及到Web后台,也涉及到手表端。
2022-08-11 17:21 · 加密 / 算法 / 通讯 / 协议 / 蓝牙
[文章] 内容提供者-获取手机通讯里的联系人
内容提供者-获取手机通讯里的联系人前面我们学习完了内容提供者的相关知识,现在呢,我们都以应用场景为基础去学习怎么通过内容提供者获取数据,实现场景功能。在上一篇文章中,我们完成了向日历里插入提醒事件。
[文章] 你真的懂IPC吗?
;不适合频繁或信息量大的通讯共享内存:无需复制,共享缓冲区直接附加到进程虚拟地址空间,速度快,但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决套接字:作为更通用的接口,传输效率低,主要用于不同机器或跨网络的通讯信号量
2020-01-27 10:30 · IPC / Android / 进程间通讯 / Linux
[文章] Android开发电话/短信拦截如何实现呢?
需求大概是这样子的,如果是联系人在通讯录里的,则可以拨打进来。如果来电号码不在通讯录里的,则要拦截。也就是白名单机制。思考拦截,什么地方拦截呢?凭借什么拦截呢?
[问答] 如何修改Android设备USB波特率
平板设备的Android版本为5.1,需要USB转485然后与单片机通讯,信号转换做好了,可是改不了波特率,可恶,到此为止了吗。CH34库函数无效果,还是19200
2020-03-06 15:45 · CH34 / USB / 波特率
[问答] 模块设计
现在有一个项目使用udp通讯收发数据包,界面架构如下fragment1到fragment6都可以收发数据。
2021-03-06 09:12 · android / handler
[问答] RecyclerView刷新时点击事件无效
现在在做一款蓝牙通讯的项目,需要一直扫描周边蓝牙设备。显示蓝牙设备使用的RecyclerView控件。
2021-01-06 14:05 · RecyclerView
[问答] 如何检测GPS串口通讯是否正常?
这个是用在工厂生产过程中检测检测电视盒子gps是否正常。请问有大佬会吗?哎!我太难了。
2019-11-26 12:15 · Android / GPS
[问答] Android串口
老哥们想问问串口通讯怎么判断是不是头节点阿?就比如我第一次发的包有头,但是第二个包的头被黏在第一个包的后面该咋办就比如这样的模拟数据
2021-01-17 17:48 · Android / 串口
[文章] 内容提供者-什么是内容提供者?
微信/QQ/支付宝获取通讯录里的联系人微信,QQ,支付宝这些应用,获取通讯录里的联系人,然后向你推荐好友,就是通过内容提供者获取到通讯录信息的。媒体库android的媒体库,也是一个内容提供者。
[文章] Android 串口通讯(很简单版)
前言其实这方面的文章以前就想写了,一直在草稿里吃灰,因为我觉得沙滩里可能就只有我在搞这些和硬件交互方面的,发了也没人看,直到今天我无意中看到我才意识到“老子青春又回来啦呸..”我又可以装**了好了,让我们废话少说上菜为什么要说(很简单版)呢?不为什么啊,就是字面意思很简单,谷歌提供了一个官方的串口工具也是简单的直接去官网下载就好了,但是单单的“简单”怎么能满足我们这些优秀的白嫖党呢,这里用的是我在其他的大佬那里嫖来的对串口工具的二次封装的.aar,贼好用,一分钟搞定串口收发。来!上链接https://code.aliyun.com/ys-mhy/sprialPortTest?spm=a2111a.8458726.0.0.6c6c35319wJPw7上面这个是阿里云的代码管理器,没有账号的可能要注册一下,项目名是sprialPortTest,为什么不用用GitHub呢,因为github太麻烦了,看见英文就头疼,总的来说我不够专业***接下来是怎么用很简单,导个包就可以首先把下载好的demon的lib下面的serialport-1.0.1.aar放到自己的lib里然后,都会啦,有包了,直接build.gradle导它dependencies{...implementationfiles('libs\\serialport-1.0.1.aar')//串口工具aar}还有android{...defaultConfig{...ndk{abiFilters"armeabi-v7a"//这个要加不然找不到so}}...}最后,直接看注释publicclassMainActivityextendsAppCompatActivity{//串口工具publicSerialPortUtilmSerialPortUtil=newSerialPortUtil(){privateStringBuffermSb;//串口数据接收@OverrideprotectedvoidonDataReceived(byte[]var1,intsize)throwsInterruptedException{//1、先确定自己设备用到的是哪个接口然后control+点这个SerialPortUtil进去//2、接受数据串口数据是一段一段的所以得全部接受然后自己判断结尾在哪再做数据处理mSb=newStringBuffer();//这里我用的是stringbuffer比较安全//数据接收for(inti=0;i<size;++i){mSb.append(HexUtil.Byte2Hex(var1[i]));}Log.d("TAG","onDataReceived:"+mSb);//判断数据的结尾这里我们这边的结尾设置cf是结尾所以判断msb的后两位是不是cfif("CF".equals(mSb.substring(mSb.length()-2))){//todo:数据操作//然后清除缓存接受下一包的数据mSb=newStringBuffer();}}};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//开启串口if(!mSerialPortUtil.isOpen()){try{mSerialPortUtil.open();}catch(IOExceptione){e.printStackTrace();}}//发送数据这里懒得写ui了看logif(mSerialPortUtil.isOpen()){mSerialPortUtil.sendHex("86AB0009010100CF");}}@OverrideprotectedvoidonDestroy(){super.onDestroy();if(mSerialPortUtil.isOpen()){//关闭串口mSerialPortUtil.close();}}}还有别忘了把SerialPortUtil工具类c过去这个也是官方串口工具里的,直接复制就好,改一下里面的波特率和串口接口,波特率在数据稳定的情况下越大越好。这里读写就搞定了,电脑可以下载个串口工具测试一下。
2021-11-12 15:27 · 串口通讯 / Android
[文章] 30、Android开发基础之服务Service
接下来,我们看一下,Activity跟服务之间是怎么通讯的。我们可以看到服务的生命周期有点不一样了!
2019-10-22 19:12 · 服务 / service / 四大组件 / 安卓开发 / android
[文章] 内容提供者-读取短信内容,读取短信验证码
内容提供者-读取短信内容我们已经实现向日历中插入提醒事件了内容提供者-向日历中插入提醒事件然后我们又从通讯录中获取到联系人数据内容提供者-获取手机通讯里的联系人接下来,当然连短信也不会放过啦!
[文章] 项目实战-领券联盟
而Presenter依赖UI的话则耦合度太高了,所以在Presenter与UI间通过接口通讯。则UI实现接口,Presenter调用接口方法,所以你还会看到这样的图:mvp就这么简单。
[文章] 基于Go写一个极简的通讯demo
说明该demo来源于B站教程视频【8小时转职Golang工程师(如果你想低成本学习Go语言)】https://www.bilibili.com/video/BV1gf4y1r79E/?p=52&share_source=copy_web&vd_source=727d145bfa2bc1ec2bdd67cf624091fc我跟随教程视频写的一个简单的demo,用于巩固基础其中根据自身习惯修改了部分代码源码仓库:https://github.com/hidewnd/imDemo.git其中可能包含一些错误逻辑和,欢迎指正window环境客户端构建:gobuild-oclient.exe.\client.go服务端构建:gobuild-gobuild-oserver.exe.\main.go.\server.go.\User.go定义服务端Server具体实现结构体typeServerstruct{//服务端的IP地址Ipstring//服务端的IP端口Portint//在线用户OnlineUserMapmap[string]*User//在线用户map的同步锁mapLocksync.RWMutex//消息广播channelMessagechanstring}创建Server接口funcNewServer(ipstring,portint)*Server{server:=&Server{Ip:ip,Port:port,OnlineUserMap:make(map[string]*User),Message:make(chanstring),}returnserver}监听用户上线//BroadCast服务端发送广播消息func(s*Server)BroadCast(user*User,msgstring){sendMsg:="["+user.Addr+"]"+user.Name+":"+msgs.Message<-sendMsg}//ListenMessage在线用户监听器func(s*Server)ListenMessage(){for{msg:=<-s.Messages.mapLock.Lock()for_,cli:=ranges.OnlineUserMap{cli.C<-msg}s.mapLock.Unlock()}}服务端对用户消息的处理器//Handlerhandler处理func(s*Server)Handler(connnet.Conn){fmt.Print("链接建立成功")//加入在线用户集user:=NewUser(conn,s)user.Online()fmt.Println("["+user.Addr+"]"+user.Name+":online...")isLive:=make(chanbool)//广播用户发送信息gofunc(){buf:=make([]byte,4096)for{n,err:=conn.Read(buf)ifn==0{user.Offline()fmt.Println("["+user.Addr+"]"+user.Name+":offline...")return}iferr!=nil&&err!=io.EOF{fmt.Println("connReaderr:",err)return}fmt.Println("["+user.Addr+"]"+user.Name+":"+string(buf))//提取用户信息去除'\n'msg:=string(buf[:n-1])user.DoMessage(msg)}}()//超时强制退出监听检测处理for{select{case<-isLive:case<-time.After(time.Second*60):user.DoMessage("Youhavebeenforcedoffline\n")fmt.Println("["+user.Addr+"]"+user.Name+":havebeenforcedoffline")close(user.C)err:=conn.Close()iferr!=nil{return}}}}服务端启动器func(s*Server)Start(){listener,err:=net.Listen("tcp",fmt.Sprintf("%s:%d",s.Ip,s.Port))iferr!=nil{fmt.Println("net.listenererr:",err)return}deferfunc(listenernet.Listener){err:=listener.Close()iferr!=nil{fmt.Println("net.listenererr:",err)}}(listener)//启动在线用户监听gos.ListenMessage()fmt.Println("startsuccess....")for{//acceptconn,err:=listener.Accept()iferr!=nil{fmt.Println("listenerAccepterr:",err)continue}//handlergos.Handler(conn)}}主函数启动packagemainfuncmain(){server:=NewServer("127.0.0.1",8888)server.Start()}完整代码server.gopackagemainimport("fmt""io""net""sync""time")typeServerstruct{IpstringPortint//在线用户OnlineUserMapmap[string]*UsermapLocksync.RWMutex//消息广播channelMessagechanstring}//NewServer创建Server接口funcNewServer(ipstring,portint)*Server{server:=&Server{Ip:ip,Port:port,OnlineUserMap:make(map[string]*User),Message:make(chanstring),}returnserver}func(s*Server)BroadCast(user*User,msgstring){sendMsg:="["+user.Addr+"]"+user.Name+":"+msgs.Message<-sendMsg}func(s*Server)ListenMessage(){for{msg:=<-s.Messages.mapLock.Lock()for_,cli:=ranges.OnlineUserMap{cli.C<-msg}s.mapLock.Unlock()}}//Handlerhandler处理func(s*Server)Handler(connnet.Conn){fmt.Print("链接建立成功")//加入在线用户集user:=NewUser(conn,s)user.Online()fmt.Println("["+user.Addr+"]"+user.Name+":online...")isLive:=make(chanbool)//广播用户发送信息gofunc(){buf:=make([]byte,4096)for{n,err:=conn.Read(buf)ifn==0{user.Offline()fmt.Println("["+user.Addr+"]"+user.Name+":offline...")return}iferr!=nil&&err!=io.EOF{fmt.Println("connReaderr:",err)return}fmt.Println("["+user.Addr+"]"+user.Name+":"+string(buf))//提取用户信息去除'\n'msg:=string(buf[:n-1])user.DoMessage(msg)}}()//超时强制退出监听检测处理for{select{case<-isLive:case<-time.After(time.Second*60):user.DoMessage("Youhavebeenforcedoffline\n")fmt.Println("["+user.Addr+"]"+user.Name+":havebeenforcedoffline")close(user.C)err:=conn.Close()iferr!=nil{return}}}}//Start启动服务器接口func(s*Server)Start(){listener,err:=net.Listen("tcp",fmt.Sprintf("%s:%d",s.Ip,s.Port))iferr!=nil{fmt.Println("net.listenererr:",err)return}deferfunc(listenernet.Listener){err:=listener.Close()iferr!=nil{fmt.Println("net.listenererr:",err)}}(listener)//启动在线用户监听gos.ListenMessage()fmt.Println("startsuccess....")for{//acceptconn,err:=listener.Accept()iferr!=nil{fmt.Println("listenerAccepterr:",err)continue}//handlergos.Handler(conn)}}User具体实现用户结构体typeUserstruct{//用户名Namestring//用户IP地址Addrstring//chanCchanstring//链接connnet.Conn//所属的服务server*Server}创建一个UserfuncNewUser(cnet.Conn,server*Server)*User{userAddr:=c.RemoteAddr().String()user:=&User{Name:userAddr,Addr:userAddr,C:make(chanstring),conn:c,server:server,}gouser.ListenMessage()returnuser}监听用户状态func(u*User)ListenMessage(){for{msg:=<-u.C_,err:=u.conn.Write([]byte(msg+"\n"))iferr!=nil{fmt.Println("writeerr:",err)return}}}//SendMsg给客户端发送消息func(u*User)SendMsg(msgstring){_,err:=u.conn.Write([]byte(msg))iferr!=nil{fmt.Println("sendMsgerr:",err)}}具体实现用户的上下线//Online广播用户上线通知func(u*User)Online(){u.server.mapLock.Lock()u.server.OnlineUserMap[u.Name]=uu.server.mapLock.Unlock()u.server.BroadCast(u,"online...")}//Offline广播用户下线通知func(u*User)Offline(){u.server.mapLock.Lock()delete(u.server.OnlineUserMap,u.Name)u.server.mapLock.Unlock()u.server.BroadCast(u,"offline...")}解析用户的消息func(u*User)DoMessage(messagestring){iflen(message)>0{msg:=strings.Split(message,"|")iflen(msg)>1{switchmsg[0]{case"rename":newName:=msg[1]_,ok:=u.server.OnlineUserMap[newName]ifok{u.SendMsg("thisnameisalreadyused\n")return}u.server.mapLock.Lock()u.server.OnlineUserMap[newName]=udelete(u.server.OnlineUserMap,u.Name)u.server.mapLock.Unlock()u.Name=newNameu.SendMsg("updatenewNamesuccess\n")breakcase"to"://to|用户名|消息iflen(msg)<3{u.server.BroadCast(u,"Commandformaterror\n")return}remoteUer,ok:=u.server.OnlineUserMap[msg[1]]if!ok{u.server.BroadCast(u,msg[1]+"notfound\n")return}remoteUer.SendMsg(msg[2])}}else{switchmessage{case"who":u.server.mapLock.Lock()for_,user:=rangeu.server.OnlineUserMap{onlineMsg:="["+user.Addr+"]"+user.Name+":online\n"u.SendMsg(onlineMsg)}u.server.mapLock.Unlock()breakdefault:u.server.BroadCast(u,message)}}}}完整代码packagemainimport("fmt""net""strings")typeUserstruct{NamestringAddrstringCchanstringconnnet.Connserver*Server}funcNewUser(cnet.Conn,server*Server)*User{userAddr:=c.RemoteAddr().String()user:=&User{Name:userAddr,Addr:userAddr,C:make(chanstring),conn:c,server:server,}gouser.ListenMessage()returnuser}//Online广播用户上线通知func(u*User)Online(){u.server.mapLock.Lock()u.server.OnlineUserMap[u.Name]=uu.server.mapLock.Unlock()u.server.BroadCast(u,"online...")}//Offline广播用户下线通知func(u*User)Offline(){u.server.mapLock.Lock()delete(u.server.OnlineUserMap,u.Name)u.server.mapLock.Unlock()u.server.BroadCast(u,"offline...")}func(u*User)DoMessage(messagestring){iflen(message)>0{msg:=strings.Split(message,"|")iflen(msg)>1{switchmsg[0]{case"rename":newName:=msg[1]_,ok:=u.server.OnlineUserMap[newName]ifok{u.SendMsg("thisnameisalreadyused\n")return}u.server.mapLock.Lock()u.server.OnlineUserMap[newName]=udelete(u.server.OnlineUserMap,u.Name)u.server.mapLock.Unlock()u.Name=newNameu.SendMsg("updatenewNamesuccess\n")breakcase"to"://to|用户名|消息iflen(msg)<3{u.server.BroadCast(u,"Commandformaterror\n")return}remoteUer,ok:=u.server.OnlineUserMap[msg[1]]if!ok{u.server.BroadCast(u,msg[1]+"notfound\n")return}remoteUer.SendMsg(msg[2])}}else{switchmessage{case"who":u.server.mapLock.Lock()for_,user:=rangeu.server.OnlineUserMap{onlineMsg:="["+user.Addr+"]"+user.Name+":online\n"u.SendMsg(onlineMsg)}u.server.mapLock.Unlock()breakdefault:u.server.BroadCast(u,message)}}}}func(u*User)ListenMessage(){for{msg:=<-u.C_,err:=u.conn.Write([]byte(msg+"\n"))iferr!=nil{fmt.Println("writeerr:",err)return}}}//SendMsg给客户端发送消息func(u*User)SendMsg(msgstring){_,err:=u.conn.Write([]byte(msg))iferr!=nil{fmt.Println("sendMsgerr:",err)}}定义客户端初始化客户端客户端结构体typeClientstruct{//服务端ipServerIpstring//服务端端口ServerPortint//客户端名Namestring//客户端管道connnet.Conn//客户端模式flagint}//NewClient创建一个监听funcNewClient(serverIpstring,serverPortint)*Client{client:=&Client{ServerIp:serverIp,ServerPort:serverPort,flag:999,}//建立tcp长链接conn,err:=net.Dial("tcp",fmt.Sprintf("%s:%d",client.ServerIp,client.ServerPort))iferr!=nil{fmt.Println("dialerr:",err)returnnil}client.conn=connreturnclient}通过参数命令来定义并启动客户端funcinit(){//初始化配置,通过-ip设置IP地址flag.StringVar(&serverIp,"i","127.0.0.1","设置服务器的IP地址(默认127.0.0.1)")//初始化配置,通过-p设置IP端口flag.IntVar(&serverPort,"p",8888,"设置服务器的端口(默认8888)")}//DealResponse监听服务端返回的消息func(client*Client)DealResponse(){_,err:=io.Copy(os.Stdout,client.conn)iferr!=nil{return}}//具体业务的实现func(client*Client)Run(){}funcmain(){//命令行解析flag.Parse()client:=NewClient(serverIp,serverPort)ifclient==nil{fmt.Println(">>>链接服务器失败")return}goclient.DealResponse()fmt.Println(">>>链接服务器成功")client.Run()}客户端封装功能封装修改用户名//包装更新用户名请求func(client*Client)updateUserName()bool{fmt.Println(">>>请输入用户名")_,err:=fmt.Scanln(&client.Name)iferr!=nil{returnfalse}sendMsg:="rename|"+client.Name+"\n"_,err=client.conn.Write([]byte(sendMsg))iferr!=nil{fmt.Println(">>>connwriteerr:",err)returnfalse}returntrue}封装查询在线用户func(client*Client)listUser()bool{sendMsg:="who\n"_,err:=client.conn.Write([]byte(sendMsg))iferr!=nil{fmt.Println(">>>connwriteerr:",err)returnfalse}returntrue}封装广播聊天//PublicChat公聊模式func(client*Client)publicChat(){varchatMsgstringfmt.Println(">>>请输入发送内容,输入exit退出")_,err:=fmt.Scanln(&chatMsg)iferr!=nil{return}forchatMsg!="exit"{iflen(chatMsg)!=0{sendMsg:=chatMsg+"\n"_,err:=client.conn.Write([]byte(sendMsg))iferr!=nil{fmt.Println(">>>connwriteerr:",err)break}}//继续监听下一个发送信息,直到exitchatMsg=""fmt.Println(">>>请输入发送内容,输入exit退出")_,err:=fmt.Scanln(&chatMsg)iferr!=nil{return}}}封装私聊//PrivateChat私聊模式func(client*Client)privateChat(){varremote,chatMsgstringclient.listUser()forremote!="exit"{fmt.Println(">>>请输入发送对象,输入exit退出")_,err:=fmt.Scanln(&remote)iferr!=nil{return}forchatMsg!="exit"{iflen(chatMsg)!=0{//发送消息到服务端sendMsg:="to|"+remote+"|"+chatMsg+"\n"_,err:=client.conn.Write([]byte(sendMsg))iferr!=nil{fmt.Println(">>>connwriteerr:",err)break}}//继续监听下一个发送信息,直到exitchatMsg=""fmt.Println(">>>请输入发送内容,输入exit退出")_,err:=fmt.Scanln(&chatMsg)iferr!=nil{return}}//内循环退出,继续监听输入内容选择用户,知道exitremote=""fmt.Println(">>>请输入发送对象,输入exit退出")_,err=fmt.Scanln(&remote)iferr!=nil{return}}}封装客户端菜单命令//Menu命令菜单func(client*Client)Menu()bool{varcodeintfmt.Println("1:公聊模式")fmt.Println("2:私聊模式")fmt.Println("3:更新用户名")fmt.Println("0:退出")_,err:=fmt.Scanln(&code)iferr!=nil{returnfalse}ifcode>=0&&code<=3{client.flag=codereturntrue}returnfalse}调整业务函数func(client*Client)Run(){forclient.flag!=0{//过滤非法的菜单codefor!client.Menu(){}//根据菜单code进行功能调度switchclient.flag{case1:client.publicChat()breakcase2:client.privateChat()breakcase3:client.updateUserName()break}}}完整代码packagemainimport("flag""fmt""io""net""os")varserverIpstringvarserverPortinttypeClientstruct{ServerIpstringServerPortintNamestringconnnet.Connflagint}//NewClient创建一个监听funcNewClient(serverIpstring,serverPortint)*Client{client:=&Client{ServerIp:serverIp,ServerPort:serverPort,flag:999,}//建立tcp长链接conn,err:=net.Dial("tcp",fmt.Sprintf("%s:%d",client.ServerIp,client.ServerPort))iferr!=nil{fmt.Println("dialerr:",err)returnnil}client.conn=connreturnclient}//Menu命令菜单func(client*Client)Menu()bool{varcodeintfmt.Println("1:公聊模式")fmt.Println("2:私聊模式")fmt.Println("3:更新用户名")fmt.Println("0:退出")_,err:=fmt.Scanln(&code)iferr!=nil{returnfalse}ifcode>=0&&code<=3{client.flag=codereturntrue}returnfalse}//包装更新用户名请求func(client*Client)updateUserName()bool{fmt.Println(">>>请输入用户名")_,err:=fmt.Scanln(&client.Name)iferr!=nil{returnfalse}sendMsg:="rename|"+client.Name+"\n"_,err=client.conn.Write([]byte(sendMsg))iferr!=nil{fmt.Println(">>>connwriteerr:",err)returnfalse}returntrue}//查询用户信息func(client*Client)listUser()bool{sendMsg:="who\n"_,err:=client.conn.Write([]byte(sendMsg))iferr!=nil{fmt.Println(">>>connwriteerr:",err)returnfalse}returntrue}//PrivateChat私聊模式func(client*Client)privateChat(){varremote,chatMsgstringclient.listUser()forremote!="exit"{fmt.Println(">>>请输入发送对象,输入exit退出")_,err:=fmt.Scanln(&remote)iferr!=nil{return}forchatMsg!="exit"{iflen(chatMsg)!=0{//发送消息到服务端sendMsg:="to|"+remote+"|"+chatMsg+"\n"_,err:=client.conn.Write([]byte(sendMsg))iferr!=nil{fmt.Println(">>>connwriteerr:",err)break}}//继续监听下一个发送信息,直到exitchatMsg=""fmt.Println(">>>请输入发送内容,输入exit退出")_,err:=fmt.Scanln(&chatMsg)iferr!=nil{return}}//内循环退出,继续监听输入内容选择用户,知道exitremote=""fmt.Println(">>>请输入发送对象,输入exit退出")_,err=fmt.Scanln(&remote)iferr!=nil{return}}}//PublicChat公聊模式func(client*Client)publicChat(){varchatMsgstringfmt.Println(">>>请输入发送内容,输入exit退出")_,err:=fmt.Scanln(&chatMsg)iferr!=nil{return}forchatMsg!="exit"{iflen(chatMsg)!=0{sendMsg:=chatMsg+"\n"_,err:=client.conn.Write([]byte(sendMsg))iferr!=nil{fmt.Println(">>>connwriteerr:",err)break}}//继续监听下一个发送信息,直到exitchatMsg=""fmt.Println(">>>请输入发送内容,输入exit退出")_,err:=fmt.Scanln(&chatMsg)iferr!=nil{return}}}func(client*Client)Run(){forclient.flag!=0{//过滤非法的菜单codefor!client.Menu(){}//根据菜单code进行功能调度switchclient.flag{case1:client.publicChat()breakcase2:client.privateChat()breakcase3:client.updateUserName()break}}}funcinit(){//初始化配置,通过-ip设置IP地址flag.StringVar(&serverIp,"i","127.0.0.1","设置服务器的IP地址(默认127.0.0.1)")//初始化配置,通过-p设置IP端口flag.IntVar(&serverPort,"p",8888,"设置服务器的端口(默认8888)")}func(client*Client)DealResponse(){_,err:=io.Copy(os.Stdout,client.conn)iferr!=nil{return}}funcmain(){//命令行解析flag.Parse()client:=NewClient(serverIp,serverPort)ifclient==nil{fmt.Println(">>>链接服务器失败")return}goclient.DealResponse()fmt.Println(">>>链接服务器成功")client.Run()}
2023-04-16 19:45 · go / im
[文章] Android开发根据号码phoneNumber查询联系人
我的需求是白名单机制,如果是在通讯录里的,那么就不拦截电话,如果不在,那么就拦截电话。如果你要知道其他字段怎么办呢?可以看常量,但是版本可能对不上你的数据库。最安全的办法是遍历出来看看。
2021-01-19 11:19 · Android / 数据库 / 联系人 / 电话 / phoneNumber
[文章] Android中各种组件的生命周期
startService可以长期于后台运行,但是不方便通讯,bindService方便通讯,但是不能长期于后台运行。所以呢,就混合使用就好。
2019-10-21 10:33 · android / 组件 / 生命周期
[文章] Android——USB转COM口(CH340)与传感器进行通讯
本人使用环境CH340转接头Android5.1,RK3188Android6.0,RK3288关于CH34官方的jar包与使用存在的问题(官方地址)最大的问题是无法修改串口波特率,一直以19200运行,但我的传感器为9600,理论上应该可以修改,可是就连官方的APK都无法修改,我只好另寻他发最终解决方案使用GitHub:https://github.com/mik3y/usb-serial-for-android初始化在你的build.gradle(project)中添加allprojects{repositories{...maven{url'https://jitpack.io'}}}添加依赖dependencies{implementation'com.github.mik3y:usb-serial-for-android:2.2.2'}添加权限<uses-featureandroid:name="android.hardware.usb.host"/>在res/xml/下添加device_filter.xml,CH340官网的工程Demo内也有。并要在AndroidManifest中补全代码<resource><usb-deviceproduct-id="29987"vendor-id="6790"/><usb-deviceproduct-id="21795"vendor-id="6790"/><usb-deviceproduct-id="21778"vendor-id="6790"/></resource><activityandroid:name="..."...><intent-filter><actionandroid:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/></intent-filter><meta-dataandroid:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"android:resource="@xml/device_filter"/></activity>使用创建单独的温度传感器类classTemperMoudle{privatefinalstaticStringTAG="MainActivity";privatestaticfinalintTEMPERATURE_USB_VENDOR_ID=6790;//供应商idprivatestaticfinalintTEMPERATURE_USB_PRODUCT_ID=29987;//产品idprivateContextcontext;privateList<UsbSerialDriver>usbSerialDrivers=null;privateList<UsbSerialPort>usbSerialPorts=newArrayList<>();privateUsbSerialPorttemperatureUsbPort=null;privateSerialInputOutputManagerserialIoManager;privateSerialInputOutputManager.ListenerserialListener;privateExecutorServiceexecutor=Executors.newSingleThreadExecutor();TemperMoudle(Contextcontext){this.context=context;}/***初始化,获取目标端口*/UsbSerialPortinit(SerialInputOutputManager.Listenerlistener){this.serialListener=listener;//获取全部设备UsbManagerusbManager=(UsbManager)context.getSystemService(Context.USB_SERVICE);if(usbManager!=null){usbSerialDrivers=UsbSerialProber.getDefaultProber().findAllDrivers(usbManager);}//获取全部端口if(usbSerialDrivers!=null){for(UsbSerialDriverdriver:usbSerialDrivers){usbSerialPorts.addAll(driver.getPorts());}}//校验端口设备,获得目标端口for(UsbSerialPortport:usbSerialPorts){UsbDevicedevice=port.getDriver().getDevice();if(device.getVendorId()==TEMPERATURE_USB_VENDOR_ID&&device.getProductId()==TEMPERATURE_USB_PRODUCT_ID){UsbDeviceConnectionconnection=usbManager.openDevice(device);try{temperatureUsbPort=port;temperatureUsbPort.open(connection);temperatureUsbPort.setParameters(9600,8,UsbSerialPort.STOPBITS_1,UsbSerialPort.PARITY_NONE);//我这里需要开启RTS,否则无法读取数据,但务必记得在temperatureUsbPort.close之前置位false,否则再次启动程序无法读取端口!temperatureUsbPort.setRTS(true);}catch(IOExceptione){Log.e(TAG,"打开端口失败");try{temperatureUsbPort.setRTS(false);temperatureUsbPort.close();}catch(IOExceptione2){e.printStackTrace();}}}}returntemperatureUsbPort;}/***设置数据监听器**@paramlistener监听器*/voidsetSerialListener(SerialInputOutputManager.Listenerlistener){this.serialListener=listener;}privatevoidstartIoManager(){if(temperatureUsbPort!=null){serialIoManager=newSerialInputOutputManager(temperatureUsbPort,serialListener);executor.submit(serialIoManager);}}privatevoidstopIoManager(){if(serialIoManager!=null){serialIoManager.stop();serialIoManager=null;}}/***重新开启USB管理器*/voidonDeviceStateChange(){stopIoManager();startIoManager();}voidonPause(){stopIoManager();if(temperatureUsbPort!=null){try{temperatureUsbPort.setRTS(false);temperatureUsbPort.close();temperatureUsbPort=null;}catch(IOExceptione){e.printStackTrace();}}}}主函数使用TemperMoudletemperMoudle;UsbSerialPorttemperUsbPort;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取温度传感器数据端口temperMoudle=newTemperMoudle(this);temperUsbPort=temperMoudle.init(temperListener);//发送查询温度的指令if(temperUsbPort!=null){try{temperUsbPort.write(Str16ToBytes("010300000001840A",""),200);}catch(IOExceptione){e.printStackTrace();}}}/***监听USB端口数据*/SerialInputOutputManager.ListenertemperListener=newSerialInputOutputManager.Listener(){@OverridepublicvoidonNewData(byte[]data){String[]dataStrings=BytesToStrs16(data);for(StringdataString:dataStrings){Log.d(TAG,"dataString:"+dataString);}}@OverridepublicvoidonRunError(Exceptione){e.printStackTrace();}};/***用于检测usb插入状态的BroadcasReceiver*/privatefinalBroadcastReceiverusbReceiver=newBroadcastReceiver(){publicvoidonReceive(Contextcontext,Intentintent){if(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())){Log.e(TAG,"设备移除");temperMoudle.onPause();finish();}}};@OverrideprotectedvoidonResume(){super.onResume();IntentFilterusbFilter=newIntentFilter();usbFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);registerReceiver(usbReceiver,usbFilter);temperMoudle.onDeviceStateChange();}@OverrideprotectedvoidonPause(){super.onPause();temperMoudle.onPause();unregisterReceiver(usbReceiver);}/***16进制字符串转byte数组**@paramstr需要转换的字符串*@paramsplitChare中断间隔符*@return转换好的byte[]数组*/publicbyte[]Str16ToBytes(Stringstr,StringsplitChare){String[]string=str.trim().split(splitChare);byte[]bytes=newbyte[string.length];for(inti=0;i<string.length;i++){bytes[i]=(byte)(Integer.parseInt(string[i],16)&0xff);}returnbytes;}/***十进制bytes转16进制strings**@parambytes十进制bytes*@return16进制strings*/publicString[]BytesToStrs16(byte[]bytes){String[]strs=newString[bytes.length];for(inti=0;i<bytes.length;i++){strs[i]=Integer.toHexString(bytes[i]&0xff);}returnstrs;}
2020-03-16 15:54 · CH34 / Android / USB / 串口 / 体温
[文章] CentOS系统信息查看与防火墙操作
firewall-cmd--zone=public--add-port=8080/tcp--permanent#命令含义:#  –zone#作用域#  –add-port=9200/tcp#添加端口,格式为:端口/通讯协议
2021-02-23 15:43 · Linux / CentOS / 运维
[文章] 【领券联盟】笔记:视频42,43,44,45-NestedScrollView嵌套RecyclerView
NestedScrollView嵌套RecyclerView的问题【领券联盟】43-动态设置嵌套RecyclerView的高度【领券联盟】44-梳理NestedScrollView嵌套RecyclerView的滑动通讯
2020-04-02 00:05 · 课堂笔记
[文章] 水一篇文章,AOSP的,按键控制拍照
这里就涉及到一个通讯的问题了,我们可以用广播,用AIDL,可以用内容提供者,也可以用属性值。这里面我使用属性值比较方便。但是,属性值的写入,有权限限制,因此我不在应用层的调用去修改状态。
2022-10-11 11:29 · 拍照 / 按键 / power / 安卓 / AOSP
[文章] AOSP-Android系统源码目录结构
Linux内核Android系统是基于Linux内核编写的,在此基础上,google的工程师还添加了其他的内容,比如说Binder实现IPC通讯,系统的安全、内存管理等。
[问答] 在跟着 Android开发领券联盟项目实战课程 进行编写时遇到网络通讯失败
Manifest文件中的网络权限给了还是出现这样的问题 D/HomePresenterImpl:resultcodeis--->404 I/HomePresenterImpl:请求失败...publicclassHomeFragmentextendsBaseFragmentimplementsIHomeCallback{privateIHomePresentermHomePresenter;@OverrideprotectedintgetRootViewResId(){returnR.layout.fragment_home;}@OverrideprotectedvoidinitPresenter(){//创建presentermHomePresenter=newHomePresenterImpl();mHomePresenter.registerCallback(this);}@OverrideprotectedvoidloadData(){//加载数据mHomePresenter.getCategories();//---------------这里会爆出空指针异常----------------}@OverridepublicvoidonCategoriesLoded(Categoriescategories){//加载的数据就会回到这里来}@Overrideprotectedvoidrelease(){//取消回调注册if(mHomePresenter!=null){mHomePresenter.unregisterCallback(this);}}}空指针异常在将初始化放在定义成员变量时就解决了这里和视频中不一样是为什么emm这很小白...
2020-03-05 15:12 · 问题
[文章] Mongodb搭建一个环境玩着
其他两个节点都这样修改,去掉密码的配置,要同一个Key进行通讯
2023-04-07 21:22 · mongodb / 集群 / 配置 / 副本 / 大数据
[文章] Android开发RecyclerView的适配器notifyDataSetChange做了什么?
接下来我们就阅读一下源码,adapter跟recyclerView是如何通讯的!
2019-11-02 21:05 · RecyclerView / 安卓开发 / 适配器 / adapter
[文章] 31、Android开发基础之内容提容者ContentProvider
比如说微信/支付宝,在第一次使用的时候会询问你是否同意让它读取你的联系人/通讯录,就是通过内容提供者来读取的。但是,这文章学是会详细地写给大家,还是值得一看的文章!
[文章] android开发喜马拉雅项目专题篇
+i+"errormsg-->"+s);}});}}把这个Activity配置成启动的Activity,然后运行起来,结果如下:说明我们已经配置成功了,可以跟喜马拉雅的服务器通讯
  • 1
  • 2