android系统截屏接口
最近有客户希望它们的apk能够调用系统截屏接口,实现他们的功能。这个需求的实现方案是通过接收客户apk发送的截图广播给SystemUI 调用截图方法takeScreenShot()来实现的,在这里记录一下。
系统截图功能的源码位置在
platform/framework/base/package/SystemUI/src/com/android/systemui/screenhot/GlobalScreenshot.java
具体操作类 –PhoneStatusBar.java
下面写一下具体实现
1.定义一个意图字符串
public static final String
SYSTEM_SHOOT=”com.screenshot.quietly”
2.添加到意图过滤器
filter.addAction(SYSTEMUI_SHOOT);//添加到意图过滤器
3.接收广播
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
…..
else if(SYSTEMUI_SHOOT.equals(action)) {
Log.d("Victor","SYSTEMUI_LEKE_SHOOT: "+action);
String pp=intent.getExtra("pp").toString();//获取用户定义的图片路径
String pn= (intent.getExtra("pn")+".jpg").toString();//图片名
Settings.System.putString(mContext.getContentResolver(),"ssp", pp);
Settings.System.putString(mContext.getContentResolver(),"ssn", pn);
takeScreenShot();//调用此方法做开启服务操作
}
}
4.执行takeScreenShot()
private void takeScreenShot() {
String imageDir=Settings.System.getString(mContext.getContentResolver(), "ssp");
String imageNam=Settings.System.getString(mContext.getContentResolver(), "ssn");
File file=new File(imageDir);
String text=null;
Log.d("Victor","imageDir="+imageDir+ ",imageName="+imageNam);
file.mkdir();
synchronized (mScreenshotLock) {
if (mScreenshotConnection != null) {
return;
}
ComponentName cn = new ComponentName("com.android.systemui", "com.android.systemui.screenshot.TakeScreenshotService");
Intent intent = new Intent();
intent.setComponent(cn);
ServiceConnection conn = new ServiceConnection() {
@Override
Log.d("Victor","onServiceConnected---------");
synchronized (mScreenshotLock) {
if (mScreenshotConnection != this) {
return;
}
Messenger messenger = new Messenger(service);
Message msg = Message.obtain(null, 1);
final ServiceConnection myConn = this;
Handler h = new Handler(mHandler.getLooper()) {
@Override
public void handleMessage(Message msg) {
synchronized (mScreenshotLock) {
if (mScreenshotConnection == myConn) {
mContext.unbindService(mScreenshotConnection);
mScreenshotConnection = null; mHandler.removeCallbacks(mScreenshotTimeout);
}
}
}
};
msg.replyTo = new Messenger(h);
msg.arg1=0;
msg.arg2=1;
try {
messenger.send(msg);
} catch (RemoteException e) {
}
}
}
@Override
public void onServiceDisconnected(ComponentName name) {}
};
if (mContext.bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
mScreenshotConnection = conn;
mHandler.postDelayed(mScreenshotTimeout, 10000);
}
}
}