转眼毕业也快三年了。最近找不到方向,有点迷茫了。主要是找不到什么事情去做,可能因为自己不是一个愿意主动去学习的人。
闲着也是没事,就把自己接的一些私活的源码分享出来写写blog吧,算是给自己一点活做吧。
言归正传,最近在做的一个私活中某一个功能是广告机(android,已经root了)截屏然后传给其他android/ios设备。因为传输对时间要求不是太高,且适配与android和ios。所以设计的基本思路是: 截屏->转化成png->传输给android/ios;
手里的设备是全志A31S(android 4.2)的机顶盒,截屏转化为png的作都是在机顶盒上。网上关于截屏的代码和分析太多太多,很多也给了源码和分析思路。我这也是沿着前面大牛的道路走下去的,代码也是抄的他们。大家找到的所有关于后台截屏的思路应该就两个:一个是调用android 4.0以上系统的隐藏api :screenshot,一个是调用framebuffer中的数据。这篇文章就先给出调用隐藏api的思路和代码:
后台service提供截屏方法,当机顶盒收到某条消息(类似与广播)调用该service方法。
public class CapturePictureService extends Service {
private Context mContext;
private static final String IMAGE_PATH = "";
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
mContext = this;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
takeScreenShot(IMAGE_PATH);
return super.onStartCommand(intent, flags, startId);
}
public boolean takeScreenShot(String imagePath) {
if (imagePath.equals("")) {
imagePath = Environment.getExternalStorageDirectory()
+ File.separator + "Screenshot.png";
}
Bitmap mScreenBitmap;
WindowManager mWindowManager;
DisplayMetrics mDisplayMetrics;
Display mDisplay;
mWindowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
mDisplay = mWindowManager.getDefaultDisplay();
mDisplayMetrics = new DisplayMetrics();
mDisplay.getRealMetrics(mDisplayMetrics);
float[] dims = { mDisplayMetrics.widthPixels,
mDisplayMetrics.heightPixels };
mScreenBitmap = Surface.screenshot((int) dims[0], (int) dims[1]);
if (mScreenBitmap == null) {
return false;
}
try {
// FileOutputStream out = new FileOutputStream("/mnt/media/test"
// + ".png");
FileOutputStream out = new FileOutputStream(imagePath);
mScreenBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}
上面需要注意的是,需要<uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> 权限,且Surface.screenshot这个api是android隐藏api,所以大家在eclipse中是会报错的,该代码需要在android源码中编译。
在全志提供的源码中4.2和4.4的该接口也是不一样的,4.2是Surface.screenshot((int) dims[0], (int) dims[1]); 4.4是SurfaceControl.screenshot((int) dims[0], (int) dims[1]);(需要用到import android.view.SurfaceControl;)
<p>版权声明:本文为博主原创文章,未经博主允许不得转载。</p>