请问这块手机屏幕是什么接口用的是什么接口

赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
来自&安卓手机
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
来自&安卓手机
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
来自&安卓手机
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
来自&安卓手机
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
赞(<span class="num" id="tips_count_)
loading.......在电子工程世界为您找到如下关于“MIPI接口”的新闻
MIPI接口资料下载
此例程是基于ARM9+SSD2825构架的高清LCD测试程序,可用于测试MIPI_VIDEO和MIPI_command 模式下的WVGA,FWVGA,QHD等高清手机LCM。支持4通道MIPI接口,SSD2825是 晶门科技的高速4通道MIPI传输器。NT35510+HSD463测试程序NOR\\\\EK043LC9001_Test.mcp...
有关MIPI接口的英文资料,供有需要者参考...
rgb转mipi接口应用电路...
Mipi接口的一份使用参考文档...
MIPI接口相关帖子
20PIN(电源和地)
CAMERA接口
1个(可支持200万和500万摄像头)
标准HDMI v1.4,1080p高清分辨率输出
共3个,2个LVDS接口,1个RGB接口
LCD电源开关
1个MIPI接口
1个实时时钟
内部实时时钟,带有后备锂电池座,断电后系统时间不丢失
JTAG接口...
迅为4418开发板:
存储:搭载1G&&DDR3 内存(可选2G),16G emmc存储
核心板:扩展引脚多大320个,实测-20℃到+80℃之间稳定运行
接口:支持全网通4G模块、GPS模块、WIFI模块、千兆以太网、重力加速计、AD、CAMERA接口、MIPI接口、CAN/rs485接口等
接口照片:
核心板设计:
提供1G和2G内存版本,核心板支持电池管理...
我现在有块在手机上拆下来的屏幕,我查了一下,这屏之前是用的2组mipi接口进行通讯的,现在想用fpga把它点亮,我的的开发板是黑金开发板型号EP4CE6F17C8,请问各位坛友,这个可以做到点亮目的吗?如果能,大概步骤是怎样的.
想用fpga驱动手机屏幕 没有资料的就不要玩了吧,得不偿失
[quote][size=2][url=forum.php?mod=redirect&goto...
温度:& && &&&-25℃至+80℃
搭载4418底板:
不止性价比:
01:搭载1G DDR3内存可选2G,16G EMMC存储
02:扩展接口:支持全网通4G模块、GPS模块、WIFI模块、千兆以太网、重力加速计、AD、CAMERA接口、MIPI接口、CAN/RS485接口等
03:六层PCB沉金设计,解决...
Host3路USB Host,支持USB2.0协议TF Card1个标准TF卡接口3G模块中兴3G模组,WCDMA制式4G模块全网通WIFI模块支持GPS模块支持网口千兆以太网接口LCD接口2路LVDS接口, 1路RGB接口MIPI接口1路接MIPI接口的屏幕HDMI接口标准HDMI v1.4,1080p高清分辨率输出接口USB OTG1路USB OTG 2.0RTC座1个多媒体编码支持H.263...
32MDIO 从接口有无5V输入IO164165
芯片官网介绍:
STM32F779STM32F746
STM32F779和STM32F746的对比 除了jpeg其他都没什么,但jpeg硬解码没什么用啊,还不如直接上arm-a系
DPFPU是什么技术
多了MIPI接口(supporting up to 720p 30 Hz ),CPU主频还是坑爹的200M
本人想做STM32驱动mipi接口的液晶模组,分辨率为。同时TP也能正常使用。
模组资料可以全部提供,希望高人来接,项目需在1月底做完,有酬谢!有意者联系QQ,谢谢!
STM32项目外包 mipi接口 那2828可好?
估计只有特别熟悉这块的,才能接啊...
,一个点两个字节,就是150k
当然如果只是用来画几个框、写一些字符这样局部刷新的还好,整屏刷新的话会很慢的
用STM32F4系列好像可以,带MIPI驱动的,目前一般高清的手机屏幕都是MIPI接口
嗯,我现在就是想用STM32驱动mipi屏,写mipi驱动方面的代码是个问题?你以前做过类似的吗?
wsnsyy 发表于
用STM32F4系列好像...
OTG 2.0以太网口10M/100M自适应网口PHONE支持耳机输出MIC支持MIC输入串口2路串口A/D1路User Key5个功能按键通用总线16为数据总线,8为地址总线,片选2位GPIO20PIN(电源和地)CAMERA接口1个(可支持200万和500万摄像头)WIFI接口1个HDMI接口标准HDMI v1.4,1080p高清分辨率输出LCD接口2个MIPI接口1个实时时钟内部实时时钟...
HOST接口*4、USB OTG接口*1&#216;&&MIPI接口*1、Open SDA*1、SD卡接口、TF卡接口、10/100M/1Gbps RJ45接口*1、JTAG接口*1&#216;&&3线TTL电平接口(3个在扩展接口中引出、一个调试串口)、复位按键*1、音频输入/输出接口*1、&#216;&&Boot...
MIPI接口视频
你可能感兴趣的标签
热门资源推荐
&TI 最新应用方案,助力智能开发您现在所在的是:
→ 浏览主题:
* 帖子主题:
文章数:10
年度积分:50
历史总积分:50
注册时间:
请教高手,我有个三菱GT1150-QBBD-C 的触摸屏有三个连接口,分别是;RS-232,RS-422,还有一个是跟手机充电口一样的,我现在要用这个触摸屏与笔记本电脑连接还有与三菱PLC连接,但是我买不到这两根连接线,请问高手指点在哪能买的到这两根线呢,还有买到后应该怎样连接的,要不要下载驱动,谢谢
文章数:5353
年度积分:326
历史总积分:11430
注册时间:
三菱电机活动(三)
寻找英威腾(三)
三菱串口下载线就可以,像手机接口的那个是程序下载口,电子市场上很多的
致力于自动化
伺服 PLC HMI
fumz78 版主
文章数:14437
年度积分:504
历史总积分:29515
注册时间:
2017春节活动(二)
2016论坛优秀版主
2016国庆活动(二)
2015论坛优秀版主
2014论坛优秀版主
晒晒工控小礼品
2012论坛优秀版主
2011论坛贡献奖
2010年论坛优秀版主
08年最佳博客奖
那个迷你的USB接口和232接口可以用来下载程序
另外232口和422口可以用来连接PLC
232接口下载线 FX-232-CAB1 &USB下载线GT09-C30USB-5P(这线用国产的,只要接口对就可以,要装驱动)
和FX的PLC连接线FX-50DU-CAB0
这些线外面很好买的。
三菱 PLC、触摸屏、伺服电机、变频器、数控系统
文章数:10
年度积分:50
历史总积分:50
注册时间:
谢谢大家,下载驱动怎么下的,我在淘宝在买可以吗
fumz78 版主
文章数:14437
年度积分:504
历史总积分:29515
注册时间:
2017春节活动(二)
2016论坛优秀版主
2016国庆活动(二)
2015论坛优秀版主
2014论坛优秀版主
晒晒工控小礼品
2012论坛优秀版主
2011论坛贡献奖
2010年论坛优秀版主
08年最佳博客奖
USB的驱动是编程软件自带的,第一次通过USB电缆插上触摸屏通电后会发现新硬件,安装驱动就可以
三菱 PLC、触摸屏、伺服电机、变频器、数控系统
文章数:39946
年度积分:1506
历史总积分:66098
注册时间:
2016论坛优秀版主
2015论坛优秀版主
2014论坛优秀版主
2014相约国庆
2013论坛优秀版主
2012论坛优秀版主
2011论坛贡献奖
2010年论坛优秀版主
呵呵;与三菱PLC的通讯电缆与老款的F940的线是一样的;
下载电缆可以用F940的线,也可以直接用USB下载线;
工控学堂推荐视频:4917人阅读
Android 进阶(54)
比较好的文章:
http://blog.csdn.net/woshinia/article/details/
手机截屏:
http://www.cnblogs.com/tgyf/p/4655507.html
转载的地方:
http://www.cnblogs.com/tgyf/p/4851092.html
在任何时候点击手机上的浮动小球(红色圈内)就能完成整个屏幕信息的截取功能,而且最终保存的图像还不会包含该小球,这就是本文将要介绍的方法。手机整体屏幕获取项目下载链接:。
  以新的视角实现手机屏幕的截取(快照)功能,文章可能比较长,感兴趣的朋友一定得看完,会有收获的哦!若发现有哪些地方存在问题或某些功能有更好的实现方式,欢迎指点,先谢过(我可以尽快改正或完善,以免继续误导别人)。
  关于手机(或平板,以下描述均以手机表示这两类设备)整体屏幕的截取,有的机型默认设置的方式是同时按下电源键和一个音量键(如华硕、诺基亚等,向下音量键+电源键),有的机型是同时按下电源键和Home键(如苹果)。另外,借助一些辅助工具经过特定的设置也是可以完成屏幕快照的获取。
  从打算开发一个与传统截屏方法不同的截屏应用开始,针对Android手机截屏的基本原理、相关知识及Google最新案例,已经在学习与摸索的途中写过两篇文章了,感兴趣的朋友可以通过下面给出的链接去瞧一瞧(这方面知识掌握较好的可以直接忽略)。
  在Win7+Android Studio环境尝试了网络上晒出的很多方式均失败后,带着受打击的心态写了第一篇文章:
  “Android手机截屏”——。
  当时的目的是希望实现过的大神能给点有用的建议或意见。当然,一般来说Android应用在Android Studio和Eclipse下都是可以实现的,虽不能将项目代码在两者之间直接进行转换,但如若工作量不是特别大,移植起来也不麻烦,尝试过的朋友应该懂得。
  可能对于截屏应用进行学习或者实现的人不太多,笔者并没有得到什么宝贵性的建议。后面不甘心又进行了一番Google,还是没有直截了当的答案,最后决定静下心来老老实实地分析案例源码(案例没有屏幕数据获取与图片保存的实现)。于是就有了第二篇文章:
  “Google最新截屏案例详解”——。
  简单回顾一下:如果只是想得到正在运行的应用程序自身的界面,那相当简单,真正获取界面信息的代码只有两三句,在第一篇文章给出的例子中有提及。由于在旧版本的API中,Google是将手机截屏相关的方法与接口隐藏的,开发者要想自主实现手机完整屏幕的快照,有很多局限性(必须采用System级别的应用开发,或者在Linux下进行Root、源码编译等操作),这部分内容的总结在第二篇文章中。
  大家都知道一些手机厂商会在自家手机发售前定制、预装一些应用,而这些应用APK有些就是System级的(需要通过源码Build)。也就是说不是没有办法利用隐藏的方法或借口实现手机截屏,而是本文将要寻找一种谁都能自己进行实现的方式,包括初学者。
  俗话说事不过三,今天这篇文章就来说说怎么实现轻松自在地、以一种全新的方式进行手机截屏,希望能给人眼前一亮的感觉。
  本文截屏应用的实现思路大致是这样:
  1、抛弃组合快捷键,采用浮动小图标作为截屏按键(类似于360浮动小球,对其思想和详细的实现方式感兴趣的小伙伴可以见另一篇文章:“Android浮动小球与开机自启动”——)。浮动小图标的实现类Service1继承自Service类,这样可以方便地创建只有一个浮动图标按键的布局,在Activity等地方利用startService(Intent
intent)方法开启服务。
  2、由于浮动按键本身不是希望截取的屏幕信息,故在开始截屏后将其隐藏,图像保存后面再使其浮现。
  3、图像保存为PNG格式,路径为手机sdcard的Pictures文件目录下,而系统截屏默认的目录是Screenshots。
  4、浮动小球的优先级为一般应用的最顶层,即除了状态栏下拉列表外,小球总是可见的,这要得益于Service类的性质了。虽然在看电视等环境下会比较不适合,但该设计能让用户随时、方便地截取到想要的屏幕图像。
  5、开机自启动功能虽然保留了,但是因为截屏应用需要得到用户的同意,所以在手机重启后由广播机制自动打开的小球并不能完成截屏,还是需要点击应用图标打开应用以进行截取环境的请求。
  文章开头已经给出整个工程的代码(Android Studio版本),所以在介绍过程中就只给出实现截屏的关键代码,感兴趣的可以下载并自己进行实践。这里再给出链接为:。一切准备就绪,开始吧。
一、截屏请求结果数据共享类ShotApplication
  上面已经提到,屏幕获取需要用户同意,初次运行时会有请求对话框,同意之后才能继续,否则程序会终止。既然需要用户选择后的信息,那在发出截屏请求时就不能用简单的startActivity(Intent intent)方法,而是要用startActivityForResult(Intent intent, intresquestCode)方法。而可恨的是Service类中startActivityForResult(Intent intent, int
resquestCode)方法不可用,确切的说是不存在可供子类重载的onActivityResult(int resquestCode, int resultCode, Intent data) 方法。但现实是Service1类在实现截屏过程中又要用到后面两个返回值(resultCode与data)来构建MediaProjection类的对象。
  可能有人会有疑问,那截屏过程直接在Activity中进行不就可以了吗?没错,是可以。但是问题在于我们需要在任何想截取屏幕的时候就能快速、方便地进行,即需要借助利用Service实现并浮动在一般性应用窗口之上的小球。而在Activity中实现的话就达不到这种效果了,往往能获取的只能是应用本身界面,或者是将其隐藏后的下一层界面,总之做不到想要即可得的效果。
  所以,首要问题是让类Service1的对象能得到这两个数据。另外得注意,Bundle可以完成一般数据的加载并赋给Intent类对象,然后一起发送给目标类,但参数data本身就是Intent类型的。虽然Intent类存在putExtras(Intent src)方法,但为了体现面向对象数据封装的思想,这里采取的是数据共享的思路,利用继承自Application类的子类ShotApplication,然后定义需要共享的成员变量(有些是其他类的对象)。类代码很简单(不包括import
public class ShotApplication extends Application {
private MediaProjectionManager mMediaProjectionM
public int getResult(){
public Intent getIntent(){
public MediaProjectionManager getMediaProjectionManager(){
return mMediaProjectionM
public void setResult(int result1){
this.result = result1;
public void setIntent(Intent intent1){
this.intent = intent1;
public void setMediaProjectionManager(MediaProjectionManager mMediaProjectionManager){
this.mMediaProjectionManager = mMediaProjectionM
}其中MediaProjectionManager类对象在发送截屏请求和构建MediaProjection类对象时均会用到,至于成员值的设置及获取很直观,就不解释了。那么数据的传递就明朗了:先从主程序类MainActivity中存入共享类ShotApplication,然后服务类Service1从共享类ShotApplication中提取出来。
二、主程序类MainActivity所做4件事
  先给出代码(不包括import *),然后分析到底是哪4件事:
public class MainActivity extends ActionBarActivity {
private int result = 0;
private Intent intent =
private int REQUEST_MEDIA_PROJECTION = 1;
private MediaProjectionManager mMediaProjectionM
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMediaProjectionManager = (MediaProjectionManager)getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);
startIntent();
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void startIntent(){
if(intent != null && result != 0){
((ShotApplication)getApplication()).setResult(result);
((ShotApplication)getApplication()).setIntent(intent);
Intent intent = new Intent(getApplicationContext(), Service1.class);
startService(intent);
startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);
((ShotApplication)getApplication()).setMediaProjectionManager(mMediaProjectionManager);
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_MEDIA_PROJECTION) {
if (resultCode != Activity.RESULT_OK) {
}else if(data != null && resultCode != 0){
result = resultC
((ShotApplication)getApplication()).setResult(resultCode);
((ShotApplication)getApplication()).setIntent(data);
Intent intent = new Intent(getApplicationContext(), Service1.class);
startService(intent);
}向用户提出截屏请求的代码就是下面这句:
startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);这正是类MainActivity做的第1件事。当然,在这之前需要获取类MediaProjectionManager实例,代码为:mMediaProjectionManager = (MediaProjectionManager)getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);由于onCreate()方法是应用开启后自动调用的(startIntent随即被调用),所以这一行截屏请求代码也会自动执行。如果是应用安装后第一次开启,那么就会弹出截屏权限允许对话框,需要用户授权。如图:说到这,既可以解释上面提到思路的第5条了,开机自启动后能够开启服务,但不能执行截屏请求操作。原因很简单:一开机就莫名其妙弹出截屏请求对话框不符合用户使用习惯,再者无论是在广播还是服务中调用sratActivityForResult()方法都是不太现实的。  类MainActivity做的第2件事就是将用户操作所返回的值和初始获取的类MediaProjectionManager实例写入数据共享类ShotApplication中了,代码如下:1 //截屏请求对话框用户操作返回数据result和intent
2 ((ShotApplication)getApplication()).setResult(result);
3 ((ShotApplication)getApplication()).setIntent(intent);
4 //类MediaProjectionManager对象mMediaProjectionManager
5 ((ShotApplication)getApplication()).setMediaProjectionManager(mMediaProjectionManager);类MainActivity做的第3件事就是肯定是开启截屏服务了,代码如下: Intent intent = new Intent(getApplicationContext(), Service1.class);
2 startService(intent);
&span style="font-size: 16"& 注意自定义方法startIntent()时在onCreate()方法被调用,其在不同时期作用不同。如果在此次被调用之前用户已经允许过截屏操作,那么直接开启截屏服务;而如果没有允许过,则向用户请求,即做上述第1件事。&/span&&p&&span style="font-size: 16"&  类MainActivity做的第4件事是将自身销毁,之后的控制权就交给服务类Service1的浮动小球(这即是该类整个界面)了。&/span&&/p&&pre name="code" class="html"&1 finish();三、服务类Service1完成整体屏幕截取  终于到了关键的类Service1了,同样先给出代码(不包括import *):public class Service1 extends Service
private LinearLayout mFloatLayout =
private WindowManager.LayoutParams wmParams =
private WindowManager mWindowManager =
private LayoutInflater inflater =
private ImageButton mFloatView =
private static final String TAG = "MainActivity";
private SimpleDateFormat dateFormat =
private String strDate =
private String pathImage =
private String nameImage =
private MediaProjection mMediaProjection =
private VirtualDisplay mVirtualDisplay =
public static int mResultCode = 0;
public static Intent mResultData =
public static MediaProjectionManager mMediaProjectionManager1 =
private WindowManager mWindowManager1 =
private int windowWidth = 0;
private int windowHeight = 0;
private ImageReader mImageReader =
private DisplayMetrics metrics =
private int mScreenDensity = 0;
public void onCreate()
// TODO Auto-generated method stub
super.onCreate();
createFloatView();
createVirtualEnvironment();
public IBinder onBind(Intent intent)
// TODO Auto-generated method stub
private void createFloatView()
wmParams = new WindowManager.LayoutParams();
mWindowManager = (WindowManager)getApplication().getSystemService(getApplication().WINDOW_SERVICE);
wmParams.type = LayoutParams.TYPE_PHONE;
wmParams.format = PixelFormat.RGBA_8888;
wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE;
wmParams.gravity = Gravity.LEFT | Gravity.TOP;
wmParams.x = 0;
wmParams.y = 0;
wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
inflater = LayoutInflater.from(getApplication());
mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_layout, null);
mWindowManager.addView(mFloatLayout, wmParams);
mFloatView = (ImageButton)mFloatLayout.findViewById(R.id.float_id);
mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
mFloatView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
wmParams.x = (int) event.getRawX() - mFloatView.getMeasuredWidth() / 2;
wmParams.y = (int) event.getRawY() - mFloatView.getMeasuredHeight() / 2 - 25;
mWindowManager.updateViewLayout(mFloatLayout, wmParams);
mFloatView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// hide the button
mFloatView.setVisibility(View.INVISIBLE);
Handler handler1 = new Handler();
handler1.postDelayed(new Runnable() {
public void run() {
//start virtual
startVirtual();
Handler handler2 = new Handler();
handler2.postDelayed(new Runnable() {
public void run() {
//capture the screen
startCapture();
Handler handler3 = new Handler();
handler3.postDelayed(new Runnable() {
public void run() {
mFloatView.setVisibility(View.VISIBLE);
//stopVirtual();
Log.i(TAG, "created the float sphere view");
private void createVirtualEnvironment(){
dateFormat = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss");
strDate = dateFormat.format(new java.util.Date());
pathImage = Environment.getExternalStorageDirectory().getPath()+"/Pictures/";
nameImage = pathImage+strDate+".png";
mMediaProjectionManager1 = (MediaProjectionManager)getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);
mWindowManager1 = (WindowManager)getApplication().getSystemService(Context.WINDOW_SERVICE);
windowWidth = mWindowManager1.getDefaultDisplay().getWidth();
windowHeight = mWindowManager1.getDefaultDisplay().getHeight();
metrics = new DisplayMetrics();
mWindowManager1.getDefaultDisplay().getMetrics(metrics);
mScreenDensity = metrics.densityD
mImageReader = ImageReader.newInstance(windowWidth, windowHeight, 0x1, 2); //ImageFormat.RGB_565
Log.i(TAG, "prepared the virtual environment");
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void startVirtual(){
if (mMediaProjection != null) {
Log.i(TAG, "want to display virtual");
virtualDisplay();
Log.i(TAG, "start screen capture intent");
Log.i(TAG, "want to build mediaprojection and display virtual");
setUpMediaProjection();
virtualDisplay();
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void setUpMediaProjection(){
mResultData = ((ShotApplication)getApplication()).getIntent();
mResultCode = ((ShotApplication)getApplication()).getResult();
mMediaProjectionManager1 = ((ShotApplication)getApplication()).getMediaProjectionManager();
mMediaProjection = mMediaProjectionManager1.getMediaProjection(mResultCode, mResultData);
Log.i(TAG, "mMediaProjection defined");
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void virtualDisplay(){
mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror",
windowWidth, windowHeight, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mImageReader.getSurface(), null, null);
Log.i(TAG, "virtual displayed");
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void startCapture(){
strDate = dateFormat.format(new java.util.Date());
nameImage = pathImage+strDate+".png";
Image image = mImageReader.acquireLatestImage();
int width = image.getWidth();
int height = image.getHeight();
final Image.Plane[] planes = image.getPlanes();
final ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride *
Bitmap bitmap = Bitmap.createBitmap(width+rowPadding/pixelStride, height, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
bitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height);
image.close();
Log.i(TAG, "image data captured");
if(bitmap != null) {
File fileImage = new File(nameImage);
if(!fileImage.exists()){
fileImage.createNewFile();
Log.i(TAG, "image file created");
FileOutputStream out = new FileOutputStream(fileImage);
if(out != null){
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(fileImage);
media.setData(contentUri);
this.sendBroadcast(media);
Log.i(TAG, "screen image saved");
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void tearDownMediaProjection() {
if (mMediaProjection != null) {
mMediaProjection.stop();
mMediaProjection =
Log.i(TAG,"mMediaProjection undefined");
private void stopVirtual() {
if (mVirtualDisplay == null) {
mVirtualDisplay.release();
mVirtualDisplay =
Log.i(TAG,"virtual display stopped");
public void onDestroy()
// to remove mFloatLayout from windowManager
super.onDestroy();
if(mFloatLayout != null)
mWindowManager.removeView(mFloatLayout);
tearDownMediaProjection();
Log.i(TAG, "application destroy");
} 由于类Service1中大部分代码和之前文章中给出的相差不大,接下来会先将类中各方法简单罗列一遍,然后更加着重介绍改进的地方。  从onCreate()方法开始,其调用了两个方法:createFloatView()和createVirtualEnvironment();createFloatView()方法负责浮动小球的生成、拖动及其点击事件的响应;createVirtualEnvironment()方法定义截屏所需的变量(包括屏幕信息、图像格式、保存格式等等)。另外,各个方法利用Log日志类输出了运行过程中的状态信息,便于观察代码执行过程。  关键之处就在于对浮动小球点击事件的响应实现,而拖动只是附带的一个辅助功能而已。浮动小球点击事件的响应代码也完成了4件事情,下面一一进行分析。  1、隐藏小球1 mFloatView.setVisibility(View.INVISIBLE); 2、初始化截屏环境public void startVirtual(){
  if (mMediaProjection != null) {
    Log.i(TAG, "want to display virtual");
    virtualDisplay();
  } else {
    Log.i(TAG, "start screen capture intent");
    Log.i(TAG, "want to build mediaprojection and display virtual");
    setUpMediaProjection();
    virtualDisplay();
}可以看出,这个过程先是对MediaProjection类实例mMediaProjection的值进行了判断,若之前没有初始化(即值为null),则调用setUpMediaProjection()方法获取共享数据并对其进行赋值;若已初始化,则直接调用virtualDisplay()方法利用之前定义的变量对截屏环境进行初始化,而真正执行最终操作的方法为createVirtualDisplay()。  3、屏幕截取
截屏环境初始化完成之后,便可以开始获取屏幕信息了,所以接下来调用的是startCapture()方法。该方法的实现和之前不同,也是容易出错的地方在于以下两句代码:int rowPadding = rowStride - pixelStride *
2 Bitmap bitmap = Bitmap.createBitmap(width+rowPadding/pixelStride, height, Bitmap.Config.ARGB_8888);值得注意的是调用方法createBitmap()创建Bitmap对象时所用的第1、3个参数,分别对应于图像的宽度、格式。实现过程中发现,只有将格式设置为ARGB_8888才能获取想要的图像质量;而对于宽度,后面会解释为什么要为其设置偏移值。  4、显示小球mFloatView.setVisibility(View.VISIBLE);四、总结  至于服务类Service1类中的其他代码,以及用于开机自启动服务的广播子类BootBroadcastReceiver这里就不打算介绍了。  下面来看看不同情况下的效果图,这里指的不同情况跟上述创建位图的两个参数有关。  1、图像格式  如果创建位图时用的格式不是ARGB_8888,比如RGB_565,虽然屏幕信息的获取没有问题,但是在将信息转化为图像并保存的过程中出现了严重的偏差。如下图:2、宽度值  之前介绍过调用createBitmap()方法设置其宽度参数时添加了偏移信息,如果不这么做,获取的屏幕截图会出现左边部分缺失的情况(右边会以黑色补全)。如下图:而图像的宽度和格式参数设置正确后的截屏结果图如下:
就职:深信服科技
QQ讨论群:
微信:chenyu_920310}

我要回帖

更多关于 手机屏幕是什么接口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信