项目中碰到要求在导航栏上添加截屏按钮的要求,因为正常截屏是在下拉状态栏中,客户截屏操作觉得太麻烦了,所以下面介绍如何实现该功能:
1,首先添加图标到导航栏上,如何添加图标请查询我之前的博客,链接:/lancelots/article/details/82864210
2,实现点击截屏,修改文件为PhoneStatusBar.java,路径frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java.在该文件中,定义点击监听事件,并实现截屏功能
private View.OnClickListener mLenovoClickListener = new View.OnClickListener(){@Overridepublic void onClick(View v) {android.util.Log.d("lei","click capture bitmap");mHandler.post(mScreenshotRunnable);}};final Object mScreenshotLock = new Object();ServiceConnection mScreenshotConnection = null;final Runnable mScreenshotTimeout = new Runnable() {@Override public void run() {synchronized (mScreenshotLock) {if (mScreenshotConnection != null) {mContext.unbindService(mScreenshotConnection);mScreenshotConnection = null;}}}};// Assume this is called from the Handler thread.private void takeScreenshot() {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() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {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()) {@Overridepublic void handleMessage(Message msg) {synchronized (mScreenshotLock) {if (mScreenshotConnection == myConn) {mContext.unbindService(mScreenshotConnection);mScreenshotConnection = null;mHandler.removeCallbacks(mScreenshotTimeout);}}}};msg.replyTo = new Messenger(h);msg.arg1 = msg.arg2 = 0;msg.arg1 = 1;msg.arg2 = 1;try {messenger.send(msg);} catch (RemoteException e) {}}}@Overridepublic void onServiceDisconnected(ComponentName name) {}};if (mContext.bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE, UserHandle.CURRENT)) {mScreenshotConnection = conn;mHandler.postDelayed(mScreenshotTimeout, 10000);}}}private final Runnable mScreenshotRunnable = new Runnable() {@Overridepublic void run() {takeScreenshot();}};private void prepareNavigationBarView() {......mNavigationBarView.getLenovoMiaButton().setOnClickListener(mLenovoClickListener); //设置监听......}
如此这般,截屏功能就实现完毕了~