转眼毕业也快三年了。最近找不到方向,有点迷茫了。主要是找不到什么事情去做,可能因为自己不是一个愿意主动去学习的人。
闲着也是没事,就把自己接的一些私活的源码分享出来写写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>