Android4.0上添加截屏快捷方式
2013-01-09 16:01
267 查看
拿到Samsung的7寸平板,是3.x系统,在状态栏上多了个截屏按钮,拿到Galaxy Notes 10.1,该功能更是不可删除的添加在状态栏,既然如此,我们今天在我们平板上也添加上该按键,实现简单的快捷截屏功能,而不是按POWER和VOL-进行。
在Android4.0源码的frameworks/base/packages/SystemUI/res/drawable-mdpi/目录下添加ic_sysbar_screenshot.png文件,图片如下:
![](http://s16.sinaimg.cn/middle/3e4774e3gc9cdf0dc67df&690)
该图片的背景是透明的PNG文件。
接下来修改frameworks/base/packages/SystemUI/res/layout-sw600dp/status_bar.xml文件,在
android:layout_width="80dip"
android:layout_height="match_parent"
android:src="@drawable/ic_sysbar_screenshot"
android:contentDescription="@string/accessibility_screenshot"
systemui:glowBackground="@drawable/ic_sysbar_highlight"
/>
接下来修改frameworks/base/packages/SystemUI/res/values/strings.xml文件,添加如下内容:
ScreenShot
至此,重新编译烧录源码,在状态栏上会多出截屏图标,接下来需要继续实现截屏功能,查看了frameworks里的源码,找到了frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java文件里有可参考的片断,故继续修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java文件,相应的添加如下内容:
import android.os.Messenger;
import android.content.ComponentName;
import android.content.ServiceConnection;
在View mRecentButton;后面添加View mScreenshotButton;语句。
在mRecentButton.setOnClickListener(mOnClickListener);后添加如下内容:
mScreenshotButton = mNavigationArea.findViewById(R.id.my_screenshot);
mScreenshotButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mHandler.postDelayed(mScreenshotChordLongPress,
ViewConfiguration.getGlobalActionKeyTimeout());
}
});
接下来在public int getStatusBarHeight() {前添加如下内容:
private final Runnable mScreenshotChordLongPress = new Runnable() {
public void run() {
takeScreenshot();
}
};
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() {
@Override
public 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()) {
@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 = msg.arg2 = 0;
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);
}
}
}
至此,再次编译源码并烧录,截屏功能实现了,现在还存有的是图标的状态处理了,这部分就不说明了。
实现截屏功能时,4.0上既然已实现该功能,那么就直接找源码,确认哪儿有实现,直接拿过来使用,尽量拿来主义,但又不失学习性。
在Android4.0源码的frameworks/base/packages/SystemUI/res/drawable-mdpi/目录下添加ic_sysbar_screenshot.png文件,图片如下:
该图片的背景是透明的PNG文件。
接下来修改frameworks/base/packages/SystemUI/res/layout-sw600dp/status_bar.xml文件,在
android:layout_width="80dip"
android:layout_height="match_parent"
android:src="@drawable/ic_sysbar_screenshot"
android:contentDescription="@string/accessibility_screenshot"
systemui:glowBackground="@drawable/ic_sysbar_highlight"
/>
接下来修改frameworks/base/packages/SystemUI/res/values/strings.xml文件,添加如下内容:
ScreenShot
至此,重新编译烧录源码,在状态栏上会多出截屏图标,接下来需要继续实现截屏功能,查看了frameworks里的源码,找到了frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java文件里有可参考的片断,故继续修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java文件,相应的添加如下内容:
import android.os.Messenger;
import android.content.ComponentName;
import android.content.ServiceConnection;
在View mRecentButton;后面添加View mScreenshotButton;语句。
在mRecentButton.setOnClickListener(mOnClickListener);后添加如下内容:
mScreenshotButton = mNavigationArea.findViewById(R.id.my_screenshot);
mScreenshotButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mHandler.postDelayed(mScreenshotChordLongPress,
ViewConfiguration.getGlobalActionKeyTimeout());
}
});
接下来在public int getStatusBarHeight() {前添加如下内容:
private final Runnable mScreenshotChordLongPress = new Runnable() {
public void run() {
takeScreenshot();
}
};
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() {
@Override
public 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()) {
@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 = msg.arg2 = 0;
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);
}
}
}
至此,再次编译源码并烧录,截屏功能实现了,现在还存有的是图标的状态处理了,这部分就不说明了。
实现截屏功能时,4.0上既然已实现该功能,那么就直接找源码,确认哪儿有实现,直接拿过来使用,尽量拿来主义,但又不失学习性。
相关文章推荐
- Android4.0上添加截屏快捷方式
- android4.0修改launch的屏数和默认显示屏及添加apk包的快捷方式
- Ubuntu中为Eclipse添加桌面启动快捷方式
- 取消快捷方式蓝牙的添加~~~~2010-09-27(一)
- Android桌面添加快捷方式的实现
- Android开发之向桌面添加快捷方式
- android 添加桌面快捷方式
- C#_卸载快捷方式添加(转)
- Android向桌面添加快捷方式,使其指向特定的网页
- Android添加快捷方式
- Ubuntu 下添加OpenERP command 快捷启动方式
- Android 为你的应用程序添加快捷方式【优先级高的快捷方式】
- 在右键添加EXCEL,WORD,PPT快捷方式
- Android编程实现向桌面添加快捷方式的方法
- android添加删除桌面快捷方式
- 通过发送广播来向桌面添加一个快捷方式
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- 为Visual Studio添加一个“编码的UI测试生成器”的快捷方式
- 把网址添加到桌面-在本地创建网站的快捷方式
- Ubuntu中为Eclipse添加桌面启动快捷方式