精华内容
下载资源
问答
  • 如何判断手机被监控
    2021-03-19 13:32:51

    直接看代码

    globalData: {
    	udgeBigScreen: false,//判断屏幕
    },
    onLaunch: function(e) {
    	/**判断屏幕大小 */
    	var judgeBigScreen = () => {
    	    let result = false;
    	    const res = wx.getSystemInfoSync();
    	    const rate = res.windowHeight / res.windowWidth;
    	    let limit = res.windowHeight == res.screenHeight ? 1.8 : 1.65; // 临界判断值
    	    if (rate > limit) result = true;
    	    return result;
        }
    	this.globalData.judgeBigScreen = judgeBigScreen();
    }
    onLoad(option) {
    	console.log('是否为长屏 iPhone X', getApp().globalData.judgeBigScreen)
    }

     

    更多相关内容
  • 代码如下:/** * Gets the number of cores available in this device, across all processors. * Requires: Ability to peruse the filesystem at “/sys/devices/system/cpu” * @return The number of cores, or 1...
  • 如果是手机运营商监控,可能老百姓都理解,因为最主要的是能准确的即时的指出手机用户那里不对,也是对手机客户的负责及人身财产的负责,应该支持。但是要是那些钓鱼网站或不怀好意的人监控去了,那么监控性质就不...

    近来,苹果和三星的“监听门”事件愈演愈烈……

    如果是手机运营商监控,可能老百姓都理解,因为最主要的是能准确的即时的指出手机用户那里不对,也是对手机客户的负责及人身财产的负责,应该支持。但是要是被那些钓鱼网站或不怀好意的人监控去了,那么监控性质就不一样了,那些不怀好意的人最后将受到法律的制裁。

    10011047_ACw2.jpg

    但是我们老百姓比较担忧的是手机上用的银行账号密码以及个人信息,这类信息被心术不正的人卖给犯罪份子,或被犯罪分子类型的黑客监控手机窃取去了,或犯罪分子监控了你的个人信息后对你实施敲诈勒索,这几年有些犯罪分子精准的诈骗可能就是因为通过监控个人手机掌握了这类信息。

    黑客的黑科技比比皆是,普通民众根本无从防范,而 一些黑客的有些黑科技可能被犯罪分子买了去,可能就会实施对一些老百姓手机监控银行卡账号支付宝账号或密码以及个人

    信息等实施窃取或敲诈勒索。所以被犯罪分子使用黑客的一些黑科技监控上了手机,可能对老百姓来说是比较恐怖的一件事情。

    另外一个方面,假如如果国家采取监控的话,估计应该是出于防控外敌间谍类的监控,这是必须也是必要的,这就象民居全无设防,贼偷便无所忌惮。 这些对于我们善良的普通老百姓不必介意,因为我们小老百姓没有被监控的价值。

    10011047_dV6w.jpg

    但是要注意的是别被社会上的犯罪分子黑客监控了你的手机,就可能会被窃取了密码以及你个人的信息,然后对你实施敲诈犯罪。所以日常要养成经常用杀毒软件对手机进行杀毒处理。

    最后我们应该感激生活在祖国怀抱中,这些年经济高速的发展,军力高速提升,惠民政策一个接一个,老虎一个个被法办,日本等国的间谍被抓获,一件件,一桩桩,这也说明了祖国的国力的综合实力之所在。可能有些局部方面还略显不足,但都是需要时间来慢慢完善和实现的更加欣欣向荣,相信祖国一定能繁荣昌盛富强立于世界之巅。

    所以我辈百姓要爱自己祖国,遵纪守法。踏踏实实做个爱祖国孝养父母的善良善心之人。 善心善行。

    10011047_oUMz.jpg

    据说,不要太在意自己手机是否被监听,因为如果是国家,那你没办法,只要不犯事就不会有事。如果真的很想知道自己手机是否被监听,可以试试下面几种方法:

    1、手机的话在你发送信息或通话之后,查看自己号码的通讯记录(通讯清单),看有没有产生其他可疑的通讯记录。一般窃取信息的人是通过短信窃取私人信息的。

    2、一般监控手机都需要安装一个监控软件,而这样的软件都是隐匿运行的,很难检测到,如果你怀疑自己的手机被监控了,你可以备份手机上的必要软件和数据,然后恢复手机至出厂设置,这样一些未知的或有潜在威胁的软件就会被处理掉。

    3、手机偶尔会卡顿,按键反应会比较慢。如果手机被植入晶片,"窃听者"在监听时,你拿起手机的同时,不管是玩GAME还是拨电话,按下的第一个按键,会有延迟1~2秒的现象。如果是植入软体,则不会有这个情形。

    最后说一点,安卓手机的系统安全性是很低的,但你可以通过安装安全卫士来防止病毒,如果平常不 root手机不装其他奇怪的软件一般不会被别人监控;苹果则是在越狱后,安装插件的时候存在这种被监控的风险。

    10011048_WxNd.jpg

    关于手机被窃听一事近期在网上引发强烈讨论那么到底是经过怎样的技术对我们的手机进行了窃听呢?

    1.挂线监听:此方法任何反监听技术皆无法察觉,属于国家级的监听技术,适用于任何监听方式(座机电话监听、手机监听),你是商业间谍吗?不是的话,此种监听手法不会用在你身上。

    2.数位GSM手机拦截器:此款监听设备多属商业间谍等专业蒐证监听人员所使用。应用范围涵盖广泛,包括:特定号码锁定监听、拦截通话、简讯,音频锁定 (换号码也没用因为说话音频被锁住),特定区域扫瞄通话内容...等多种监听功能,任何反监听技术皆无法察觉。

    3.间谍卫星监听:特定国家军事级监听方式,功能强大,多用于国家安全系统,任何反监听装备皆无法察觉。

    4.监听手机:目前一般民众可取得的监听工具,有植入晶片与植入软体二种方式,植入软体有别于以往的晶片监听技术,在手机中不会留下任何资料、安装快 速、功能强大,监听时不响铃、不震动,目前的反监听设备皆无法有效察觉。

    如何判别你的手机被监听了?

    如果您被以上的第1.2.3.种手法给窃听了,基本上是无法察觉的(国家要窃听你,你能怎麽办.= =),但有一种治标的方法,就是换手机吧!如果你与特定人士的通话不想被窃听,双方二人同时拥有一隻保密手机,用此保密手机谈话便不会被窃听了,但必需双 方都要有同样的加解密手机才行,看似麻烦,但确是手机防窃听最最有效的方法。

    上面的第4种方法是一般市面上约90%惯用的手机监听戏法,但是在监听前,需要些准备工作,这些准备工作会倒致"窃听者"现出原型,也就是小小破绽,但需要从日常生活上的小地方注意喔!

    10011048_SPj8.jpg

    以下几点如果都符合的话..抱歉..您被窃听了..如果只符合几项也需要小心注意喔.

    1.你的手机不是自已买的?是礼物?还是有消失一阵子.. 手机监听需要拿"被监听人"的手机来"安装",安装需要时间的,植入晶片需要时间约一天,植入软体需要时间约3~10分钟,所以你的手机如果曾经消失过半小时以上,就算符合这个条件了。

    2.手机偶尔会透逗..偶尔按按键反应会比较慢.. 如果手机被植入晶片,"窃听者"在监听的同时,你拿起手机的同时,不管是玩GAME还是拨电话,按下的第一个按键,会有延迟1~2秒的现象。如果是植入软体,则不会有这个情形..

    3.查看电话簿 看看有没有不认识的人出现在你的电话簿里面,如果有的话,那支电话就可能是"窃听者",这支是回拨用的电话号码,也就是"窃听者"用这支手机拨号来窃听,虽然无法知道对方是谁,但把他给删掉就好了^^。

    10011048_4WTv.jpg

    4.每个月的简讯费用暴涨手机窃听有一种功能,您的手机在你不知情的情况下会"主动"发简讯给"窃听者",而且手机里不会留有任何简讯发过的记录,只能从每个月帐单来查了,如果 你的帐单不是自己缴的,那代缴的人就更加可疑了...你发给"窃听者"的简讯内容就是:来电去电(谁拨电话给你,你拨电话给谁)简讯、其它人传给你的简 讯,你收到后也会自动传一封给"窃听者"、你寄出去的简讯,你寄出时也会自动传一封给"窃听者"。不过此功能可开可关,如果有打开的话,简讯费暴涨是一定 的。

    5.SIM卡有开通三方通话功能 要监听通话内容,不外乎就是你在讲电话的同时,又有另外一个人打电话进来,通常这样会变会电话插拨或者是电话占线;但是如果你的手机有开通三方通话功 能,"窃听者"一拨进去就可以直接听通话内容,而你还浑然不知。最好是打电话给你的手机业者查询一下看有没有被"某人"开通了三方通话功能,如果此功能被 关闭,虽然无法得知"窃听者"是谁,但至少通话内容不会再被窃听了。

    解决方法

    1.找出"窃听者":至电信局,调出通联记录,找出明明就没有通话,却有通话记录的可疑日期与时间。2.换手机:直接换一款加密手机就可以根治了,如果不换手机只换SIM卡,是行不通的喔!一样会被窃听~

    3.关机:手机不用的时候把手机关机,最好是把手机电池也给取下来,为了防止前面所述的三种方法,让你的"手机窃听器"停止供电,相对也就不能窃听喽!

    4.通过专业的反窃听设备进行检测:通過無線頻率偵測方式掃描手機監聽軟件 打開開關. ;.將靈敏度調到最低即最 "-" 一邊。 .按MODE鍵把模式調到無線電偵測,中間指示燈 亮起 .將探測器放在手機旁邊,如果有手機監聽軟件被激活工作時,探測器的指示燈 會閃亮起報警,並發出來 ”滴滴…….” 的幹擾聲音,讓對方監聽不 到這邊的真實聲音 .注意:正常打電話也會發射信號導致探測器報警,這是正常現象,只有在您自己沒有打電話,發短信這一類行爲,如果探測器經常報警,就表示您的手機已經被 安裝了間諜監聽軟件,應及時換手機或者將手機送到專業檢測機構檢測。

    10011048_7urf.jpg

    通过无线频率侦测方式扫描手机监听软件

    打开开关. 2.将灵敏度调到最低即最 "-" 一边。 .按MODE键把模式调到无线电侦测,中间指示灯 亮起 .将探测器放在手机旁边,如果有手机监听软件被激活工作时,探测器的指示灯 会闪亮起报警,并发出来 ”滴滴…….” 的干扰声音,让对方监听 不到这边的真实声音 .注意:正常打电话也会发射信号导致探测器报警,这是正常现象,只有在您自己没有打电话,发短信这一类行为,如果探测器经常报警,就表示您的手机已经被 安装了间谍监听软件,应及时换手机或者将手机送到专业检测机构检测。

    三种情况。一是自己犯事了,被国家机构监听。二是自己损害了某些人的利益,被非法机构或个人监控。三是自己什么都没干,好端端的就被盯了。

    第一种情况你没办法解决。因为是你的问题。而而后两种情况就应该警惕了。

    我们先来看一看如何窃听。

    其实目前仍无法由外观或内部判断手机是否被植入窃听木马,但是如果手机关机后仍能拨通且屏幕没反应,就是被植入了木马。

    由于执行通话窃听须SIM卡有启动三方通话功能,如果怀疑手机被窃听,可以查看自己的手机记录,比对是否有三方通话纪录,并可由短信的发送者查出犯罪者。

    由于警方目前查出被窃听的手机都是使用S60的作业系统,手机厂商建议使用S60的消费者,不要轻易启动蓝牙装置,如果启动,则将「我的名称」隐藏,而且不要接收来路不明的简讯,以防恶意人士传送窃听程式;但如果特定人利用短信方式植入窃听木马,较难防范。

    那么,对于手机被窃听,我们应该如何预防呢?

    一、关机

    手机不用的时候把手机关机,最好是把手机电池也给取下来,为了防止前面所述的三种方法,让你的"手机窃听器"停止供电,相对也就不能窃听喽!这是最有效直接的一种方法

    二、换新手机

    直接换一款加密手机就可以根治这种情况了,但是如果不换手机只换SIM卡,是行不通的!治标不治本,还是一样会被窃听

    三、寻求专业机构帮助

    1,找出"窃听者":至电信局,调出通联记录,找出明明就没有通话,却有通话记录的可疑日期与时间

    2,通过专业的反窃听设备进行检测:通过无线频率侦测方式扫描手机监听软件。

    最后总结一下,手机被控一定是有原因的,而且目前来讲比较常用有二种方法,一种是在手机内种植病毒,另一种就是后台了,种植病毒日前只能用在安卓,萍果是种不到的,用这种方法往往是你最亲密的人,知道你手机密码,最少要有5分钟安装时间,要发现这种除了专业软件,你注意下耗电量即可感觉到,另一种后台的,我就不多说了大家都懂的,要发现这种,我的经验是你在接电话时特别是接通这一瞬间多注意手机杂音,如果经常挟着象收音机一样的滋兹声音,而以前手机从未有过,那恭喜你中奖了。而移动监控的话实际就是用伪机站接通你手机与移动运营商的机站!

    转载于:https://my.oschina.net/u/3579120/blog/1533003

    展开全文
  • 本文设计了一套手机使用状态监控系统, 先采用YOLOv3检测图像中的人体, 然后通过OpenPose姿态估计算法获得人体关节点, 再通过YOLOv3判断手部区域是否有手机, 最后通过神经网络分类器识别当前的手机使用状态....
  • 手机是否已他人监控了?如果出现这3种现象,大家还是小心点 手机这件商品已经成为了,大家日常生活中的必需品,我们与手机几乎是形影不离的存在,那么大家在使用手机时要注意了,手机是否他人监控,我们要观察...

    手机是否已被他人监控了?如果出现这3种现象,大家还是小心点
    手机这件商品已经成为了,大家日常生活中的必需品,我们与手机几乎是形影不离的存在,那么大家在使用手机时要注意了,手机是否被他人监控,我们要观察手机是否出现这3种现象,如果出现了,大家还是小心点为好。
    在这里插入图片描述现象一:手机变得异常卡顿
    手机造成被监控的多数原因是手机内,存在着与监控相关联的第三方应用,这些程序一般都是用户们从浏览器或者其它途径进行获取的,在多数的应用商店内都无法上架。如果你的手机内莫名的出现了一些手机应用,那么我们就要提高警惕了。
    在这里插入图片描述这些应用能够后台自动运行,从而造成我们手机卡顿,当然了,我们的手机使用的时间过久也会出现卡顿,所以我们就需要自己判断手机卡顿的起因,如果正常使用手机突然变得卡顿,那么大家一定好好好的检测下手机,很有可能你的手机就被监控了。
    在这里插入图片描述现象二:手机话费消耗异常
    大家在使用手机时都会插入自己的手机卡,那么自己肯定是对该手机卡所办理的业务比较了解,就算是不了解的用户也能够通过网上营业厅进行查询,如果原先的手机话费的消耗并不是很大,突然某个月增加了很多。
    在这里插入图片描述那么我们首先就应该询问运营商,如果运营商显示我们是有额外的费用且不是本人并未进行使用的,那么我们的手机也有可能是被监控了,通过运营商的官网,我们还能够查询到自己的详细账单,彻底搞清楚扣费的来源。
    在这里插入图片描述现象三:通话过程中声音非常小
    手机通话声音变小主要原因是手机听筒的硬件设备受到了损坏,或手机通话被人监听。我们可以把手机拿到官方售后店进行检测,先行排除手机硬件方面的问题,如果不是硬件问题,那么我们手机就有可能被某项程序监控了。
    在这里插入图片描述如果我们手机真的被监控了,我们应该怎么办呢?
    首先切断手机能够对外传播的一切途径,如:手机网络,无线网络以及蓝牙等全部关闭。这样监控的程序就无法进行实时转播了。
    然后卸载手机内没从正规渠道获取的应用。
    此番操作还是不行的话,我们需要将手机进行刷机或者回复出厂设置。登陆手机账号的用户更改下手机账户的密码。
    在这里插入图片描述【小酱建议】:大家在日常生活中,最好不要随意把自己的手机借给陌生人使用,这样会有利于一些不法分子对我们手机直接植入病毒以及非法手机应用。
    在这里插入图片描述大家进行手机应用获取时,最好是通过手机自带的应用商店进行获取,像小酱经常使用的录音转文字助手就是通过此类渠道得到的。内带的语音翻译功能,可以轻松的帮助小酱与外国人交流,还能够把音频文件翻译成中文,完全不用担心应用的来历问题。
    在这里插入图片描述此篇文章就到此结束了,小酱在文章最后再提醒大家一遍,有效的对手机进行一部分的防护措施,能够减少手机被不法分子监控的可能性。一旦感觉到手机出现疑似被监控的现象,我们要及时的处理解决此类现象,避免给我们财产或者人身安全带来更多的损失。
    在这里插入图片描述感谢大家的阅读,谢谢!如果你还想了解更多更好的手机技巧或资讯,请关注小酱,随时带你分享哦!谢谢支持!

    展开全文
  • 该方案适配小米手机拍照和相册选择,解决api23 的FileNotFoundException,还有判断当前手机系统的工具类.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 现有的智能手机是可以充当Wifi摄像头来使用的,这就需要装一个App就能实现了,如果是用别的下载来APP安装用来会不会不放心呢,如果自己有能力,那就可以通过开发Android App项目过程来实现视频监控,有兴趣的来看看...

    闲置在家不用的Android手机有一两个都蒙尘了,想要把它们充分利用起来,可知道,现有的智能手机是可以充当Wifi摄像头来使用的,这就需要装一个App就能实现了,如果是用别的下载来APP安装用来会不会不放心呢,如果自己有能力,那就可以通过开发Android App项目过程来实现视频监控,有兴趣的来看看接下来的实现方案,

    要完成整个过程,至少需要两部手机,一个手机用来充当WIFI摄像头(可以开启WIFI热点),另一个手机当视频监控用的,还是建议用WIFI路由器,就看中它信号强,网络又稳定

    关于能看懂此文章的条件

    1. 会使用Android Studio开发工具
    2. 熟悉Java编程语言,开发过Android App
    3. 对WIFI路由器设置和网络信息收发报文TCPUDP原理有过了解

    1.首先,打开Android Studio开发工具,选择新建Android 项目,使用Java语言,模板就选择 Emtpy Activity,在activity_main.xml文件中做好布局,具体布局内容太多这里就不贴了,自己布局就好,拖放组件是很简单的操作,只需要放三个按钮组件即可,分别是扫描摄像头开启摄像头退出APP,其它的不重要
    在这里插入图片描述
    2. 然后,在MainActivity.class上写代码,实现能打开按钮对应的页面即可,请看如下代码,其中用到的一些类,例如DeviceInfo.class, Common.class, BaseBackActivity.class这些就不贴了,看注释,具体的请等在后面提供的项目源码里看

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //...这里省略了,只是处理了对标题栏的隐藏
            setContentView(R.layout.activity_main);
            //获取布局中的按钮组件
            Button btnScan = findViewById(R.id.button_scan);
            Button btnPreview = findViewById(R.id.button_preview);
            Button btnExit = findViewById(R.id.buttonExit);
    
            final Context context = MainActivity.this;
            //设置点击事件
            btnExit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    MainActivity.this.finish();//退出
                }
            });
            btnScan.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                	//初始化设备信息,包括了手机的摄像头相关属性,如名称,IP,数量
                    DeviceInfo di = DeviceInfo.init(context);
                    //...省略了一些判断细节,如判断IP是否正确,判断摄像头的网络状态
                    //打开扫描局域网内的摄像头页面
                    BaseBackActivity.navigateTo(MainActivity.this, ScanActivity.class, di);
                }
            });
            btnPreview.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    	            //初始化设备信息
                    DeviceInfo di = DeviceInfo.init(context);
                    //...省略了一些判断细节,这一步是判断摄像头的授权
                    if(Common.requestCameraPermission(MainActivity.this)){
                    	//打开WIFI摄像头的预览页面
                        BaseBackActivity.navigateTo(MainActivity.this, PreviewActivity.class, di);
                    }
                }
            });
        }
    }
    
    1. 接下来,做一个扫描摄像头页面的布局,文件是activity_scan.xml,大致布局如下图所示,运行后的效果图,就一个ListView展示列表的组件,还有标题栏上的搜索图标,那是扫描按钮
      在这里插入图片描述

    2. 接着,创建一个对应页面的类ScanActivity.class 文件后,写上代码,如下

    /**
     * 扫描摄像头窗口
     * */
    public class ScanActivity extends BaseBackActivity {
    	//定义扫描线程
        private ScanThread thread;
       	//定义列表组件
        private ListView list;
        //定义对初始化扫描的判断值
        private boolean isFirstScan = false;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_scan);
    		//省略了,处理初始化标题栏的
            //获取上一页传来的设备信息对象, getSerializable()是来自父类BaseBackActivity的方法
            DeviceInfo di = (DeviceInfo) getSerializable();
    		//创建线程时,传入设备信息对象
            thread = new ScanThread(this, di, new Handler(){
                @Override
                public void handleMessage(@NonNull Message msg) {
                    super.handleMessage(msg);
                    //处理线程传来的消息
                    switch (msg.what) {
                    	//扫描完成通知
                        case BaseThread.MESSAGE_SUCCESS:
                        {
                        	//获取扫描后的局域网内所有可用的摄像头
                            ArrayList<RemoteCamera> cameras = thread.getCameras();
                            if(cameras.isEmpty()) {
                            	//showToast方法来自父类,弹出提示
                                showToast(ScanActivity.this, "找不到可用的摄像头!");
                            }else{
                            	//更新摄像头列表显示的
                                CamerasAdapter adapter = new CamerasAdapter(ScanActivity.this, cameras);
                                list.setAdapter(adapter);
                                list.invalidate();
                                showToast(ScanActivity.this, "扫描完成!");
                            }
                        }
                            break;
                        //扫描失败,或更新状态
                        case ScanThread.MESSAGE_FAIL:
                        case ScanThread.MESSAGE_LOADING:
                            showToast(ScanActivity.this, (String) msg.obj);
                            break;
                        default:
                    }
                }
            });
    
            list = findViewById(R.id.listview);
    		//列表的点击事件
            list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    RemoteCamera camera = thread.getCameras().get(i);
                    //打开远程摄像头连接页面,传递一个摄像头信息camera
                    navigateTo(ScanActivity.this, RemoteActivity.class, camera);
                }
            });
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            //...此处省略,加载菜单布局的
            return super.onCreateOptionsMenu(menu);
        }
    
        @Override
        public boolean onOptionsItemSelected(@NonNull MenuItem item) {
            //监听菜单按钮
            switch (item.getItemId()) {
            	//扫描图标按钮被点击
                case R.id.app_bar_search:
                    thread.startScanCamera();
                    return true;
                default:
            }
            return super.onOptionsItemSelected(item);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            //第一次打开页面就扫描
            if (!isFirstScan) {
                thread.startScanCamera();
                isFirstScan = true;
            }
        }
    }
    
    1. 看上面就会发现,扫描的处理操作是比较耗时的,放在线程ScanThread.class里处理是合理的,这样用户操作就不会觉得卡,处理操作的方法大致讲一下
    public class ScanThread extends BaseThread {
    
        private ArrayList<RemoteCamera> cameras;
        private DeviceInfo info;
        //定义一个扫描线程
        private Thread scanThread = null;
    
        public ScanThread(Activity context, DeviceInfo info, Handler handler) {
        	//传参给父类BaseThread的构造方法,初始化
            super(context, handler);
            this.info = info;
            this.cameras = new ArrayList<RemoteCamera>();
    		//来自父类的线程,用于处理接收的
            thread = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try {
                    	//初始化端口
                        mSocket = new DatagramSocket(null);
                        //...
                        mSocket.bind(new InetSocketAddress(SenderThread.FIND_CAMERA_PORT));
                        while(!Thread.interrupted()) {
                        	//定一个空的数据报文
                            DatagramPacket pack = new DatagramPacket(new byte[1028], 1028);
                            //用空数据报文来接收数据,这时会一直等待,阻塞
                            mSocket.receive(pack);
                            //收到时,将报文里的数据转换成字符串
                            String s = new String(pack.getData(), 0, pack.getLength());
                            //在把字符串转成字符串数组,将接收到数据按照约定的协议转换一下
                            String[] datas = Common.getDeviceData(s);
                            //...此处省略,处理拿到count, 是摄像头数量,添加到cameras中
                            cameras.add(new RemoteCamera(cameras.size(), datas[0], count, datas[2]));
                            //发完成提示消息
                            showToast("扫到一个摄像头", MESSAGE_SUCCESS);
                        }
                    } catch (Exception e) {
                        showToast(e.getMessage());//遇到错误!
                    } finally {
                        cancelScan(true);
                    }
                }
    
            });
            thread.start();
        }
    
        public void startScanCamera() {
            //...次数省略判断的细节,下一步提示用户扫描中,建一个线程处理
            showToast("扫描中...", MESSAGE_LOADING);
            scanThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //...此处省略一些细节,定义data数据
                        // 定义局域网的广播地址,这样表示 *.*.*.255,
                        InetAddress cameraAddress = InetAddress.getByName(Common.getWanIP(info.getLocalIp())+"255");
                        // 将data数据封装到报文中,还有IP地址,FIND_CAMERA_PORT 是 30000
                        DatagramPacket pack = new DatagramPacket(data, data.length, cameraAddress, FIND_CAMERA_PORT);
                        //将数据报文发送到广播地址,只要是连接到此局域网内的所有设备开放的30000端口都会收到该广播报文
                        mSocket.send(pack);
                    } catch (Exception e) {
                        showToast(e.getMessage());//遇到错误!
                    } finally {
                    	//处理完后取消操作
                        cancelScan(false);
                    }
                }
            });
            scanThread.start();
        }
    	//判断是否在扫描
        public boolean isScaning() {
            return scanThread!=null;
        }
    
        public ArrayList<RemoteCamera> getCameras() {
            return cameras;
        }
    	//取消扫描
        public void cancelScan(boolean isCancelAll) {
            if(isCancelAll) {
            	//处理来自父类的方法
                cancelThread();
            }
            if (isScaning()) {
                scanThread.interrupt();
                scanThread = null;
            }
        }
    }
    

    💡小提示
    注意到创建的页面都有继承BaseBackActivity.class类,创建的线程都有继承类BaseThread.class,具体怎么写的,这里不详细讲了,那说下它的作用,它是相当于一个可以复用的类吧,类似模板,可以这样理解,稍微能明白,实现不会复杂

    1. 把需要添加的权限都写上,在AndroidManifest.xml文件中,添加如下关键的代码
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="...">
    
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.CAMERA" />
    
        <!-- 此处省略... -->
    </manifest>
    
    1. 接下来,打开视频监控,也就是远程摄像头预览的页面,大致布局如下图所示,文件是activity_remote.xml,放一个展示状态的TextView组件,还有一个预览画面的SurfaceView组件放在中间,宽高分别是固定的320dp,240dp
      在这里插入图片描述

    💡小提示
    有没有注意到,看视频监控上的状态栏,网络保持在23.3K/s每秒,这已经是一帧一帧的传输图像了,图像是320x240分辨率的,传输量会不会低了,可能有点卡吧,跟网络传输延迟有关的

    1. 接着,创建一个对应页面的类,在RemoteActivity.class 文件里,写上代码,如下
    public class RemoteActivity extends BaseBackActivity {
    	//定义一个网络接收的线程
        private ReceiveThread thread;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_remote);
            //...省略了,处理初始化标题栏的
            //获取上一页传来的设备信息对象, getSerializable()是来自父类BaseBackActivity的方法
            RemoteCamera remote = (RemoteCamera) getSerializable();
    		//从布局中获取组件
            SurfaceView view = findViewById(R.id.surfaceView2);
            final TextView showState = findViewById(R.id.textView_state2);
    		//将远程设备信息设置到标题栏上
            setTitle("远程摄像头:"+remote.toString());
            //先获取焦点,然后设置屏幕长亮
            view.setFocusable(true);
            view.setKeepScreenOn(true);
    		//建立一个接收线程,传一个远程设备信息对象,还有预览组件的holder用于更新画面
            thread = new ReceiveThread(this, new Handler(){
                @Override
                public void handleMessage(@NonNull Message msg) {
                    super.handleMessage(msg);
                    //...处理线程发来的消息提示
                }
            }, remote, view.getHolder());
        }
    
        @Override
        protected void onPostResume() {
            super.onPostResume();
            //让线程开始接收工作
            thread.startReceive();
        }
    
        @Override
        protected void onDestroy() {
    	    //当前页面关闭时,让线程结束工作
            thread.cancelReceive();
            super.onDestroy();
        }
    }
    
    1. 看上一步就会发现,关键的处理接收方法都放在线程ReceiveThread.class里,那是比较耗时的操作,大致讲一下
    public class ReceiveThread extends BaseThread {
    
        private RemoteCamera remote;
        private SurfaceHolder holder;
    
        public ReceiveThread(Activity context, Handler handler, RemoteCamera remote, SurfaceHolder holder) {
            super(context, handler);
            this.remote = remote;
            this.holder = holder;
        }
    
        public void startReceive() {
            if (thread!=null) {
                return;
            }
            thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    String errMsg = "未知错误";
                    //...
                    try {
                        //...
                        if (mSocket==null) {
                            mSocket = new DatagramSocket(null);
                            //用开放30000端口来接收  FIND_CAMERA_PORT
                            mSocket.bind(new InetSocketAddress(FIND_CAMERA_PORT));
                            //...
                            showToast("连接中...", MESSAGE_UPDATE_STATE);
                            //发送请求接收下一帧图片
                            sendRet(mSocket, baos);
                            //...
                            showToast("等待接收...", MESSAGE_UPDATE_STATE);
                            while(mSocket!=null) {
                                //...定义空的数据报文packet
                                try {
                                    //接收中,等待,此处阻塞
                                    mSocket.receive(packet);
                                }catch (SocketTimeoutException te) {
                                    showToast("连接超时..."+getLocalDateTime(), MESSAGE_UPDATE_STATE);
                                    //再次发送请求
                                    sendRet(mSocket, baos);
                                    //...继续循环,重新接收
                                    continue;
                                }
                                //判断一帧图片baos数据是否接收完成
                                if(packet.getLength() == endlen) {
                                    String end = new String(packet.getData(), 0, endlen);
                                    if(end.startsWith(PACKET_END)) {
                                        //...获取time时间数据,下一步更新显示
                                        updateViewDisplay(baos, time);
                                        //设置接收下一帧等待时长,至少每100ms接收下一帧,可以设置更小,让视频看着更流畅
                                        Thread.sleep(100);
                                        baos.flush();
                                        //再次发送请求
                                        sendRet(mSocket, baos);
                                        //...
                                        showToast("接收中..."+getLocalDateTime(), MESSAGE_UPDATE_STATE);
                                        continue;
                                    }
                                }
                                //接收一帧图片数据流
                                baos.write(packet.getData(), 0, packet.getLength());
                            }
                        }
                    } catch (Exception e) {
                        errMsg = e.getMessage();//断开连接!;
                    } finally {
                        //...
                        cancelThread(errMsg);
                    }
                }
            });
            thread.start();
        }
    
        private void sendRet(DatagramSocket dSocket, ByteArrayOutputStream baos) throws IOException, Exception {
            //省略...处理发送接收下一帧图片请求
            InetAddress address = InetAddress.getByName(remote.getIp());
            DatagramPacket pack = new DatagramPacket(data, data.length, address, FIND_CAMERA_PORT);
            dSocket.send(pack);
            //...
        }
    
        private void updateViewDisplay(final ByteArrayOutputStream baos, final String time) {
            //省略...处理转换图片
            context.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    //...锁定中,从组件中获取画布Canvas
                    Canvas canvas = holder.lockCanvas(null);
                    //...将图片画组件中,让用户可以看到
                    canvas.drawBitmap(bitmap2, 0, 0, null);
                    //...画上时间
                    canvas.drawText(time, 20, 30, p);
                    //解除锁定
                    holder.unlockCanvasAndPost(canvas);
                    //...
                }
    
            });
        }
    
        public void cancelReceive() {
            cancelThread();
        }
    }
    
    1. 接下来,做一个开启摄像头页面的布局,文件是activity_preview.xml,大致布局如下图所示,是运行后的效果图,同上面讲过,跟远程摄像头页面布局那个是一样的,现在是有多放了一个选择摄像头的下拉框组件Spinner
      在这里插入图片描述

    2. 接着,创建一个对应的页面类PreviewActivity.class文件,写上代码,参考如下

    public class PreviewActivity extends BaseBackActivity {
    
        private Camera camera = null;
        private SurfaceHolder holder;
        private Spinner seletep;
        private int selectCameraId = 0;
        //定义发送图片的线程
        private SenderThread thread;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_preview);
            //...
            final DeviceInfo info = (DeviceInfo) getSerializable();
            //...获取布局中的组件,SurfaceView是绘制组件
            final SurfaceView view = findViewById(R.id.surfaceView);
            seletep = findViewById(R.id.spinner);
            final TextView stateView = findViewById(R.id.textView_state);
    		//创建一个发送图片的线程,传入设备信息对象
            thread = new SenderThread(this, info, new Handler(){
                @Override
                public void handleMessage(@NonNull Message msg) {
                    super.handleMessage(msg);
                    //...处理线程发来的消息
                }
            });
    
            String localIp = thread.getLocalIp();
            String name = thread.getDeviceName();
            setTitle("设备名:"+name+ ", 局域网IP:"+localIp);
    
            seletep.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                    //...切换摄像头
                }
            });
    
            //先获取焦点
            view.setFocusable(true);
            //然后设置屏幕长亮
            view.setKeepScreenOn(true);
    
            holder = view.getHolder();
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            holder.addCallback(new SurfaceHolder.Callback() {
    
                @Override
                public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
                    //绘制组件创建,准备摄像头
                    int cameraCount = Camera.getNumberOfCameras();
                    //...
                    thread.setCameraCount(cameraCount);
                }
    
                @Override
                public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) {
                    //绘制组件大小改变,重置摄像头
                    //...
                    openCamera();
                }
    
                @Override
                public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
                    thread.cancelThread();
                    //绘制组件销毁,释放摄像头资源
                    closeCamera();
                }
            });
        }
        
        @Override
        protected void onPostResume() {
            super.onPostResume();
            //可被局域网内发现摄像头
            thread.canFind(true);
        }
    
        private void openCamera() {
            //...
            try{
                camera = Camera.open(selectCameraId);
                Camera.Parameters params = camera.getParameters();
                List<Camera.Size> sizes = params.getSupportedPictureSizes();
                //图像大小
                final int PICTURE_WIDTH = 320, PICTURE_HEIGHT = 240;
                Camera.Size size = null;
                //省略细节...查找摄像头配置参数,赋值图像大小
                params.setPreviewSize(size.width, size.height);
                params.setPreviewFrameRate(20);
                params.setPictureFormat(PixelFormat.YCbCr_420_SP);
                camera.setParameters(params);
                //讲摄像头的图像设置到绘制组件中
                camera.setPreviewDisplay(holder);
                camera.setPreviewCallback(new Camera.PreviewCallback(){
    
                    @Override
                    public void onPreviewFrame(byte[] bytes, Camera camera) {
                        //...省略细节...处理摄像头传来的图片,将bytes转换成image,当然可以不转换,直接发送更高效吧
                        //交给线程去发送
                        thread.setSendCameraImage(image);
                    }
                });
                camera.startPreview();
            } catch (Exception e) {
                showToast(this, "开启摄像头遇到了错误!");
            }
        }
    
        void closeCamera() {
            //...
            camera.stopPreview();
            camera.setPreviewCallback(null);
            camera.release();
            camera = null;
        }
    
    }
    
    1. 看上一步就会发现,关键的处理发送方法都放在线程SenderThread.class里,那也是比较耗时的操作,大致讲一下
    public class SenderThread extends BaseThread {
        private int cameraCount = 0;
        public boolean isSending = false;
        private DeviceInfo info;
        private YuvImage image = null;
    
        public SenderThread(Activity context, DeviceInfo info, Handler handler){
            super(context, handler);
            this.info = info;
        }
        //...
        public void setCameraCount(int cameraCount) {
            this.cameraCount = cameraCount;
        }
    
        public void canFind(boolean isFind) {
            if(isFind==true && thread==null) {
                this.thread = new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        String errMsg = "未知错误";
                        try {
                            mSocket = new DatagramSocket(null);
                            //...绑定开放的30000端口
                            mSocket.bind(new InetSocketAddress(FIND_CAMERA_PORT));
                            do {
                                //...
                                DatagramPacket pack = new DatagramPacket(new byte[1028], 1028);
                                try {
                                	//接收数据,等待中,会阻塞
                                    mSocket.receive(pack);
                                }catch (Exception e){
                                    e.printStackTrace();
                                    throw e;
                                }
                                //获取发来请求的设备地址
                                SocketAddress sendAddress = pack.getSocketAddress();
                                //...
                                ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(pack.getData()));
                                Integer code = (Integer) ois.readObject();
                                //...
                                switch (code){
                                    case GET_CAMERA_IP:
                                    {
                                        //...判断请求1,将摄像头的数据包装成data,封装在报文中回发过去
                                        DatagramPacket packet = new DatagramPacket(data, data.length, sendAddress);
                                        mSocket.send(packet);
                                    }
                                    break;
                                    case RET_CAMERA_IP:
                                    {
                                        isSending = true;
                                        //...判断请求2,处理一帧图片回发过去
                                        sendImage(image, sendAddress, sendTime);
                                        isSending = false;
                                    }
                                    break;
                                    default:
                                }
                            }while (!thread.isInterrupted() && mSocket!=null);
                        } catch (Exception e) {
                            errMsg = e.getMessage();
                        } finally {
                            cancelThread(errMsg);
                        }
                    }
    
                });
                this.thread.start();
            }else{
                cancelThread();
            }
        }
    
        private void sendImage(YuvImage image, SocketAddress sendAddress, String sendTime) throws Exception {
    	    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    	    //将图片转换成数据流,压缩了图片就变小,减少传输量
            image.compressToJpeg(new Rect(0,0, image.getWidth(), image.getHeight()), 80, outStream);
            //...定义缓存大小,转换图片数据流
            byte[] buffer = new byte[1024];
            ByteArrayInputStream bais = new ByteArrayInputStream(outStream.toByteArray());
            try{
                int len;
                DatagramPacket pack;
                //...读取图片数据流,并拆分几次分发出去
                while((len = bais.read(buffer, 0, buffer.length)) != -1) {
                    pack = new DatagramPacket(buffer, len, sendAddress);
                    mSocket.send(pack);
                }
                //分发完成后,最后发一个结束信息,告诉接收方这一帧图片已发完
                byte[] end = (PACKET_END+sendTime).getBytes();
                pack = new DatagramPacket(end, end.length, sendAddress);
                mSocket.send(pack);
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                bais.close();
            }
        }
    
        public void setSendCameraImage(YuvImage image) {
            if (isSending()) {
                return;
            }
            this.image = image;
        }
    
        public boolean isSending() {
            return isSending;
        }
    }
    
    1. 接下来,剩下的完善细节不再是重点就不讲了,有个清晰的思路就好,需要自己完善一下细节,到最后能将Android项目顺利编译运行起来,接下来,做个实验测试几遍,准备一个WIFI路由器,用一个网线连接上电脑上(或者WIFI连接也可以),只要能登录路由器的控制页面,找到如下图所示,看看是否已取消勾选开启AP隔离,再点保存就可以了,取消AP隔离这样能让局域网的各种设备可互相连通,不需要连接到互联网
      在这里插入图片描述

    💡 小提示

    • 为了安全起见,路由器中不建议对访客开放的WIFI网络中禁用AP隔离哦,
    • 有些路由器中有访客WIFI开关,这个是没有AP隔离可禁用的
    • 没有WIFI路由器的话,可用其中的一个手机开启WIFI热点功能代替,然后安装上面开发的APP,点击开启摄像头按钮就可以了,其它的手机都能扫描到这个摄像头的
    1. 不知不觉发现写了很多,就讲到这里了,关于此Android项目源代码就在这里点此查看,在里面可找到,请放心下载,感谢耐心看完,若觉得此文章很有帮助,请点个赞❤再走,TA远方在此谢过~

    在这里插入图片描述

    展开全文
  • 电子控制即远程本地经过MCU对灯实现电子监控。这样设计有两方面考虑,首先节能的作用,**可以手动关掉MCU,依然可以控制灯光。其次应急情况下使用,因为MCU故障或其他原因造成电子控制失灵时,可以切换到机械控制...
  • 请问有什么办法能够监控到android手机的屏幕显示的内容发生了变化呢? 有人提到不停截图进行比对的方式,这种方式因为效率不高,所以会导致判断到画面发生变化时的时间点不会非常准确,误差可能在几十甚至上百...
  • 网上有很多代码在苹果手机的UC浏览器上是识别不出是手机端的,我测试过很多代码,最终得到下面最可行的: <script type="text/javascript"> //判断访问终端 var browser = { versions: function() { ...
  • 基于手机app的树莓派远程监控(非常全)

    万次阅读 热门讨论 2022-01-07 11:25:04
    四、网络视频监控配置与实现 1、利用mjpg-streamer框架实现,基本配置方案看链接:(链接私聊) 五、树莓派环境配置 1.基本上按照四中的链接配置 都可以直接将树莓派的摄像头运行起来(如图即为运行成功)
  • 我想实现以下情况,以确定音乐是否正在Android手机上播放,如果是,则通过特定手势进行播放,或单击一个按钮分享我当前正在听的音乐.第一步是确定当前是否正在播放音乐.一开始,我认为这有点复杂. 我以为我会更深入...
  • { renderResize() { // 判断横竖屏 let width = document.documentElement.clientWidth let height = document.documentElement.clientHeight if(width > height) { alert('横屏') } // 做页面适配 // 注意:...
  • 易语言手机控制电脑

    2020-08-22 02:35:05
    易语言手机控制电脑源码系统结构:登录,增加QQ,多线程提取,判断状态,下线,取指定内容,错误重登,执行操作,返回信息,重开监控,ReadProcessMemory,OpenProcess,取操作系统目录,寻找顶级窗口_,Ge
  • 在做自动化测试时,遇到两种情况需要判断usb是否已连接上(注,本文仅针对用adb命令来control手机) 一种是在开测时(前提是同时要测试多台), 希望等待所有设备usb全部识别后同时进行测试。对于这一种,当然是可以另...
  • 如何判断滚动是否滚动到了底部? 首先要了解的知识 scrollHeight,clientHeight,scrollTop scrollHeight 只读属性,高度包括所有内容,包含内边距,但不把水平滚动条、边框和外边距算在内。 clientHeight 也是只读...
  • 大神们小白有个问题 ios12以上能否监测到手机是否开了vpn或者代理ip
  • 哦,对了,以下几种方法都是针对TV上监控有无遥控器按键的,至于手机之类的触摸事件,大家可以举一反三。 方法一 使用 串口命令getevent 大家有用过串口调试过android 系统的,可能都知道,我们在串口中输入getevent...
  • 手机APP远程温湿度监控系统(连上公网、阿里云)

    千次阅读 热门讨论 2021-01-28 22:59:31
    } 1.2 串口判断字符代码 void Usart() interrupt 4//在中断里面进行两个判断,首先是WiFi响应"OK"的判断,接着是":A" ":B" ":C" ":D"的判断 { uchar receiveData; if(RI == 1) { receiveData = SBUF;//出去...
  • 怎样判断手机是不是正品

    千次阅读 2016-06-22 21:39:39
    在你的手机开机后输入*#06#,你将看到一组号码,这组号码就是你的手机的IMEI。     IMEI的排列组合依循着下列方式:     IMEI=TAC+FAC+SNR+SP     IMEI=国际移动装备辨识码     TAC=...
  • android手机旋转方向识别 gitee代码链接: 检测手机旋转角度 代码极其简单: package com.example.detectorientation; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import ...
  • 判断Android手机是否开启USB调试

    千次阅读 2015-09-21 17:08:14
    boolean enableAdb = (Settings.Secure.getInt(getContentResolver(), Settings.Secure.ADB_ENABLED, 0) > 0); if(enableAdb){ Toast.makeText(this, "enable", 1).show(); }else { ...
  • 以下是部分手机的厂商判断,跳转方法及对应设置步骤,跳转方法不保证在所有版本上都能成功跳转,都需要加 try catch。 华为 厂商判断: public boolean isHuawei() { if (Build.BRAND == null) { ...
  • <script> var winHeight = $(window).height(); //获取当前页面高度 $(window).resize(function () { var thisHeight = $(this).height(); if (winHeight - thisHeight > 50) { //当软键盘弹出,在这...
  • Android开发_判断手机网络是否可用

    千次阅读 2013-07-12 14:12:01
    * 判断手机网络是否可用 * * @param context * @return */ private boolean isNetworkAvailable() { ConnectivityManager mgr = (ConnectivityManager) getApplicationContext() ....
  • 主要步骤:1、USB连接手机手机打开USB调试模式,小米手机可能还要打开允许通过USB调试修改权限或者模拟点击2、下载ADB,在adb文件目录下运行cmd,调用相应的adb指令即可对手机模拟操作3、在python或其他语言java中...
  • 对于安卓手机和iOS上,分辨率的大小,也存在灵敏度的问题,使用户交互体验一直不太好,后来发现在了vue-touch-events这个插件,可以很轻松的判断用户左右滑动。 使用 安装 npm install --save vue2-touch-events --...
  • 主要js代码如下: 示例一: window.addEventListener("orientationchange", function() { if(window.orientation === 90){ console.log('这是竖屏') } ... // 判断屏幕是否旋转 function orient
  • CSS3判断手机横屏竖屏

    千次阅读 2016-07-07 20:32:25
    监控窗体变化来实现监控手机屏幕横竖 @ media screen and (orientation:portrait) { css [竖向定义样式] } @ media screen and (orientation:landscape) { css [横向定义样式] } 原文链接: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,592
精华内容 16,636
热门标签
关键字:

如何判断手机被监控