自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ithouse的专栏

大道至简 返璞归真

  • 博客(372)
  • 资源 (17)
  • 问答 (3)
  • 收藏
  • 关注

原创 远程控制平台四之优化部署

前提是只有一个主控端,如果多个主控端同时看,还是会串流的,但对于我们个人使用而言,这个是可以控制的,如果要严格要求只有一个主控端,目前看来应用单点登陆策略是一个办法。在目前国内手机厂商的严格管制下,绝对的保活是不存在的,只能说,我们自己使用的APP,尽可能自己在手机上把APP加入白名单,使用前台服务,忽略电池使用,允许后台联网,心跳保活等等,多管齐下,才可能让APP尽可能长时间存活。右侧全选引用到的类库,右键鼠标,Exact into Output Root – OK。

2023-08-01 21:27:01 490

原创 远程控制平台三之实现模拟点击

刚开始我是想计算当前屏幕点击位置的像素位置,传递到受控端后,转换相应的像素,但效果不佳,后来想到一个简单粗暴的方法:干脆不用传像素了,就传屏幕位置的比例,比如在主控端点击的是A(x,y)位置,那么我就计算A位置的x和y分别占当前设备的比例,假设为x’和y’,把(x’, y’)传到受控端,分别乘以受控端的宽和高,就得到了具体要点击的位置(以上代码可以体现)。手势的捕捉是比较简单的,只需设置一个主控端SurfaceView的触摸监听即可,需要注意的是,短按、长按和滑动要区分开,我这里是z在。

2023-08-01 20:22:57 273

原创 远程控制平台二之高效率录屏

可以自己定),因为16帧/秒看起来就没有卡顿了,超过这个频率没有意义,而我们的场景,为了能降低延迟,稍稍卡顿也是可接受的,所以我这里就简单地让两次截屏时间间隔不少于100毫秒,如果间隔小于100毫秒,就让线程先休眠50毫秒,也就是说,一秒的视频画面不能多于10帧。显然不是的,我们的要求只是看到远程设备的屏幕以及操控远程设备,所以,图像是必须的,但声音是多余的,至少在我们目前这个项目是这样,所以,我们在录屏的时候,只需使用ImageReader截取受控端屏幕画面传输即可。这样就已经是极限了吗?

2023-08-01 19:47:48 370

原创 远程控制平台一之推拉流的实现

在选用推拉流框架的时候,有了解过nginx+rtmp/rtsp,Janus,以及其他开源的推拉流框架,要么是延迟严重(延迟一分多钟),要么配置复杂,而且这些框架对于只是转发远程画面这个简单需求来说,过于庞大了。以上几乎已经是服务器端所有功能了,实际跑起来的时候,发现在网络不好的情况下,延迟还是比较大的,这是因为默认JeroMQ默认会缓存很长时间的画面,我们需要简单设置一下,尽量减少缓存,但太少又不行,会出现数据不推送,或者延迟没改善的问题,经过多次测试,以下设置可以把延迟控制在5秒内。

2023-08-01 18:38:23 289

原创 远程控制平台简介

之所以想自己动手实现一个远程控制平台,很大一部分原因是因为我那糟糕的记性,虽然经常加班到很晚,拖着疲惫的步伐回到家,才想起忘记打卡了,如果我能在家控制在办公室的手机打一下卡就好了…有人说,市场上有TeamViewer,向日葵,AnyDesk,ToDesk,等等这些老大哥,何必多此一举,重复造轮子?是的,以上提到的都是很成熟的远程控制平台了,但无一不是付费的。

2023-07-31 18:02:57 270

原创 PJSIP编译

必须使用Linux编译,不要在Windows上浪费时间,编译好了再把so拷贝出来Windows即可。没有Linux?virtualbox搞一个Ubuntu不是什么难事,网速快的话半小时搞定。源码目录说明目录:lib: [PJPROJECT的lib库]pjlib:[基础框架库]pjlib-util:[辅助工具库]pjmedia:[开源的媒体栈]pjnath:[开源的NAT-T辅助库]pjsip:[开源的SIP协议栈]pjsip-apps[demo]配置准备VirtualBox6.1Ub

2022-02-23 11:53:39 1882

原创 高德地图定位相关

AMapUtils有一些计算测量相关的工具方法/** * (官方)计算两点之间的距离(米) */public static float calculateLineDistance(double lat1, double lng1, double lat2, double lng2) { lng1 *= 0.01745329251994329D; lat1 *= 0.01745329251994329D; lng2 *= 0.01745329251994329D; la

2021-11-18 09:52:02 409

原创 Android开发规范参考Java版

Android开发规范参考(Java版)一、命名风格1.类名使用 UpperCamelCase 风格不要中英文混合(通用拼音除外,如Beijing等),以每个单词首字母大写。2.方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格驼峰命名法,第一个单词首字母要小写,其他单词首字母大写。①为区分成员变量和局部变量,可以在书写成员变量时,第一个字母用m(member),其他单词遵循驼峰命名法,如mName。注意在写实体类时则不能用m表示member,因为实体类一般都是纯变

2021-11-01 21:42:14 1939

原创 记一次高德地图导致的句柄泄漏问题

Android应用开发过程中,内存泄漏是最常见的,句柄泄漏是怎么回事呢?当出现 Too many open files异常的时候,意味着文件句柄泄漏过多,句柄泄漏到一定数量之后(一般是接近1024)会导致程序卡死、文件读写异常、socket创建异常等。一般来说单一进程的最大可打开文件句柄数量为1024,可通过cat proc/进程ID/limits查看。概念:Fd的全称是File descriptor,在linux OS里,所有都可以抽象成文件,比如普通的文件、目录、块设备、字符设备、socket、管道

2021-10-11 17:26:32 725

原创 Kotlin那些让人相见恨晚的小技巧

Kotlin那些让人相见恨晚的小技巧1.扩展方法名左边写个类名加个点,就像钻进这个类的源码改了它里面代码一样,左边的类表示哪个类可以调用这个扩展函数。扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。fun receiverType.functionName(params){ body}receiverType:表示函数的接收者,也就是函数扩展的对象functionName:扩展函数的名称params:扩展函数的参数,可以为NULL防止快速点击/** * 防止快速点

2021-09-08 11:41:34 192

原创 女朋友说系统自带音乐播放器太臃肿不好用,用Kotlin捋了个本地音乐播放器

代码结构:这一次也是将MVP与JetPack进行了一个融合,这个框架断断续续维护了有大半年,写起逻辑来非常快且清晰,开源看一下示例:/** * 展示某个歌手的所有歌曲 */class ArtistSongActivity : MusicActivity<ActivityArtistSongBinding>() { private val songList = arrayListOf<SongBean>() private lateinit var mAda

2021-08-07 16:23:55 650

原创 Jenkins使用之安卓原生项目

目的:提交代码 --> Gitlab --> webhook --> Jenkins拉取代码并打包 --> 打包完成发布到蒲公英一、准备工作① 最好在局域网准备一台专门用于运行Jenkins的电脑。

2021-06-01 18:33:00 340 1

原创 解决Flutter安卓端启动白屏的问题

修改主题:styles.xml<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> <!-- Show a splash screen on the activity. Automatically removed when Flutter draws its first frame --> <item name="android:windowBac

2021-05-15 17:21:56 552

原创 Android获取本地视频文件缩略图时导致视频播放失败

方案一:播放视频时取消缩略图的加载。缺点:应用层实现治标不治本,还是有几率出现。方案二:源码层实现,交给底层开发人员,应该是video so库出问题了(如libMtkOmxVdec.so)。...

2020-06-20 20:25:20 467

原创 GoogleDrive视频直链播放

String url = file.getDownloadUrl();String token = GoogleDriveManager.getInstance().getCredential().getToken();package com.itant.videotest;import android.content.Context;import android.media.Medi...

2020-06-20 19:58:20 2411

原创 获取Netflix ESN

import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Build;import android.os.Handler;impor...

2020-06-20 19:01:16 1298

原创 Flutter官方国际化方案

1.安装插件File --> Settings… --> Plugins --> 搜索“flutter Intl”,安装该插件,重启AndroidStudio2.配置与初始化配置pubspec.yaml文件新增本地化依赖:dependencies: // Other dependencies... flutter_localizations: sdk: flutter然后package get获取该依赖工程初始化在菜单栏的Tool下找

2020-06-05 11:48:42 1594 1

原创 Flutter(Dart)开发规范及相关技巧总结

基础规范篇文件命名文件名有多个单词的话,需要使用下划线进行分割,且单词均为小写。字符串相关①普通字符串建议使用单引号括起来,而不是双引号,当然非要使用双引号也是没有错误的,习惯问题。②使用三个引号(三个单引号或三个双引号都可以)创建多行字符串String str = '''Hello Dart''';③使用r创建原始raw字符串// 如果没有r,则转义字符会生效(换行) String rawStr = r'Hello \n D

2020-06-04 17:45:01 1167

原创 服务器开发优化

tomcat优化(1GB内存的机子)https://www.cnblogs.com/centos2017/p/9956432.htmlhttps://cloud.tencent.com/developer/article/1463754在catalina.sh文件中,找到cygwin=false,在这一行的前面加入参数,具体如下:JAVA_OPTS="-server -Xms256m -X...

2019-10-12 19:22:19 148

原创 从阿里云购买免费SSL证书之后部署到Tomcat以支持https

首先按照阿里云的免费SSL证书然后按要求验证和下载,没有什么大坑,需要注意的是① 我选择的是文件验证,因为我不是在阿里云买的服务器和域名,需要在tomcat/webapps目录下新建文件夹.well-known,注意前面有个点.,这个文件夹是隐藏的,直接cd进去,再建一个文件夹pki-validation,把文件上传上去,然后再继续验证。② 每次下载都会产生新密码,该密码仅匹配本次下载的证书。...

2019-09-07 00:38:26 632

转载 TV开发焦点跑飞的问题

在使用TV开发时,有可以提供使用的leanback类库里的VerticalGridView等代替手机上的RecyclerView,但实际开发中,经常还是要用到RecyclerView,RecyclerView虽然强大,在TV上却经常遇到焦点跑飞的情况,原因:RecyclerView在长按遥控器的情况下会导致Item的焦点丢失或者说是飞到别的控件上。主要是因为RecyclerView设置适配器,将...

2019-08-27 11:10:26 1169

转载 Linux下SVN服务器搭建

svnserve --version如果提示“未找到命令”,就安装:yum install -y subversion重新验证。新建一个目录作为SVN存放代码的位置:如果当前在~目录下,mkdir svnserver之后则会有~/svnserver/cd ~/svnserver新建一个项目:svnadmin create DemoProjectcd DemoProjec...

2019-07-12 09:36:31 184

原创 工厂模式的实现

工厂模式是一种设计思想,它适用于需要创建多个具体实例的场景,并且这些实例都具有一个共同的方法(动作)。比如,“发送信息”。我们都知道,发送信息的方式有很多种,但无论是用微信发送,还是用邮件发送,它们都有一个共同的动作,就是“发送”,那么可以把这个动作(send)抽象出来。1.普通工厂模式抽象的动作:package com.itant.pattern.sender;public interf...

2019-06-25 10:03:12 565

原创 Android USB(OTG) 删除文件的探索过程

package com.example.sky218790.deltest;import android.Manifest;import android.app.PendingIntent;import android.content.ActivityNotFoundException;import android.content.BroadcastReceiver;import an...

2019-06-11 11:50:27 2687

转载 关于应用调用系统权限的一些想法

在开发APP的时候,经常会遇到这种情况:想调用Android SDK的某个API实现某个功能,但是这个API是@hide的,或者private。这种情况我们通常的做法是:① 如果没有权限拦截,可以考虑反射来调用。② 有系统权限拦截,这种情况下,方法①就失效了。以下是不同的方案实现相同的效果:A. 在AndroidManifest.xml配置android:sharedUserId="andr...

2019-05-16 09:27:34 280

原创 Android系统签名文件转换为keystore文件

应用想要获取系统权限的话就必须要有系统签名,但是在开发一个系统的时候,为了系统的安全性,往往会去改变系统的签名。我们都知道通过platform.pk8 platform.x509.pem和signapk.jar可以对应用进行签名操作,但是这样很麻烦,而且也没办法使用Eclipse中的调试操作了,最简单的方式还是生成keystore然后放在Eclipse里,这样每次编译生成的APK就会自动签上名,方...

2019-04-23 10:26:10 1521 1

原创 解决获取本地视频缩略图关键帧为纯黑或纯白的问题

public static Bitmap getFirstVideoThumbnail(String path, int width, int height) { float maxSize = Math.max(width, height); MediaMetadataRetriever retriever = new MediaMetadataRetr...

2019-04-13 09:10:07 2133 2

原创 如何简单地进行国际化翻译

Android开发中,有做过国际化的同学都知道,如果公司没有专门的翻译团队,需要开发自行翻译多国语言,是一件非常痛苦的事情。通常我们的做法是:复制一行–>到百度翻译或谷歌翻译–>选取目标翻译语言–>复制翻译结果到对应的xml文件里。这样有什么弊端呢?这是纯体力活,如果只有几行还好,但是上千行呢?如果只需翻译一两种外语还好,但是二十多种语言呢?岂不得累死,那么我们能不能相对优雅...

2019-03-28 16:21:08 1139 1

原创 如果有一天我不更新博客了

如果有一天我不更新博客了,或许我已经不是程序员了。1.关于就业选择就业方向是很重要的,有很多同学选择自己所学专业,一部分则选择了其他方向。无论选择什么方向,自己必须冷静思考后决定。有人问,到底要不要选择自己的兴趣作为工作?我的建议是尽量选择自己感兴趣的,因为这样你才会有动力,你才会坚定自己的方向。刚毕业那会儿,迷茫而慌张,记得那时候,出来实习,学习了一个星期的ActionScript3...

2019-03-25 22:22:02 1360 12

原创 pm命令安装apk

安装apk有很多种方法,除了常见的打开开发者中心–debug模式① 使用adb命令adb install apk路径② 使用串口工具【Android P之前】,连接之后,su,然后使用pm进行安装:pm install -r apk路径② 使用串口工具【Android P之后】,连接之后,su,接着cd到apk所在路径,然后使用pm进行安装:首先查看apk的大小:wc -c Sk...

2019-03-12 15:51:52 6065

原创 Android源码模块编译mm编译成功但签名不一致的问题

参与系统源码开发的时候,负责某个模块(系统APP)的开发,通常来说,源码全编译之后,以后想要单独编译模块,直接cd到具体的模块路径下,执行mm(或者上一级执行mmm + 模块名)就可以单独编译该模块。然而其中出现了一个比较诡异的问题:全编译的时候,模块对应的apk会在out\target\product\open_uhd_ap\system\product\app\目录下生成;后来改动了代...

2019-03-08 10:55:40 732

原创 android tv 实现弹出通知

谷歌官方文档已经说了,Android TV要给用户展现的是沉浸式的体验,不希望过多被干扰,所以,普通的Notification是无效的。思路:一个透明的Activity+自定义Dialog实现类似弹出通知的效果。先上效果图:styles.xml&amp;amp;lt;resources&amp;amp;gt; &amp;amp;lt;!--透明主题--&amp;amp;gt; &amp;amp;lt;style name=&amp;q

2019-01-24 08:22:34 3075 5

原创 gradle插件开发

记得我以前曾经发布过一篇发布类库到jCenter的文章:Android开发发布lib到jcenter,发布成功之后,只需要在gradle写一行compile…就可以把类库导进来。当然,你如果觉得麻烦也可以使用第三方的工具,如jitpack,可以很方便把你在GitHub上的项目发布为类库。好了,言归正传,今天主要说一下和发布类库很相似的发布gradle插件教程,你可能见过很多项目除了通过compi...

2019-01-12 13:11:50 1433

原创 Android Space引起TextView走马灯marquee的一个显示bug

在Android TV开发的时候,需要用到一个TextView的走马灯效果,发现一个很诡异的UI问题。先看看item的layout:&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&amp;lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/androi

2018-12-11 19:58:50 572

原创 【原创APP】百度地图显示3个位置

有这么一个场景,我在位置1,我朋友在位置2,我们想去位置3,想知道这3个地点之间的距离关系(直线距离)

2018-11-22 19:48:41 1290

原创 Google Play超大安装包分包技术详细流程

这里说的“分包”不是dex文件的“分包”技术,而是针对大体积(超过100MB)的APK上架Google Play的技术。首先奉上的是官方说明文档,如有需要可以自行查看,本文除了涵盖官方文档的步骤,还详细说明了可能遇到的一些坑。什么是APK扩展文件我们平时开发的应用安装包大小一般都不会超过100MB,但是在开发游戏应用或者包含较多资源文件的应用时,很可能会超过100MB,这个时候是不能直接上架G...

2018-11-15 21:31:14 16631 5

原创 TV开发过程中WebView里的按钮获取不到焦点的问题

我们都知道,TV不像手机,目前大多数TV的屏幕都是不支持触屏的,所以,焦点的控制只能依靠遥控器的方向按钮进行焦点转移。在开发Spotify授权的过程中,发现Spotify的WebView授权界面里的按钮得不到焦点,它原来的布局是&amp;lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; andro...

2018-11-12 22:01:14 2044

原创 支付宝支付个人收款实现的另一个思路

我们都知道,支付宝和微信早就不支持个人开发者收款SDK了,在申请的时候,无论你选的是个人开发者还是公司,都必须提交营业执照,这对我们开发者来说,无疑是很高的门槛。而其他第三方的支付平台,要么收费率太高,要么不靠谱,随时都可能捐款走人,所以自己总结了一个另类的思路,适用于不严格的收款业务。思路如下:点击VIP服务,判断是否为VIP会员如果不是VIP,则弹出购买信息的对话框用户点击确定支付按钮...

2018-10-09 11:43:09 14947 8

原创 通知监听的实现

目标:本应用想监听其他应用弹出的通知信息实现:继承NotificationListenerServicepackage com.itant.payhelper;import android.app.Notification;import android.content.Intent;import android.os.Build;import android.os.Bundle...

2018-10-09 11:16:28 3820

原创 Dagger从入门到放弃

Dagger的好处: 使用Dagger2 的好处比较明显的就是,可以方便的修改,构建对象。 比如很多对象的构建都需要Context,你只要有一个可以提供Context的moudule就可以了,还可以比较方便的控制对象的生命周期,简单来讲就是可以很方便的构建和修改对象的构造函数(只需要维护好Component,module,当然这些对于新手并不简单)。Dagger的缺点: 1.移动类到不同的...

2018-10-03 15:53:20 737

个人封装的MVP框架使用例子

请使用AndroidStudio4.2+运行

2022-02-08

Google Pixel手机壁纸

Google Pixel Wallpaper of 2017

2022-02-08

adb工具免安装AndroidSDK版

不用安装AndroidSDK,直接在Windows系统cmd使用

2021-11-17

Win10共享文件到局域网

Windows 10系统下共享文件到局域网,有几个地方需要注意,如取消访客禁用,启动共享等。

2019-05-07

吾记APP是一个支持换肤的应用简约风格

可以换肤的备忘录应用,使用MVP + OKHTTP + RxAndroid实现

2018-09-17

ttf字体抽取工具-仅供参考

ttf字体抽取工具

2017-04-11

竹翎(Material风格的APP)

一款Material Design风格的安卓APP,运用了MVP、rxandroid、okhttp、Material Design等技术。

2017-04-04

proguardgui代码混淆工具

Java代码混淆工具,能够把类名、变量名混淆成诸如abcdefg的格式。

2016-06-07

pinyin4j-2.5.0.jar汉字转拼音

将中文字符(字符串)转换为对应的拼音的工具类

2015-11-05

JavaScript编程规范

集谷歌JavaScript编程规范指南和众多老程序员的编程习惯,将JavaScript的编程规范娓娓道来,并且解释了部分书写习惯的原因。

2015-06-30

Jackson JSON jar包

Jackson JSON 三个jar包,Jackson JSON是一个非常方便强大的JSON框架,使用其让我们的开发游刃有余。

2015-06-09

【微信支付】公众号支付接口文档V2.7

【微信支付】公众号支付接口文档V2.7,仅供参考。

2014-11-21

Eclipse默认快捷键

Eclipse常用快捷键,加入个人整理。

2014-11-13

IntelliJ IDEA快捷键

IntelliJ IDEA快捷键,加入个人整理。

2014-11-13

Android平台下MonkeyTalk使用流程

Android平台下MonkeyTalk使用流程

2014-11-13

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除